Vue Router предоставляет мощный механизм для отслеживания и управления навигацией между маршрутами в приложении. Одним из важных аспектов разработки является логирование навигационных событий, которое позволяет анализировать поведение пользователей, выявлять ошибки и отлаживать переходы между страницами.
Vue Router поддерживает глобальные хуки навигации, которые срабатывают при каждой попытке изменения маршрута. Основные хуки:
beforeEach(to, from, next) — вызывается перед каждым
переходом.afterEach(to, from) — вызывается после успешного
перехода.Пример логирования всех переходов:
import { createRouter, createWebHistory } from 'vue-router';
import Home from './components/Home.vue';
import About from './components/About.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About },
];
const router = createRouter({
history: createWebHistory(),
routes,
});
router.beforeEach((to, from, next) => {
console.log(`[Navigation Start] От: ${from.fullPath} К: ${to.fullPath}`);
next();
});
router.afterEach((to, from) => {
console.log(`[Navigation End] От: ${from.fullPath} К: ${to.fullPath}`);
});
export default router;
В этом примере каждый переход между маршрутами фиксируется в консоли.
beforeEach позволяет логировать начальную точку навигации,
а afterEach — успешное завершение перехода.
Vue Router также предоставляет возможность отслеживать ошибки
навигации через промисы router.push() и
router.replace():
router.push('/about')
.then(() => {
console.log('Переход выполнен успешно');
})
.catch((err) => {
if (err.name !== 'NavigationDuplicated') {
console.error('Ошибка навигации:', err);
}
});
Важно различать ошибки повторной навигации
(NavigationDuplicated) и реальные сбои перехода.
Игнорирование повторных переходов предотвращает лишние сообщения в
логах.
Каждый маршрут может содержать локальные хуки в компонентах, такие
как beforeRouteEnter, beforeRouteUpdate,
beforeRouteLeave. Эти хуки полезны для логирования событий,
связанных с конкретным компонентом:
export default {
beforeRouteEnter(to, from, next) {
console.log(`Компонент загружается. Переход из ${from.fullPath} в ${to.fullPath}`);
next();
},
beforeRouteLeave(to, from, next) {
console.log(`Компонент покидается. Переход из ${from.fullPath} в ${to.fullPath}`);
next();
}
};
beforeRouteEnter вызывается до монтирования компонента,
что позволяет анализировать переходы еще до отображения нового контента.
beforeRouteLeave фиксирует момент, когда пользователь
покидает текущую страницу.
Для более сложного логирования часто используют внешние сервисы: Sentry, LogRocket или собственный сервер аналитики. Для отправки данных достаточно обернуть логи в соответствующие функции:
router.afterEach((to, from) => {
sendNavigationData({
from: from.fullPath,
to: to.fullPath,
timestamp: Date.now()
});
});
function sendNavigationData(payload) {
fetch('/api/navigation-log', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
}
Такой подход позволяет отслеживать переходы пользователей в реальном времени и анализировать статистику посещений.
Каждый маршрут в Vue Router может содержать объект meta,
который позволяет хранить дополнительную информацию, например, название
страницы или категорию события для логирования:
const routes = [
{ path: '/', component: Home, meta: { title: 'Главная' } },
{ path: '/about', component: About, meta: { title: 'О нас' } },
];
router.afterEach((to) => {
console.log(`Посещена страница: ${to.meta.title || to.path}`);
});
Использование метаданных упрощает идентификацию страниц при анализе логов и улучшает читаемость отчетов.
При работе с динамическими или ленивыми компонентами логирование может быть расширено для отслеживания загрузки данных:
router.beforeEach(async (to, from, next) => {
console.log(`Подготовка перехода на ${to.fullPath}`);
if (to.meta.requiresData) {
try {
await fetchDataForRoute(to);
console.log(`Данные загружены для ${to.fullPath}`);
next();
} catch (error) {
console.error(`Ошибка загрузки данных для ${to.fullPath}`, error);
next(false);
}
} else {
next();
}
});
async function fetchDataForRoute(route) {
// эмуляция асинхронной загрузки
return new Promise((resolve) => setTimeout(resolve, 500));
}
Такой подход позволяет логировать не только факт навигации, но и состояние данных, необходимых для корректного отображения компонента.
console.log в продакшене напрямую;
лучше применять обертки, которые можно отключить через переменные
окружения.Логирование навигации в Vue Router становится эффективным инструментом для анализа поведения пользователей, отладки и мониторинга производительности приложения. Оно позволяет фиксировать события на глобальном уровне, внутри компонентов и при взаимодействии с асинхронными данными, обеспечивая полный контроль над процессом навигации.