В Page.js маршруты можно регистрировать не только статически, при инициализации приложения, но и динамически в процессе работы программы. Динамическая регистрация особенно полезна для больших SPA-приложений, где часть маршрутов загружается только при необходимости, либо формируется на основе данных с сервера или пользовательских прав.
Маршруты можно добавлять в любой момент с помощью функции
page(path, callback). Пример динамической регистрации:
// Изначально приложение без маршрутов
page.start();
// Добавляем маршрут по событию
document.getElementById('loadProfileBtn').addEventListener('click', () => {
page('/profile', (ctx) => {
console.log('Маршрут профиля загружен');
renderProfile(ctx.params.userId);
});
});
В этом примере маршрут /profile появляется только после
нажатия на кнопку. Это позволяет экономить ресурсы и загружать
обработчики только по необходимости.
Для динамического добавления большого числа маршрутов удобно хранить их в массиве объектов и регистрировать циклом:
const routes = [
{ path: '/', handler: homePage },
{ path: '/about', handler: aboutPage },
{ path: '/contact', handler: contactPage }
];
routes.forEach(route => page(route.path, route.handler));
page();
Такой подход облегчает поддержку приложения: можно легко добавлять, изменять или удалять маршруты без переписывания основного кода.
Часто маршруты зависят от данных, полученных с сервера. В этом случае можно регистрировать их после получения ответа:
fetch('/api/pages')
.then(res => res.json())
.then(pages => {
pages.forEach(pageData => {
page(`/page/${pageData.slug}`, (ctx) => {
loadPageContent(pageData.id);
});
});
page();
});
Маршруты создаются автоматически на основе массива объектов с сервера. Это позволяет строить динамическую структуру сайта без ручного указания всех путей.
Page.js предоставляет несколько инструментов для управления маршрутами:
page.show(path) — переход на маршрут программно. Можно
использовать для динамически добавленных маршрутов.page.redirect(from, to) — перенаправление с одного пути
на другой, включая маршруты, добавленные динамически.page('*', handler) — глобальный обработчик для всех
маршрутов, включая вновь добавленные.Пример использования глобального обработчика для логирования:
page('*', (ctx, next) => {
console.log('Переход на маршрут:', ctx.path);
next();
});
Page.js не имеет встроенной функции удаления маршрута после регистрации, однако можно реализовать обходной путь через фильтрацию обработчиков:
const registeredRoutes = [];
function addRoute(path, handler) {
const wrappedHandler = (ctx, next) => handler(ctx, next);
registeredRoutes.push({ path, handler: wrappedHandler });
page(path, wrappedHandler);
}
// Для "удаления" маршрута можно пересоздать все маршруты заново без нужного
function removeRoute(pathToRemove) {
page.stop();
registeredRoutes
.filter(r => r.path !== pathToRemove)
.forEach(r => page(r.path, r.handler));
page.start();
}
Этот подход позволяет гибко управлять маршрутизацией даже в больших SPA с условными маршрутами.
Для минимизации начальной загрузки приложения обработчики маршрутов
можно подгружать динамически с использованием import():
page('/dashboard', async (ctx) => {
const module = await import('./dashboard.js');
module.renderDashboard(ctx);
});
Такой метод особенно полезен в сочетании с динамической регистрацией маршрутов на основе пользовательских прав или роли.
Ключевые сценарии:
Динамическая регистрация маршрутов обеспечивает гибкость и масштабируемость архитектуры приложения, снижая нагрузку на начальную загрузку и облегчая поддержку кода.