Библиотека Navigo поддерживает два основных режима маршрутизации:
#/path)/path)Каждый из них имеет особенности, ограничения и сценарии применения. Переключение между режимами — важный аспект настройки клиентской навигации, особенно при работе с серверной инфраструктурой и SEO.
Hash-режим использует часть URL после символа #.
Например:
http://example.com/#/about
Все изменения происходят в фрагменте URL, который не отправляется на сервер. Это означает:
/)const router = new Navigo('/', { hash: true });
Или в более старом стиле:
const router = new Navigo('/', true);
#, что ухудшает читаемостьHistory API использует стандартные URL без #:
http://example.com/about
Навигация осуществляется через:
history.pushStatehistory.replaceStatepopstate событияconst router = new Navigo('/', { hash: false });
Или:
const router = new Navigo('/');
Сервер должен перенаправлять все маршруты на
index.html.
Пример для Express:
app.use((req, res) => {
res.sendFile(path.join(__dirname, 'index.html'));
});
Ключевой параметр — hash:
const router = new Navigo('/', { hash: true }); // Hash режим
const router = new Navigo('/', { hash: false }); // History API
Navigo не поддерживает изменение режима “на лету”. Переключение требует:
router.destroy();
const newRouter = new Navigo('/', { hash: true });
router.on('/about', () => {
console.log('About page');
});
URL:
http://example.com/#/about
router.on('/about', () => {
console.log('About page');
});
URL:
http://example.com/about
Navigo автоматически перехватывает клики по ссылкам.
<a href="/about" data-navigo>About</a>
Ссылка автоматически преобразуется в:
#/about
Остаётся без изменений:
/about
#Navigo позволяет задавать базовый путь:
const router = new Navigo('/app', { hash: false });
http://example.com/#/app/about
http://example.com/app/about
В History режиме важно учитывать базовый путь:
router.on('/profile', handler);
При базе /app:
/app/profile
В Hash режиме:
#/profile
База применяется иначе, так как хэш изолирован.
| Режим | Поддержка |
|---|---|
| Hash | Все браузеры |
| History API | IE10+ (частично), современные браузеры |
Для старых браузеров рекомендуется Hash режим.
Практика — выбирать режим динамически:
const useHash = !window.history.pushState;
const router = new Navigo('/', { hash: useHash });
В History режиме ошибка чаще связана с сервером:
router.notFound(() => {
console.log('404 page');
});
В Hash режиме ошибка — только логическая (маршрут не найден).
router.navigate('/about');
Результат:
#/about
router.navigate('/about');
Результат:
/about
Требуется:
Пример для Nginx:
location / {
try_files $uri $uri/ /index.html;
}
Hash режим:
History режим:
Результат:
404 при обновлении страницы
const router = new Navigo('/app');
Если сервер не настроен — маршруты ломаются.
Использование #/path в History режиме или наоборот
приводит к некорректной навигации.
Navigo напрямую не предоставляет метод для получения режима, но можно сохранить настройку:
const config = { hash: true };
const router = new Navigo('/', config);
console.log(config.hash);
Выбор режима влияет на:
Поэтому решение принимается на раннем этапе разработки и редко меняется позже.