Navigo — это легковесная библиотека для клиентского роутинга в
JavaScript, которая позволяет управлять состоянием приложения через URL
без перезагрузки страницы. Она работает на основе HTML5 History API и
поддерживает как динамические маршруты, так и статические. Основной
объект — Navigo — создаётся с указанием базового пути и
опций для точного контроля маршрутизации.
import Navigo from 'navigo';
const router = new Navigo('/', { hash: true });
Здесь ключевым моментом является использование
hash: true, что позволяет маршрутам работать даже в
браузерах без поддержки History API.
Маршруты в Navigo задаются с помощью метода .on(). Он
принимает строку пути и функцию-обработчик:
router.on('/home', () => {
console.log('Главная страница');
});
router.on('/about', () => {
console.log('О сайте');
});
Динамические параметры задаются через двоеточие:
router.on('/user/:id', (params) => {
console.log(`Пользователь с ID: ${params.id}`);
});
Ключевые моменты:
:id — переменная часть пути, которая доступна через
объект params.Для программного перехода между страницами используется метод
.navigate():
router.navigate('/home');
Это не вызывает перезагрузку страницы, но обновляет URL и запускает соответствующий обработчик.
Особенности:
Можно передавать объект с опциями, например
{ replace: true }, чтобы заменить текущую запись в
истории.
Поддерживается навигация на маршруты с параметрами:
router.navigate('/user/42');Navigo позволяет задавать маршрут по умолчанию через
.notFound():
router.notFound(() => {
console.log('Страница не найдена');
});
Также поддерживается группировка маршрутов через
.on() с объектом:
router.on({
'/': () => console.log('Главная'),
'/contact': () => console.log('Контакты'),
'/blog/:slug': (params) => console.log(params.slug)
});
Это удобно для организации большого количества маршрутов в единую структуру.
Navigo поддерживает хуки для управления доступом к маршрутам и выполнения логики перед навигацией.
router.hooks({
before: (done, match) => {
console.log('Проверка перед переходом на:', match.url);
done();
},
after: (match) => {
console.log('Переход завершён на:', match.url);
}
});
before — вызывается до активации маршрута. Можно
использовать для проверки прав пользователя.after — вызывается после смены маршрута, полезно для
аналитики или обновления интерфейса.Для интеграции с кнопками и ссылками удобно использовать атрибуты
data-navigo:
<a href="/about" data-navigo>О сайте</a>
В JavaScript необходимо вызвать метод
.updatePageLinks(), чтобы Navigo обработал все ссылки на
странице:
router.updatePageLinks();
Это позволяет использовать обычные <a> элементы
без кастомного кода для кликов.
Navigo может работать в двух режимах:
const router = new Navigo('/');
/home, /about)const router = new Navigo('/', { hash: true });
/#/homeДля сложных приложений часто нужны маршруты с условными параметрами:
router.on('/product/:id(\\d+)', (params) => {
console.log('ID продукта:', params.id);
});
:id(\\d+) — позволяет принимать только числовые
значения.Обработчики маршрутов могут быть асинхронными, что полезно для загрузки данных с API:
router.on('/profile/:id', async (params) => {
const response = await fetch(`/api/user/${params.id}`);
const user = await response.json();
console.log(user);
});
Navigo поддерживает вложенные маршруты, что облегчает создание сложных интерфейсов:
router.on('/dashboard', () => console.log('Dashboard'))
.on('/dashboard/settings', () => console.log('Настройки'))
.on('/dashboard/profile', () => console.log('Профиль'));
Navigo легко интегрируется с популярными библиотеками фронтенда:
Navigo предоставляет доступ к объекту
router.lastRouteResolved():
const lastRoute = router.lastRouteResolved();
console.log(lastRoute.url); // Текущий путь
console.log(lastRoute.params); // Параметры маршрута
updatePageLinks() после динамического
изменения DOM.Navigo обеспечивает лёгкий и гибкий способ управления навигацией в SPA, сохраняя чистоту URL, поддержку динамических маршрутов, асинхронной загрузки и интеграцию с различными структурами фронтенд-приложений. Такой подход минимизирует зависимость от сторонних роутеров и обеспечивает полный контроль над состоянием приложения.