Navigo — это легковесная клиентская библиотека для маршрутизации в одностраничных приложениях (SPA). Она позволяет определять маршруты, управлять переходами между ними и обрабатывать параметры URL без перезагрузки страницы. Основная цель использования Navigo — упрощение навигации и поддержка чистого URL-адреса.
Для начала необходимо создать экземпляр маршрутизатора:
import Navigo from 'navigo';
const router = new Navigo('/', { hash: false });
Здесь первый аргумент '/' задаёт базовый путь, а опция
hash: false позволяет использовать стандартные URL без
хэшей (#). Если приложение должно работать через хэш, эту
опцию можно установить в true.
Маршруты задаются через метод on, который принимает путь
и функцию-обработчик:
router.on('/home', () => {
console.log('Отображается домашняя страница');
});
router.on('/about', () => {
console.log('Отображается страница "О нас"');
});
Можно использовать параметры в маршрутах:
router.on('/user/:id', (params) => {
console.log(`Пользователь с ID: ${params.id}`);
});
Navigo автоматически извлекает параметры из URL и передает их в
функцию-обработчик. Для опциональных параметров используется синтаксис
:param?:
router.on('/search/:query?', (params) => {
console.log(`Результаты поиска для: ${params.query || 'всё'}`);
});
Для реализации клавиатурной навигации важно уметь отслеживать события
клавиатуры и запускать маршруты через API Navigo. Основной метод —
router.navigate(path):
document.addEventListener('keydown', (event) => {
switch(event.key) {
case 'ArrowLeft':
router.navigate('/previous');
break;
case 'ArrowRight':
router.navigate('/next');
break;
case 'Home':
router.navigate('/home');
break;
}
});
Здесь keydown позволяет реагировать на нажатие клавиш до
того, как браузер выполнит стандартное действие. Метод
navigate обновляет URL и вызывает соответствующий
обработчик маршрута, сохраняя SPA-поведение.
Иногда необходимо строить маршруты с параметрами, зависящими от состояния приложения. Например, переключение между элементами списка:
let currentItem = 0;
const items = ['item1', 'item2', 'item3'];
document.addEventListener('keydown', (event) => {
if(event.key === 'ArrowRight') {
currentItem = (currentItem + 1) % items.length;
router.navigate(`/items/${currentItem}`);
} else if(event.key === 'ArrowLeft') {
currentItem = (currentItem - 1 + items.length) % items.length;
router.navigate(`/items/${currentItem}`);
}
});
router.on('/items/:index', (params) => {
console.log(`Отображается элемент: ${items[params.index]}`);
});
Использование модульного подхода позволяет создавать массивы маршрутов и динамически назначать их обработчики.
Для реализации универсальной клавиатурной навигации можно создать карту сочетаний клавиш, связывая их с маршрутами:
const keyMap = {
'h': '/home',
'a': '/about',
'u': '/user/1'
};
document.addEventListener('keydown', (event) => {
const path = keyMap[event.key];
if(path) {
router.navigate(path);
}
});
Это облегчает расширение навигации, так как добавление нового сочетания клавиш не требует изменения логики обработчиков маршрутов.
Navigo предоставляет события, которые можно использовать для синхронизации состояния приложения с URL:
router.on('/profile/:id', (params) => {
renderProfile(params.id);
});
router.on('*', () => {
console.log('Маршрут не найден');
});
router.resolve();
Метод resolve() проверяет текущий URL и вызывает
соответствующий обработчик. Это важно при загрузке страницы с уже
установленным URL или при программной навигации.
Navigo использует History API браузера для обновления URL без перезагрузки страницы. Это позволяет клавиатурной навигации оставаться прозрачной для пользователя: стрелки и сочетания клавиш обновляют адресную строку и состояние приложения одновременно.
Для реализации кнопки «Назад» клавиатурно достаточно реагировать на
событие popstate:
window.addEventListener('popstate', () => {
router.resolve();
});
Это гарантирует, что при навигации назад или вперёд через клавиатуру приложение корректно отобразит состояние.
Navigo легко интегрируется с React, Vue или Vanilla JS. В случае
клавиатурной навигации важно, чтобы обработчики клавиш были глобальными
и не конфликтовали с элементами формы. Рекомендуется использовать
делегирование событий на уровне document или корневого
контейнера приложения.
Такой подход позволяет строить сложные SPA с полной поддержкой клавиатурной навигации: динамические маршруты, быстрые переходы через клавиши, синхронизацию URL и состояния приложения.