Navigo — это легковесная библиотека для маршрутизации в одностраничных приложениях на JavaScript. Основная задача маршрутизатора — сопоставление URL с определённой функцией-обработчиком и управление состоянием приложения без перезагрузки страницы.
Инициализация Navigo происходит через создание экземпляра класса
Navigo:
import Navigo from 'navigo';
const router = new Navigo('/', { hash: true });
Параметры конструктора:
root – корневой путь приложения.
Часто используется '/'.
options – объект с настройками,
среди которых:
hash: true — включение маршрутизации через хеши
(#).linksSelector — селектор для ссылок, которые будут
перехватываться Navigo.Маршруты связываются с функциями-обработчиками через метод
on. Например:
router.on('/home', () => {
document.body.innerHTML = '<h1>Главная страница</h1>';
});
router.on('/about', () => {
document.body.innerHTML = '<h1>О проекте</h1>';
});
Ключевые моменты:
:):router.on('/user/:id', (params) => {
console.log('ID пользователя:', params.id);
});
on:router
.on('/dashboard', () => { console.log('Dashboard'); })
.on('/profile', () => { console.log('Profile'); });
Для перехвата любых неопределённых маршрутов используется метод
notFound:
router.notFound(() => {
document.body.innerHTML = '<h1>404: Страница не найдена</h1>';
});
Navigo позволяет программно изменять маршрут:
router.navigate(path) — переход к указанному
маршруту.router.updatePageLinks() — обновление ссылок после
динамического изменения DOM.Пример динамического перехода:
document.getElementById('goHome').addEventListener('click', () => {
router.navigate('/home');
});
Navigo поддерживает маршруты с параметрами и ограничениями через регулярные выражения:
router.on('/post/:id(\\d+)', (params) => {
console.log('Номер поста:', params.id);
});
:id(\\d+) гарантирует, что маршрут сработает
только для числового идентификатора./category/:catId/post/:postId.Для сложных приложений удобно создавать вложенные маршруты:
router.on({
'/settings': () => console.log('Настройки'),
'/settings/profile': () => console.log('Профиль пользователя'),
'/settings/security': () => console.log('Безопасность'),
});
Это позволяет строить иерархию страниц без дублирования логики.
Navigo предоставляет возможность выполнять действия перед и после перехода по маршруту с помощью хуков:
before — вызывается перед обработчиком маршрута. Может
предотвратить переход.after — вызывается после обработки маршрута.Пример:
router.hooks({
before: (done, params, route) => {
console.log('Перед переходом:', route);
done();
},
after: (params, route) => {
console.log('После перехода:', route);
}
});
hash: true) — URL содержит
#, подходящий для статических сайтов.hash: false) —
использует HTML5 History API для чистых URL. Требует поддержки на
сервере.const router = new Navigo('/', { hash: false });
В этом режиме переходы выглядят как обычные URL
(/about), а сервер должен отдавать одно и то же приложение
для всех маршрутов.
Для отображения текущего состояния приложения можно использовать функцию, которая обновляет DOM при каждом переходе:
function renderPage(content) {
const container = document.getElementById('app');
container.innerHTML = content;
}
router
.on('/home', () => renderPage('<h1>Главная</h1>'))
.on('/about', () => renderPage('<h1>О проекте</h1>'))
.on('/user/:id', (params) => renderPage(`<h1>Пользователь ${params.id}</h1>`))
.notFound(() => renderPage('<h1>404: Не найдено</h1>'));
С помощью таких подходов можно визуализировать не только текст, но и сложные компоненты интерфейса, интегрировать с фреймворками или библиотеками для рендеринга, такими как React или Vue, под управлением маршрутов Navigo.
Navigo поддерживает обработку асинхронных маршрутов. Это удобно для подгрузки данных перед визуализацией:
router.on('/posts/:id', async (params) => {
const response = await fetch(`/api/posts/${params.id}`);
const post = await response.json();
renderPage(`<h1>${post.title}</h1><p>${post.body}</p>`);
});
before хуками для проверки
авторизации или состояния приложения перед переходом.Для корректной работы ссылок с Navigo нужно вызывать
updatePageLinks после добавления новых ссылок в DOM:
const link = document.createElement('a');
link.href = '/about';
link.textContent = 'О проекте';
document.body.appendChild(link);
router.updatePageLinks();
Это гарантирует, что клики по ссылкам будут перехватываться маршрутизатором и не приведут к полной перезагрузке страницы.
Хотите, я могу сделать отдельный раздел с продвинутыми паттернами визуализации маршрутов, включая анимации переходов и интеграцию с компонентной архитектурой?