Библиотека Navigo опирается на механизм History API
(pushState, replaceState,
popstate) для управления маршрутизацией без перезагрузки
страницы. Однако в старых браузерах, таких как Internet Explorer (до
версии 10) и ранние мобильные браузеры, этот API либо отсутствует, либо
реализован частично.
В таких условиях Navigo автоматически или вручную переводится в режим
hash, при котором маршруты формируются через часть URL
после символа #:
https://example.com/#/users/42
Этот подход обеспечивает базовую совместимость, поскольку изменение
hash поддерживается практически всеми браузерами.
Navigo позволяет явно указать режим работы:
const router = new Navigo('/', { hash: true });
При включении этого параметра:
pushStateВ браузерах без pushState:
popstate либо не вызывается, либо работает
некорректноNavigo решает это следующим образом:
hashchangewindow.location.hash вместо
pathnameНекоторые устаревшие браузеры:
addEventListenerattachEvent (Internet Explorer 8 и
ниже)Navigo не поддерживает такие браузеры напрямую. Для их работы требуется дополнительный слой совместимости.
Для расширения совместимости применяются полифиллы — скрипты, добавляющие недостающий функционал.
Пример использования:
<script src="https://cdnjs.cloudflare.com/ajax/libs/history.js/1.8/native.history.min.js"></script>
Этот полифилл:
pushState и replaceStatehashchange, если необходимоДля поддержки старых браузеров также могут понадобиться:
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.6.7/es5-shim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.6.7/es5-sham.min.js"></script>
Они добавляют:
Function.prototype.bindArray.prototype.forEachВместо:
/users/42
используется:
#/users/42
Navigo автоматически обрабатывает эту разницу:
router.on('/users/:id', (params) => {
console.log(params.id);
});
Работает одинаково в обоих режимах.
router.navigate('/users/42');
В зависимости от режима:
pathnamehashHash-роутинг имеет ограничения:
#Для старых браузеров это компромисс:
Часто применяется гибридный подход:
При использовании History API требуется настройка сервера:
index.htmlВ старых браузерах (hash-режим):
Navigo выполняет базовую проверку:
if (window.history && window.history.pushState) {
// History API доступен
}
При необходимости можно реализовать собственную проверку:
const supportsHistory = !!(window.history && window.history.pushState);
const router = new Navigo('/', {
hash: !supportsHistory
});
popstateaddEventListenerВ старых браузерах:
hashchange могут срабатывать чащеNavigo минимизирует нагрузку:
const useHash = !('pushState' in window.history);
const router = new Navigo('/', {
hash: useHash
});
<!--[if lt IE 10]>
<script src="history-polyfill.js"></script>
<![endif]-->
/users/42#/users/42Hash-режим:
#section)Navigo изолирует маршруты, но при смешивании с якорями возможны конфликты.
Для проверки работы:
Критические сценарии:
Навигация строится по принципу:
Это обеспечивает:
Navigo не включает:
Ответственность за совместимость лежит на конфигурации проекта.