В библиотеке Universal Router маршруты могут определяться как статически, так и динамически. Динамическая генерация маршрутов позволяет создавать маршруты на лету, в зависимости от состояния приложения, данных с сервера или пользовательских параметров. Это особенно актуально для сложных SPA, где набор доступных страниц может изменяться во время работы приложения.
Динамический маршрут в Universal Router создаётся с использованием
функции routes, которая возвращает массив объектов
маршрутов. Каждый объект маршрута имеет свойства:
path — путь маршрута, может содержать параметры
(/user/:id).action — функция, вызываемая при совпадении
маршрута.children — вложенные маршруты, также могут
генерироваться динамически.Пример динамического создания маршрутов:
import UniversalRouter from 'universal-router';
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
];
const router = new UniversalRouter({
async resolveRoute(context) {
if (context.pathname.startsWith('/user/')) {
const id = parseInt(context.pathname.split('/')[2], 10);
const user = users.find(u => u.id === id);
if (user) {
return `Профиль пользователя: ${user.name}`;
}
}
},
routes: async () => {
return users.map(user => ({
path: `/user/${user.id}`,
action: () => `Динамический маршрут для ${user.name}`
}));
}
});
В этом примере массив пользователей используется для генерации маршрутов. Такой подход позволяет легко масштабировать приложение при увеличении количества сущностей.
Universal Router поддерживает динамические сегменты в пути
(:param). При динамическом создании маршрутов важно
правильно сопоставлять параметры:
const router = new UniversalRouter({
routes: [
{
path: '/posts/:postId',
action: ({ params }) => {
return `Пост с ID: ${params.postId}`;
}
}
]
});
Динамическая генерация позволяет создавать несколько маршрутов с одинаковой структурой, но разными значениями параметров, без необходимости писать их вручную.
Вложенные маршруты создаются через свойство children.
При динамическом формировании это может быть функцией, возвращающей
массив маршрутов:
const router = new UniversalRouter({
routes: [
{
path: '/categories',
children: async () => {
const categories = await fetchCategories();
return categories.map(cat => ({
path: `${cat.id}`,
action: () => `Категория: ${cat.name}`
}));
}
}
]
});
Такой подход позволяет:
Universal Router поддерживает асинхронные функции в
action и routes. Контекст context
передаётся во все уровни маршрута и содержит ключевые свойства:
pathname — текущий путь.query — объект с параметрами запроса.baseUrl — базовый путь для вложенных маршрутов.router — экземпляр роутера, что позволяет использовать
рекурсивный вызов.Пример асинхронного маршрута:
const router = new UniversalRouter({
routes: [
{
path: '/products/:id',
async action({ params }) {
const product = await fetchProductById(params.id);
return product ? `Товар: ${product.name}` : 'Товар не найден';
}
}
]
});
Асинхронная генерация маршрутов особенно полезна для приложений с большим количеством сущностей, когда маршруты невозможно определить заранее.
Universal Router позволяет динамически добавлять и обновлять маршруты
во время работы приложения. Для этого можно использовать функцию
router.resolve с новым контекстом или пересоздавать
маршруты:
async function updateRoutes() {
const newRoutes = await fetchNewRoutes();
router.root = { routes: newRoutes };
}
router.resolve('/new-path');
Таким образом, можно изменять маршруты без перезагрузки страницы, интегрируя маршрутизацию с реальным состоянием приложения.
routes и
action делают маршрутизацию гибкой.Эти принципы обеспечивают мощную, масштабируемую и гибкую маршрутизацию в любых современных JavaScript-приложениях.