В библиотеке Navigo механизм fallback-маршрутов используется для обработки всех URL, которые не совпадают с явно заданными маршрутами. Это позволяет создавать поведение по умолчанию, например, показывать страницу с ошибкой 404 или перенаправлять на главную страницу приложения.
Создание fallback-маршрута осуществляется с помощью метода
notFound экземпляра Navigo:
const router = new Navigo('/', { hash: true });
router.notFound(() => {
document.body.innerHTML = '<h1>Страница не найдена</h1>';
});
В этом примере любой URL, который не зарегистрирован через
on, будет обрабатываться функцией, переданной в
notFound.
Обычные маршруты в Navigo настраиваются через метод
on и сопоставляются с конкретными путями:
router.on('/home', () => {
console.log('Главная страница');
});
Если URL не совпадает ни с одним из зарегистрированных маршрутов, управление передаётся fallback-маршруту. Это обеспечивает централизованное управление ошибками навигации без необходимости проверять каждый маршрут вручную.
В отличие от обычных маршрутов, fallback-маршрут не принимает параметры напрямую, поскольку он вызывается только тогда, когда никакой другой маршрут не подходит. Однако, внутри функции можно получить текущий путь и использовать его для логирования или динамической обработки:
router.notFound(({ url }) => {
console.warn(`Попытка открыть неизвестный путь: ${url}`);
document.body.innerHTML = `<h1>404: ${url} не существует</h1>`;
});
Здесь объект с полем url передаётся в callback, что
позволяет строить более информативные сообщения для пользователей.
Fallback-маршрут можно использовать для перенаправления на другой маршрут. Это особенно удобно для SPA, где нужно автоматически возвращать пользователя на главную страницу или на страницу входа при ошибке:
router.notFound(() => {
router.navigate('/home');
});
Метод navigate позволяет задать путь, на который будет
произведено перенаправление. При этом старый путь остаётся в истории
браузера, что может быть удобно для аналитики и логирования.
В некоторых случаях требуется более гибкая логика fallback-маршрута. Например, различать ошибки в зависимости от протокола или поддомена:
router.notFound(({ url }) => {
if (url.startsWith('/admin')) {
router.navigate('/admin/login');
} else {
document.body.innerHTML = '<h1>Страница не найдена</h1>';
}
});
Такой подход позволяет объединять маршрутизацию с бизнес-логикой приложения без дублирования кода в каждом маршруте.
Важно регистрировать fallback-маршрут после всех основных
маршрутов, чтобы он не перекрывал их. Navigo проверяет маршруты
в том порядке, в котором они были добавлены. Если notFound
вызвать до on, все запросы будут сразу попадать в
fallback.
router.on('/about', () => {
console.log('О нас');
});
router.notFound(() => {
document.body.innerHTML = '<h1>404: Страница не найдена</h1>';
});
При использовании опции hash: true в Navigo,
fallback-маршрут срабатывает для всех несуществующих хэш-путей:
const router = new Navigo('/', { hash: true });
router.on('/profile', () => {
console.log('Профиль пользователя');
});
router.notFound(({ url }) => {
document.body.innerHTML = `<h1>404: ${url}</h1>`;
});
Если пользователь введёт #settings, а маршрута
/settings нет, callback fallback-маршрута будет вызван с
url = '/settings'.
notFound.Fallback-маршрут в Navigo — это мощный инструмент для обеспечения устойчивости SPA и централизованного управления ошибками навигации. Он обеспечивает гибкость, безопасность и удобство для пользователя без дублирования кода маршрутов.