Для начала работы с Navigo необходимо установить библиотеку. В современных проектах на основе npm это делается командой:
npm install navigo
Если проект не использует сборщики, библиотеку можно подключить напрямую через CDN:
<script src="https://unpkg.com/navigo@8.11.1/lib/navigo.min.js"></script>
После подключения создается экземпляр роутера. Навигация в
Navigo строится вокруг объекта Navigo,
которому передается базовый путь приложения:
const router = new Navigo('/', { hash: true });
Параметры конструктора:
root – корневой путь приложения. По
умолчанию '/'.useHash – если true,
роутинг использует хеши (#) в URL.linksSelector – CSS-селектор ссылок
для автоматической перехватки кликов.Маршруты задаются методом .on(), который принимает два
типа аргументов:
Пример базового маршрута:
router.on('/home', function () {
document.body.innerHTML = '<h1>Главная страница</h1>';
});
Поддерживаются динамические сегменты URL, обозначаемые двоеточием:
router.on('/user/:id', function (params) {
document.body.innerHTML = `<h1>Профиль пользователя: ${params.id}</h1>`;
});
Здесь объект params автоматически содержит значения
динамических сегментов.
Для крупных приложений удобна группировка маршрутов с помощью метода
.on() с объектом:
router.on({
'/about': () => renderPage('О нас'),
'/contact': () => renderPage('Контакты'),
'/user/:id': (params) => renderUser(params.id)
});
Метод navigate() позволяет программно переходить на
маршрут:
router.navigate('/about');
Для организации подмаршрутов используется вложенный объект:
router.on({
'/dashboard': {
'/stats': () => renderStats(),
'/settings': () => renderSettings()
}
});
Navigo автоматически объединяет корневой путь и вложенные маршруты.
Чтобы задать маршрут, который будет выполняться при несоответствии
URL, используется метод .notFound():
router.notFound(() => {
document.body.innerHTML = '<h1>Страница не найдена</h1>';
});
Можно также использовать метод .resolve() для
принудительной проверки текущего URL и вызова соответствующего
обработчика:
router.resolve();
Это полезно после динамического создания маршрутов или после асинхронной загрузки компонентов.
Navigo поддерживает два режима навигации:
const router = new Navigo('/', { hash: true });
URL будет выглядеть как:
http://example.com/#/home
const router = new Navigo('/', { hash: false });
Требует настройки серверной части для обработки всех маршрутов на одну точку входа.
Navigo позволяет подписываться на изменения маршрутов:
router.hooks({
before: (done, params) => {
console.log('Перед переходом:', params);
done(); // обязательный вызов для продолжения навигации
},
after: (params) => {
console.log('После перехода:', params);
}
});
Хуки before и after полезны для аутентификации, подгрузки данных или отображения индикаторов загрузки.
Маршруты можно связывать с асинхронными функциями:
router.on('/profile/:id', async (params) => {
const data = await fetch(`/api/user/${params.id}`).then(res => res.json());
renderUser(data);
});
Это позволяет реализовать динамическую подгрузку страниц без полной перезагрузки браузера.
Методы navigate() и updatePageLinks()
обеспечивают синхронизацию ссылок с роутером:
router.updatePageLinks(); // автоматически перехватывает новые ссылки на странице
Для возврата к предыдущему маршруту можно использовать встроенный History API браузера:
window.history.back();
window.history.forward();
Navigo корректно обрабатывает такие переходы, вызывая соответствующие обработчики маршрутов.
Navigo хорошо интегрируется с различными подходами к рендерингу:
Пример с динамическим рендерингом шаблона:
router.on('/post/:id', (params) => {
fetch(`/api/posts/${params.id}`)
.then(res => res.text())
.then(html => document.getElementById('app').innerHTML = html);
});
Для масштабных проектов рекомендуется:
import()
для динамической загрузки.before для проверки прав
доступа./admin, /user, /shop).updatePageLinks() после
добавления нового контента на страницу.Эти методы обеспечивают чистый, управляемый и расширяемый роутинг без перегрузки браузера.