Navigo — это легковесная библиотека для маршрутизации на стороне
клиента в JavaScript. Она позволяет управлять переходами между
страницами без перезагрузки браузера, сохраняя состояние приложения и
обеспечивая быстрый отклик интерфейса. Центральным элементом является
объект маршрутизатора, создаваемый через конструктор
Navigo.
import Navigo from 'navigo';
const router = new Navigo('/', { hash: true });
root).hash: true позволяет использовать маршрутизацию
через хеши (#/path), что упрощает работу на статических
серверах.Маршруты задаются методом .on(path, handler).
router.on('/home', () => {
console.log('Главная страница');
});
router.on('/about', () => {
console.log('О нас');
});
Маршруты могут содержать динамические параметры, которые передаются в обработчик как объект.
router.on('/user/:id', (params) => {
console.log(`Пользователь с ID: ${params.id}`);
});
:id — динамический сегмент пути.params,
где ключи соответствуют именам сегментов.Можно задавать несколько параметров:
router.on('/product/:category/:id', (params) => {
console.log(`Категория: ${params.category}, ID: ${params.id}`);
});
navigateДля программного перехода между маршрутами используется метод
navigate(path):
router.navigate('/about');
replace: true, чтобы заменить
текущую запись в истории браузера, не создавая новую:router.navigate('/home', { replace: true });
resolveМетод resolve() используется для инициирования
маршрутизации вручную, когда URL изменился вне Navigo (например, при
прямом вводе в адресную строку):
router.resolve();
Navigo поддерживает хуки, которые позволяют перехватывать переходы и выполнять действия до или после маршрутизации.
beforeХук before выполняется перед переходом:
router.hooks({
before: (done, params, route) => {
console.log(`Переход на маршрут: ${route.url}`);
done(); // продолжить переход
}
});
done — функция, которую необходимо вызвать для
продолжения маршрутизации.afterХук after срабатывает после успешного перехода:
router.hooks({
after: (params, route) => {
console.log(`Завершён переход на ${route.url}`);
}
});
Navigo позволяет объединять маршруты в группы для удобного управления и организации кода:
router.on({
'/admin': () => console.log('Панель администратора'),
'/admin/users': () => console.log('Управление пользователями'),
'/admin/settings': () => console.log('Настройки')
});
.on упрощает
регистрацию нескольких маршрутов.Маршруты могут содержать необязательные сегменты, используя синтаксис
?:
router.on('/blog/:id?', (params) => {
if (params.id) {
console.log(`Статья ${params.id}`);
} else {
console.log('Список статей');
}
});
Также можно использовать регулярные выражения для ограничения допустимых значений:
router.on('/order/:id(\\d+)', (params) => {
console.log(`Заказ с номером ${params.id}`);
});
Navigo взаимодействует с History API, что позволяет управлять состоянием переходов:
router.navigate(path, { replace: true }) — заменяет
текущую запись.router.navigate(path) — добавляет новую запись в
историю.popstate, если требуется кастомная логика:window.addEventListener('popstate', () => {
router.resolve();
});
Для крупных приложений полезно использовать ленивую загрузку контента. Navigo поддерживает обработку промисов:
router.on('/dashboard', async () => {
const module = await import('./dashboard.js');
module.renderDashboard();
});
before, чтобы показывать спиннер
или выполнять авторизацию до загрузки контента.Редиректы реализуются через метод navigate или через
маршруты с колбэком:
router.on('/old-page', () => {
router.navigate('/new-page');
});
before для условной логики
редиректа.navigate для программного перехода между
страницами без перезагрузки.params.before и after для
контроля переходов и побочных эффектов.replace и
событие popstate.Эти подходы обеспечивают полный контроль над переходами, делают интерфейс отзывчивым и позволяют строить сложные клиентские приложения на чистом JavaScript с минимальной зависимостью от внешних библиотек.