History API предоставляет низкоуровневый интерфейс
для управления историей браузера: pushState,
replaceState, popstate. Это
императивный инструмент, где разработчик самостоятельно
описывает, когда и как изменять состояние истории,
отслеживать изменения URL и синхронизировать их с интерфейсом.
Navigo, напротив, реализует декларативный подход. Вместо явного управления историей создаётся карта маршрутов:
const router = new Navigo('/');
router
.on('/about', () => { /* ... */ })
.on('/users/:id', (params) => { /* ... */ })
.resolve();
Здесь разработчик описывает соответствие URL → обработчик, а библиотека берёт на себя:
При использовании History API приходится вручную:
location.pathnameПример:
window.addEventListener('popstate', () => {
const path = location.pathname;
if (path.startsWith('/users/')) {
const id = path.split('/')[2];
// обработка
}
});
В Navigo это реализовано на уровне библиотеки:
router.on('/users/:id', ({ data }) => {
console.log(data.id);
});
Ключевое отличие:
History API требует явной подписки на событие
popstate:
window.addEventListener('popstate', handler);
Также необходимо учитывать:
Navigo инкапсулирует эту логику:
router.resolve();
Внутри:
popstateРазница:
С History API переходы инициируются напрямую:
history.pushState({}, '', '/about');
renderPage('/about');
Разработчик обязан:
В Navigo переходы централизованы:
router.navigate('/about');
Библиотека:
В History API динамические маршруты реализуются вручную через:
const match = location.pathname.match(/^\/users\/(\d+)$/);
if (match) {
const id = match[1];
}
В Navigo используется декларативный синтаксис:
router.on('/users/:id', ({ data }) => {
console.log(data.id);
});
Поддерживаются:
:id)*)History API не содержит встроенной концепции middleware. Любая логика:
реализуется вручную.
Navigo поддерживает middleware-подобные механизмы:
router.on('/admin', {
uses: [authMiddleware],
as: 'admin'
});
Это позволяет:
При работе с History API необходимо вручную:
if (!routeFound) {
renderNotFound();
}
В Navigo предусмотрен fallback:
router.notFound(() => {
// обработка 404
});
History API не предоставляет встроенного механизма для работы с базовым путём приложения. Это особенно важно при размещении SPA не в корне сайта.
В Navigo можно задать базовый путь:
const router = new Navigo('/app');
Библиотека автоматически учитывает этот префикс при:
При использовании History API необходимо:
<a>pushStatedocument.addEventListener('click', (e) => {
if (e.target.matches('a')) {
e.preventDefault();
history.pushState({}, '', e.target.href);
handleRoute();
}
});
В Navigo есть встроенная обработка ссылок:
router.updatePageLinks();
После вызова:
History API:
Navigo:
History API:
Navigo:
| Аспект | History API | Navigo |
|---|---|---|
| Уровень абстракции | Низкий | Высокий |
| Маршрутизация | Ручная | Декларативная |
| Парсинг URL | Вручную | Встроенный |
| Обработка событий | popstate | Автоматическая |
| Динамические маршруты | Через regex | Через синтаксис :param |
| Middleware | Нет | Есть |
| 404 обработка | Вручную | Через notFound() |
| Работа со ссылками | Вручную | updatePageLinks() |
| Масштабируемость | Ограничена архитектурой | Высокая |