Маршруты на основе данных позволяют создавать динамическую маршрутизацию, где структура URL и логика обработки запросов формируются на основе входных данных, а не статически определённых путей. В библиотеке Universal Router это достигается за счёт использования функций, возвращающих маршруты, и внедрения асинхронной логики для получения информации, необходимой для построения маршрута.
Ключевым элементом является возможность описания маршрутов не только через строковые пути, но и через объекты с методами, которые могут динамически возвращать следующие маршруты, что обеспечивает гибкость при работе с большими приложениями, API и CMS-системами.
Маршрут может быть представлен в виде функции, возвращающей объект маршрута или массив маршрутов. Это полезно, когда структура маршрутов зависит от данных, получаемых на сервере или из внешнего API.
import UniversalRouter from 'universal-router';
const routes = async () => {
const categories = await fetch('/api/categories').then(res => res.json());
return categories.map(category => ({
path: `/category/${category.slug}`,
action: () => `Страница категории: ${category.name}`
}));
};
const router = new UniversalRouter(await routes());
router.resolve('/category/sports').then(console.log);
Ключевые моменты:
async функций позволяет загружать данные
перед формированием маршрутов.path и
action, как в обычной маршрутизации.Universal Router поддерживает динамические сегменты пути, что позволяет создавать маршруты, содержащие переменные, значения которых определяются на этапе выполнения.
const routes = [
{
path: '/user/:id',
action: ({ params }) => `Пользователь с ID: ${params.id}`
},
{
path: '/user/:id/posts',
action: ({ params }) => `Посты пользователя с ID: ${params.id}`
}
];
Особенности:
:id автоматически извлекается в объект
params.children, позволяя строить древовидную структуру
маршрутов.const routes = [
{
path: '/dashboard',
children: [
{ path: '', action: () => 'Главная панель' },
{ path: 'settings', action: () => 'Настройки' }
]
}
];
Маршруты на основе данных особенно удобны при интеграции с внешними источниками, такими как CMS или REST API. В этом случае структура URL формируется динамически.
const fetchPages = async () => {
const pages = await fetch('/api/pages').then(res => res.json());
return pages.map(page => ({
path: `/${page.slug}`,
action: () => page.content
}));
};
const router = new UniversalRouter(await fetchPages());
Преимущества подхода:
Universal Router предоставляет возможность добавлять условия для
маршрутов, используя функцию action и match в
объекте маршрута. Это позволяет фильтровать или модифицировать маршруты
на основе данных.
const routes = [
{
path: '/product/:id',
action: async ({ params }) => {
const product = await fetch(`/api/products/${params.id}`).then(res => res.json());
if (!product.available) {
return 'Товар недоступен';
}
return `Страница товара: ${product.name}`;
}
}
];
Ключевые моменты:
action позволяет учитывать
состояние данных (например, наличие товара).В больших приложениях часто требуется комбинировать статические и динамические маршруты. Universal Router легко справляется с такой задачей, позволяя задавать массивы маршрутов, где часть маршрутов определяется статически, а часть формируется на основе данных.
const staticRoutes = [
{ path: '/', action: () => 'Главная' },
{ path: '/about', action: () => 'О компании' }
];
const dynamicRoutes = async () => {
const posts = await fetch('/api/posts').then(res => res.json());
return posts.map(post => ({
path: `/posts/${post.slug}`,
action: () => post.title
}));
};
const router = new UniversalRouter([
...staticRoutes,
...(await dynamicRoutes())
]);
Преимущества:
Использование маршрутов на основе данных позволяет реализовать
ленивую загрузку компонентов или страниц, что критично
для больших SPA-приложений. action может возвращать
динамический импорт компонента, снижая размер начальной загрузки.
const routes = [
{
path: '/dashboard',
action: async () => {
const module = await import('./DashboardPage.js');
return module.default;
}
},
{
path: '/profile/:id',
action: async ({ params }) => {
const module = await import('./ProfilePage.js');
return module.default(params.id);
}
}
];
Выводы по методам ленивой загрузки:
action не блокирует основной поток
приложения.routes/users.js,
routes/posts.js.Маршруты на основе данных в Universal Router открывают возможности для гибкой, масштабируемой и динамической маршрутизации, позволяя строить современные веб-приложения с интеграцией внешних источников и оптимизацией загрузки.