Navigo предоставляет гибкий и лаконичный механизм для управления навигацией в одностраничных приложениях (SPA). Одним из ключевых аспектов маршрутизации является корректная обработка несуществующих маршрутов, которые пользователь может ввести вручную или перейти по устаревшей ссылке.
В Navigo для обработки всех URL, не соответствующих
зарегистрированным маршрутам, используется метод
notFound(). Этот метод позволяет задать функцию-обработчик,
которая сработает, если ни один из маршрутов не совпал с текущим
адресом.
Пример базового использования:
import Navigo from 'navigo';
const router = new Navigo('/');
router
.on('/home', () => {
console.log('Главная страница');
})
.on('/about', () => {
console.log('О нас');
})
.notFound(() => {
console.log('Маршрут не найден');
});
router.resolve();
Ключевые моменты:
notFound() должен быть вызван после регистрации всех
существующих маршрутов.notFound(), не принимает
аргументов, но внутри неё можно получать текущий URL через
router.lastRouteResolved() или
window.location.pathname.Можно использовать информацию о текущем URL для динамического рендеринга страницы ошибки или перенаправления:
router.notFound((query) => {
const currentPath = window.location.pathname;
document.body.innerHTML = `<h1>404</h1><p>Страница "${currentPath}" не найдена.</p>`;
});
Особенность в том, что window.location.pathname отражает
путь после домена и соответствует тому, что видит пользователь в
адресной строке. Это позволяет выводить подробные сообщения об
ошибке, включая конкретный путь, который не найден.
Вместо отображения статичной ошибки часто используют автоматическое перенаправление на безопасный маршрут, например на главную страницу или страницу поиска:
router.notFound(() => {
router.navigate('/home');
});
Здесь метод navigate() инициирует повторное разрешение
маршрутов, и пользователь оказывается на корректной странице без
необходимости ручного ввода URL. Такой подход особенно полезен в
приложениях с частыми изменениями структуры маршрутов.
Даже если приложение использует динамические маршруты с параметрами
(:id, :slug), notFound() будет
срабатывать для полностью несуществующих путей. Например:
router
.on('/posts/:id', (params) => {
console.log(`Пост с id=${params.id}`);
})
.notFound(() => {
document.body.innerHTML = '<h1>404</h1><p>Такой пост не найден.</p>';
});
Если пользователь введет /posts/123, маршрут будет
обработан корректно. Если же путь /posts/abc/extra не
соответствует ни одному шаблону, вызовется notFound().
Важно: Навигация с неправильными параметрами (например, ID, которого нет в базе) не считается несущестующим маршрутом с точки зрения Navigo. Для такой проверки нужно реализовать дополнительную валидацию внутри обработчика маршрута.
Для крупных приложений можно комбинировать несколько подходов:
notFound()
при некорректных данных.Пример:
router.notFound(() => {
const invalidPath = window.location.pathname;
fetch('/log-404', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ path: invalidPath })
});
router.navigate('/home');
});
Navigo использует History API для маршрутизации без
перезагрузки страницы. Для корректной работы notFound()
следует учитывать, что при прямом переходе по несуществующему URL через
адресную строку сервер должен отдавать главный HTML файл
приложения, иначе браузер покажет стандартную серверную 404
ошибку.
Таким образом, обработка несущестующих маршрутов в Navigo тесно связана с настройкой сервера и поддержкой SPA. Это позволяет:
Хотите, я могу сделать следующую статью про перехват и валидацию параметров маршрутов в Navigo, чтобы показать, как избежать логических 404 на корректных URL?