Universal Router предоставляет гибкий способ работы с маршрутами в приложениях на JavaScript. Одной из ключевых возможностей является возможность инспектирования состояния роутера, что позволяет получать полную информацию о текущем маршруте, параметрах и состоянии приложения. Это особенно важно для динамических приложений, где маршруты могут изменяться в зависимости от контекста, авторизации или других условий.
Для того чтобы получить информацию о текущем маршруте, Universal
Router использует метод resolve. Он возвращает объект,
содержащий результат маршрутизации и данные маршрута.
import UniversalRouter from 'universal-router';
const routes = [
{ path: '/', action: () => 'Главная' },
{ path: '/about', action: () => 'О нас' },
{ path: '/user/:id', action: ({ params }) => `Пользователь ${params.id}` }
];
const router = new UniversalRouter(routes);
async function inspectRoute(path) {
const routeResult = await router.resolve(path);
console.log(routeResult);
}
inspectRoute('/user/42');
В этом примере объект routeResult содержит результат
вызова action и позволяет понять, какой маршрут был выбран
и какие параметры были переданы.
Universal Router строит контекст маршрута, который
передается в каждый обработчик action. Этот контекст
включает:
path — путь запроса.params — объект с параметрами маршрута.query — объект с параметрами query string (если
используется парсер query).route — объект маршрута, который был выбран.parent — родительский маршрут при вложенной
маршрутизации.Контекст можно использовать для инспекции и логирования:
const routes = [
{
path: '/user/:id',
action: (context) => {
console.log('Текущий маршрут:', context.route.path);
console.log('Параметры:', context.params);
return `Пользователь ${context.params.id}`;
}
}
];
Universal Router поддерживает вложенные маршруты, что позволяет строить сложные маршрутизационные деревья. Для инспекции состояния важно понимать, что каждый вложенный маршрут формирует свой контекст и наследует параметры от родителя.
const routes = [
{
path: '/dashboard',
children: [
{ path: '', action: () => 'Главная панель' },
{ path: 'settings', action: () => 'Настройки' },
{ path: 'profile/:id', action: ({ params }) => `Профиль ${params.id}` }
]
}
];
При разрешении /dashboard/profile/7 контекст вложенного
маршрута будет содержать параметры id и ссылку на
родительский маршрут /dashboard. Это позволяет строить
сложные логику проверки состояния, авторизации и динамической подгрузки
данных.
Для детальной инспекции часто необходимо узнать полный путь
маршрута в виде цепочки маршрутов. Это можно сделать,
анализируя объект route и его свойства
parent.
async function getRouteChain(path) {
const context = await router.resolve(path, { context: {} });
const chain = [];
let current = context.route;
while (current) {
chain.unshift(current.path);
current = current.parent;
}
return chain;
}
getRouteChain('/dashboard/profile/7').then(console.log);
// Вывод: ['dashboard', 'profile/:id']
Такая цепочка позволяет отследить все уровни маршрута, что полезно для построения хлебных крошек или динамических навигационных элементов.
Для глубокого анализа состояния маршрутов удобно использовать пользовательские функции логирования. Universal Router позволяет перехватывать контекст на каждом уровне маршрута, что делает возможным:
Пример отладочной функции:
async function logRoute(path) {
const context = await router.resolve(path, {
context: {
log: (message) => console.log(`[ROUTER LOG] ${message}`)
}
});
if (context.log) context.log(`Разрешён маршрут: ${context.route.path}`);
}
Universal Router поддерживает асинхронные action, что
делает инспекцию состояния особенно актуальной при загрузке данных с
сервера. Асинхронные действия позволяют:
{
path: '/user/:id',
async action({ params }) {
const user = await fetchUser(params.id);
return user.name;
}
}
Контекст маршрута здесь может использоваться для логирования этапов загрузки и состояния пользователя.
Инспектирование состояния роутера в Universal Router основывается на
анализе контекста маршрута, объекта route и его параметров.
Оно позволяет:
Эти возможности делают Universal Router удобным инструментом для создания сложных SPA и серверных приложений с динамической маршрутизацией и подробным управлением состоянием.