Navigo — это лёгкая и мощная библиотека для маршрутизации на стороне клиента в JavaScript. Одной из важных особенностей работы с маршрутизатором является контроль редиректов, чтобы избежать бесконечных циклов или избыточных перенаправлений.
Редиректы в Navigo можно реализовать с помощью метода
navigate(), который программно меняет текущий маршрут. При
этом необходимо учитывать, что частые вызовы navigate() без
проверки могут привести к повторным переходам на один и тот же
маршрут.
Пример простого редиректа:
const router = new Navigo('/');
router.on('/home', () => {
console.log('Home page');
});
router.on('/login', () => {
router.navigate('/home'); // редирект на /home
});
Здесь каждый переход на /login мгновенно перенаправляет
на /home. Без дополнительных условий это может вызвать
цикл, если /home также содержит редирект обратно на
/login.
Для ограничения редиректов часто используют флаг состояния или проверку текущего маршрута перед навигацией.
let redirectInProgress = false;
router.on('/login', () => {
if (!redirectInProgress) {
redirectInProgress = true;
router.navigate('/home');
}
});
Ключевой момент — контроль флага состояния, чтобы переход выполнялся только один раз. После завершения перехода флаг можно сбросить, если ожидаются новые переходы.
В больших приложениях может возникнуть ситуация, когда редиректы идут цепочкой. Чтобы избежать бесконечной последовательности, удобно ограничивать количество редиректов через счётчик:
let redirectCount = 0;
const MAX_REDIRECTS = 3;
router.on('/start', () => {
if (redirectCount < MAX_REDIRECTS) {
redirectCount++;
router.navigate('/step1');
} else {
console.warn('Достигнут лимит редиректов');
}
});
После выполнения перехода счётчик можно сбрасывать, чтобы новая цепочка могла начаться корректно.
Navigo позволяет передавать параметры через URL или через объект
опций при вызове navigate(). Это удобно для контроля
состояния редиректа, без глобальных переменных.
router.on('/step1', ({ query }) => {
const attempts = query.attempts || 0;
if (attempts < 2) {
router.navigate('/step2', { attempts: attempts + 1 });
} else {
console.log('Редиректы ограничены');
}
});
Параметры обеспечивают изоляцию логики редиректов и позволяют создавать безопасные последовательности переходов.
Метод getCurrentLocation() возвращает текущий путь, что
позволяет избежать лишних редиректов на тот же маршрут:
router.on('/dashboard', () => {
const current = router.getCurrentLocation();
if (current !== '/dashboard') {
router.navigate('/dashboard');
}
});
Этот подход особенно полезен при динамических редиректах на основе состояния пользователя или данных сервера.
Navigo поддерживает промежуточные обработчики (before)
для маршрутов, что даёт возможность проверять условия до навигации:
router.on('/profile', () => {
console.log('Профиль пользователя');
}).before((done, params, current) => {
if (!user.isLoggedIn) {
router.navigate('/login');
} else {
done();
}
});
Механизм before позволяет централизованно ограничивать
нежелательные редиректы и добавлять проверки безопасности без изменения
логики каждого маршрута.
Эти техники совместно обеспечивают стабильную и предсказуемую работу маршрутизатора Navigo даже при сложной логике переходов.