Обратная совместимость

Библиотека Page.js предоставляет лёгкий и гибкий способ организации маршрутизации на клиентской стороне, сохраняя возможность обратной совместимости с различными версиями браузеров и старым кодом. Обратная совместимость в контексте Page.js означает, что маршруты, созданные в предыдущих версиях библиотеки или реализованные с учётом устаревших API браузеров, продолжают корректно работать без необходимости полной переработки кода.


Работа с устаревшими маршрутами

Page.js использует HTML5 History API, но при необходимости может автоматически переключаться на hash-based routing. Это позволяет поддерживать старые браузеры, которые не поддерживают pushState и replaceState. Основные моменты:

  • pushState: позволяет изменять URL без перезагрузки страницы, используется для современных браузеров.
  • hash routing: для браузеров без поддержки History API URL строится через #, что обеспечивает совместимость с устаревшими браузерами. Например, маршрут /about превращается в /#/about.

Пример включения hash-режима для обратной совместимости:

page({
  hashbang: true
});

page('/home', function(ctx) {
  console.log('Home route');
});

page.start();

Параметр hashbang: true заставляет Page.js использовать формат #!/route для маршрутов, что гарантирует корректную работу на старых браузерах.


Поддержка старых версий браузеров

Для работы в Internet Explorer 9 и ниже необходимо использовать полифиллы для History API и ES5-совместимый JavaScript. Page.js сама по себе не требует особой доработки, если код написан с учётом ES5, но для полноценной работы с pushState полифиллы обязательны. Основные рекомендации:

  • Подключить полифилл history.js или аналогичный.
  • Избегать использования стрелочных функций и современных синтаксических конструкций без транспиляции.
  • Использовать проверку поддержки History API перед запуском Page.js:
if (!window.history.pushState) {
  page({ hashbang: true });
} else {
  page();
}

Это гарантирует, что даже при отсутствии поддержки History API маршруты будут работать через hash.


Сохранение совместимости с существующими маршрутами

Page.js поддерживает динамические маршруты, где параметры передаются через :param в пути. Старые маршруты могут использовать синтаксис с двоеточием, и библиотека корректно обрабатывает их независимо от версии браузера.

Пример динамического маршрута:

page('/user/:id', function(ctx) {
  console.log('User ID:', ctx.params.id);
});

Даже при переключении на hash-режим ctx.params.id будет доступен, и функциональность не нарушится.


Управление переходами между маршрутами

Для обратной совместимости важно учитывать обработку переходов и возвратов назад. Page.js корректно управляет историей браузера:

  • page.redirect('/new') – замена текущего маршрута на новый.
  • page.show('/another') – отображение маршрута без изменения истории.
  • ctx.path и ctx.pathname доступны как в pushState, так и в hash-режиме.

Эти методы гарантируют, что старый код, который опирается на изменение URL или обработку переходов, продолжает работать корректно.


Обработка событий старых ссылок

Старые HTML-ссылки с атрибутом href тоже могут оставаться рабочими:

<a href="/contact">Contact</a>

Page.js перехватывает клики по ссылкам и предотвращает стандартное поведение браузера, но при hash-режиме URL автоматически преобразуется в /#/contact. Это позволяет сохранить совместимость с существующими шаблонами и CMS, где ссылки уже заданы.


Миграция старого кода

Для проектов с Page.js версии 0.x или ранними 1.x:

  1. Проверить, используется ли старый синтаксис page(path, fn) без ctx.
  2. При необходимости адаптировать функции обратного вызова к новому API, используя объект ctx.
  3. Добавить параметр hashbang: true, если проект поддерживает старые браузеры.
  4. Проверить корректность работы динамических маршрутов и переходов с redirect и show.

Таким образом, обратная совместимость обеспечивает плавную интеграцию новых функций без разрушения существующей логики маршрутизации.


Если требуется, Page.js можно конфигурировать под абсолютно старые браузеры без History API, используя комбинацию hashbang, полифиллов и адаптированных колбэков, что делает библиотеку надёжным инструментом для проектов с разными требованиями к совместимости.