Одной из наиболее частых ошибок является некорректная инициализация экземпляра Navigo. Например:
const router = new Navigo(); // ❌ без указания корня маршрутов
Если проект размещается не в корне сайта, важно передать базовый путь:
const router = new Navigo('/app/', { hash: true });
Ключевые моменты:
hash: true переводит маршрутизацию в hash mode,
что полезно при работе на статических серверах без настройки URL
rewrite.Когда одновременно используются статические и динамические маршруты, Navigo может неправильно сопоставлять URL. Пример:
router
.on('/about', () => console.log('About'))
.on('/:page', (params) => console.log(params.page));
Проблема: при переходе на /about вызывается обработчик
динамического маршрута, а не статический.
Решение: использовать приоритет маршрутов, регистрируя статические раньше динамических или используя регулярные выражения:
router
.on('/about', () => console.log('About'))
.on('/:page(?!about)', (params) => console.log(params.page));
Ключевые моменты:
Если изменяется адрес в браузере без вызова Navigo
(router.navigate), маршрутизатор может не отрабатывать
обработчик.
// Проблема
window.location.href = '/contact'; // Navigo не отрабатывает
Решение: использовать встроенный метод
router.resolve() после изменения URL:
window.history.pushState({}, '', '/contact');
router.resolve();
Ключевые моменты:
router.resolve() проверяет текущий URL и вызывает
соответствующий обработчик.Динамические маршруты позволяют получать параметры, но часто возникает ошибка при ожидании вложенных параметров:
router.on('/user/:id/profile/:section', (params) => {
console.log(params.id, params.section);
});
Если URL /user/123/profile — params.section
будет undefined.
Решение: предусматривать обязательные и
необязательные параметры через ? или регулярные
выражения:
router.on('/user/:id/profile/:section?', (params) => {
console.log(params.id, params.section || 'overview');
});
Ключевые моменты:
?.При включенном hash-mode URL имеет вид /#/path, а без
него — /path. Часто разработчики смешивают подходы.
Проблемы:
Решение:
hash: true.const router = new Navigo('/', { hash: false });
Ключевые моменты:
Navigo не дожидается завершения асинхронного кода по умолчанию, что может привести к гонке данных:
router.on('/data', async () => {
const response = await fetch('/api/data');
const json = await response.json();
console.log(json);
});
Если сразу после router.navigate('/data') выполняется
другой код, данные могут быть еще не загружены.
Решение: использовать промисы или
async/await корректно и учитывать состояния загрузки:
router.on('/data', async () => {
try {
const response = await fetch('/api/data');
const json = await response.json();
renderData(json);
} catch (error) {
console.error('Ошибка загрузки данных', error);
}
});
Ключевые моменты:
router.navigate.Иногда ссылки <a> ведут на новые страницы,
игнорируя Navigo, если не перехватывать событие click:
<a href="/about">О нас</a>
Решение: использовать событие click для
вызова router.navigate:
document.querySelectorAll('a').forEach(link => {
link.addEventListener('click', (e) => {
e.preventDefault();
router.navigate(link.getAttribute('href'));
});
});
Ключевые моменты:
e.preventDefault() предотвращает стандартную
навигацию.router.navigate().Эти решения покрывают большинство типичных ошибок при работе с Navigo, включая инициализацию, конфликты маршрутов, работу с параметрами и асинхронный код, а также вопросы интеграции с History API и hash-mode. Правильная структура маршрутов и контроль переходов позволяют строить стабильные и предсказуемые одностраничные приложения.