Universal Router — это легковесная и гибкая библиотека маршрутизации для JavaScript, которая позволяет строить маршруты на основе объектов и асинхронных функций. Одной из важных возможностей при построении сложных приложений является логирование переходов, которое помогает отслеживать навигацию, отлаживать маршруты и анализировать поведение пользователя.
В Universal Router логирование можно реализовать несколькими способами:
router.resolve(context) результат можно использовать для
записи информации в лог:import UniversalRouter from 'universal-router';
const routes = [
{ path: '/', action: () => 'Главная' },
{ path: '/about', action: () => 'О сайте' },
];
const router = new UniversalRouter(routes);
async function navigate(path) {
const result = await router.resolve({ pathname: path });
console.log(`[LOG] Переход на ${path}: результат = ${result}`);
}
navigate('/');
navigate('/about');
В этом примере лог фиксирует не только путь, но и результат действия маршрута.
const logger = async (context, next) => {
console.log(`[LOG] Начало обработки пути: ${context.pathname}`);
const result = await next();
console.log(`[LOG] Конец обработки пути: ${context.pathname}`);
return result;
};
const routes = [
{ path: '/', action: () => 'Главная' },
{ path: '/profile', action: () => 'Профиль' },
];
const router = new UniversalRouter(routes, { context: {}, resolveRoute: logger });
router.resolve({ pathname: '/profile' });
Здесь logger действует как промежуточный слой, позволяя
логировать до и после выполнения маршрута. Такой подход особенно полезен
для отладки цепочек маршрутов и асинхронных переходов.
try/catch или через глобальные обработчики промисов. Это
позволяет отслеживать невалидные переходы:async function navigate(path) {
try {
const result = await router.resolve({ pathname: path });
console.log(`[LOG] Успешный переход на ${path}: ${result}`);
} catch (error) {
console.error(`[ERROR] Ошибка перехода на ${path}: ${error.message}`);
}
}
navigate('/nonexistent');
Использование такого подхода обеспечивает комплексное логирование как успешных переходов, так и ошибок.
Universal Router поддерживает передачу объекта context,
который доступен на всех этапах маршрутизации. С его помощью можно
хранить данные о переходах, пользователях, параметрах URL и времени
перехода:
const routes = [
{
path: '/dashboard',
action: ({ context }) => {
context.logs.push(`Переход на /dashboard в ${new Date().toISOString()}`);
return 'Панель управления';
},
},
];
const context = { logs: [] };
const router = new UniversalRouter(routes);
router.resolve({ pathname: '/dashboard', context }).then(result => {
console.log('Результат:', result);
console.log('Логи переходов:', context.logs);
});
Такой подход позволяет аккумулировать историю навигации внутри одного контекста и использовать её для аналитики или отладки.
Universal Router поддерживает динамические сегменты URL, что делает логирование параметров особенно важным:
const routes = [
{ path: '/user/:id', action: ({ params }) => `Профиль пользователя ${params.id}` },
];
const router = new UniversalRouter(routes);
router.resolve({ pathname: '/user/42' }).then(result => {
console.log(`[LOG] Переход на /user/:id, params:`, { id: 42, result });
});
Выделение параметров в лог позволяет не только видеть путь, но и конкретные значения, передаваемые в маршрут.
Для крупных приложений логирование через console.log
может быть недостаточно. Universal Router легко интегрируется с такими
инструментами, как:
Пример интеграции с Sentry:
import * as Sentry from '@sentry/browser';
const routes = [
{ path: '/checkout', action: () => 'Страница оплаты' },
];
const router = new UniversalRouter(routes);
router.resolve({ pathname: '/checkout' }).catch(error => {
Sentry.captureException(error);
});
Такой подход обеспечивает централизованное хранение логов и ошибок, что критично для production-окружений.
params, чтобы логи были информативными.Логирование переходов в Universal Router является мощным инструментом для контроля работы приложения, отладки маршрутов и анализа пользовательской активности. Правильная организация логов повышает прозрачность навигации и облегчает сопровождение сложных SPA и серверных приложений.