Метаданные маршрута — это произвольная дополнительная информация, привязанная к конкретному маршруту. В библиотеке Navigo они позволяют расширять базовую логику роутинга, добавляя контекст: права доступа, заголовки страниц, описание, флаги поведения и любые пользовательские параметры.
Каждый маршрут может содержать объект с метаданными, который передаётся вместе с обработчиком и становится доступным в момент активации маршрута.
В Navigo маршрут можно описывать не только функцией, но и объектом конфигурации. Именно этот формат позволяет добавлять метаданные:
const router = new Navigo('/');
router.on({
'/dashboard': {
uses: () => {
console.log('Dashboard loaded');
},
as: 'dashboard',
hooks: {},
meta: {
requiresAuth: true,
title: 'Панель управления'
}
}
}).resolve();
Ключевые элементы:
uses — обработчик маршрутаas — имя маршрутаhooks — жизненный цикл маршрутаmeta — объект метаданныхМетаданные передаются через объект match, который
доступен в обработчике:
router.on({
'/profile': {
uses: (match) => {
console.log(match.route.meta);
},
meta: {
requiresAuth: true,
title: 'Профиль пользователя'
}
}
});
Структура доступа:
match.route.meta
Это позволяет использовать метаданные прямо в логике маршрута.
router.on({
'/admin': {
uses: (match) => {
if (match.route.meta.requiresAuth && !isLoggedIn()) {
router.navigate('/login');
return;
}
renderAdmin();
},
meta: {
requiresAuth: true
}
}
});
Метаданные выступают в роли декларативного слоя, отделяя конфигурацию от логики.
router.on({
'/about': {
uses: (match) => {
document.title = match.route.meta.title;
renderAbout();
},
meta: {
title: 'О компании'
}
}
});
Позволяет централизованно управлять заголовками без дублирования.
router.on({
'/blog': {
uses: (match) => {
setMetaDescription(match.route.meta.description);
renderBlog();
},
meta: {
description: 'Последние статьи и новости'
}
}
});
router.on({
'/gallery': {
uses: (match) => {
applyTransition(match.route.meta.transition);
renderGallery();
},
meta: {
transition: 'fade'
}
}
});
Navigo поддерживает хуки жизненного цикла маршрута
(before, after, leave).
Метаданные можно использовать и там:
router.on({
'/settings': {
uses: () => {
renderSettings();
},
hooks: {
before: (done, match) => {
if (match.route.meta.requiresAuth && !isLoggedIn()) {
router.navigate('/login');
return;
}
done();
}
},
meta: {
requiresAuth: true
}
}
});
Хуки позволяют реализовать переиспользуемую логику, не загромождая основной обработчик.
Вместо дублирования логики в каждом маршруте, можно вынести обработку метаданных в обёртку:
function handleRoute(handler) {
return (match) => {
const meta = match.route.meta || {};
if (meta.requiresAuth && !isLoggedIn()) {
router.navigate('/login');
return;
}
if (meta.title) {
document.title = meta.title;
}
handler(match);
};
}
Применение:
router.on({
'/dashboard': {
uses: handleRoute(() => {
renderDashboard();
}),
meta: {
requiresAuth: true,
title: 'Dashboard'
}
}
});
Метаданные работают и с параметризованными маршрутами:
router.on({
'/user/:id': {
uses: (match) => {
const { id } = match.data;
console.log(match.route.meta.section);
renderUser(id);
},
meta: {
section: 'user-profile'
}
}
});
Параметры (match.data) и метаданные
(match.route.meta) используются независимо, но дополняют
друг друга.
Navigo не поддерживает наследование маршрутов «из коробки», но можно реализовать его вручную:
const authMeta = {
requiresAuth: true
};
router.on({
'/orders': {
uses: renderOrders,
meta: {
...authMeta,
title: 'Заказы'
}
},
'/cart': {
uses: renderCart,
meta: {
...authMeta,
title: 'Корзина'
}
}
});
Такой подход уменьшает дублирование и делает конфигурацию чище.
Поскольку meta — это произвольный объект, полезно
вводить соглашения или проверки:
function validateMeta(meta) {
if (meta.requiresAuth && typeof meta.requiresAuth !== 'boolean') {
throw new Error('requiresAuth должен быть boolean');
}
}
Использование:
router.on({
'/secure': {
uses: (match) => {
validateMeta(match.route.meta);
renderSecure();
},
meta: {
requiresAuth: true
}
}
});
Иногда требуется хранить общие значения:
const globalMeta = {
appName: 'My App'
};
Использование внутри маршрута:
router.on({
'/home': {
uses: (match) => {
document.title = `${match.route.meta.title} | ${globalMeta.appName}`;
},
meta: {
title: 'Главная'
}
}
});
Для диагностики удобно выводить структуру маршрута:
router.on({
'/test': {
uses: (match) => {
console.log('Route:', match.route);
console.log('Meta:', match.route.meta);
},
meta: {
debug: true
}
}
});
meta — это полностью
пользовательская логикаХорошая практика — придерживаться единого формата:
meta: {
requiresAuth: false,
title: '',
description: '',
layout: 'default',
transition: 'none'
}
Чёткая структура облегчает поддержку и масштабирование приложения.
Можно реализовать цепочку обработчиков:
const middlewares = [
(match) => {
if (match.route.meta.requiresAuth && !isLoggedIn()) {
router.navigate('/login');
return false;
}
},
(match) => {
if (match.route.meta.title) {
document.title = match.route.meta.title;
}
}
];
function applyMiddlewares(handler) {
return (match) => {
for (const mw of middlewares) {
if (mw(match) === false) return;
}
handler(match);
};
}
Использование:
router.on({
'/profile': {
uses: applyMiddlewares(() => {
renderProfile();
}),
meta: {
requiresAuth: true,
title: 'Профиль'
}
}
});
Метаданные можно связывать с глобальным состоянием:
router.on({
'/theme': {
uses: (match) => {
setTheme(match.route.meta.theme);
},
meta: {
theme: 'dark'
}
}
});
Метаданные в Navigo формируют слой декларативной конфигурации маршрутов, позволяя:
Гибкость meta делает его мощным инструментом при
построении сложных SPA-приложений.