Хук page.stop()

Метод page.stop() в библиотеке Page.js предназначен для полной остановки клиентского роутера. После его вызова прекращается обработка маршрутов, отключаются обработчики событий браузера, и система маршрутизации перестаёт реагировать на изменения URL.

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


Внутренний механизм работы

При инициализации Page.js выполняет несколько ключевых действий:

  • подписывается на событие popstate
  • перехватывает клики по ссылкам (click events)
  • управляет историей через history.pushState

Вызов page.stop():

  • удаляет обработчик popstate
  • прекращает перехват кликов по ссылкам
  • очищает внутреннее состояние маршрутизатора (частично, без сброса объявленных маршрутов)

Фактически, роутер переходит в «пассивное» состояние.


Сигнатура метода

page.stop();

Метод не принимает аргументов и не возвращает значение.


Основные сценарии использования

1. Деактивация роутера при смене режима приложения

В одностраничных приложениях может возникать необходимость отключения маршрутизации, например:

  • переход в режим администрирования
  • переключение на другой роутер
  • запуск полноэкранного виджета
page.stop();

После этого Page.js перестаёт влиять на навигацию.


2. Освобождение ресурсов

При длительной работе SPA приложение может накапливать обработчики событий. Если роутер больше не нужен:

page.stop();

Это позволяет избежать:

  • утечек памяти
  • лишних вызовов обработчиков
  • конфликтов с другими библиотеками

3. Использование вместе с page.start()

Методы page.start() и page.stop() работают в паре.

page.start();
// роутер активен

page.stop();
// роутер отключён

page.start();
// повторная активация

Важно: маршруты, объявленные до stop(), сохраняются и будут работать после повторного start().


Поведение после остановки

После вызова page.stop():

  • маршруты не удаляются
  • переходы через page('/path') не выполняются автоматически
  • события браузера игнорируются
  • переходы по ссылкам выполняются как обычные (перезагрузка страницы)

Пример:

page('/about', () => {
  console.log('About page');
});

page.start();

page.stop();

page('/about'); // обработчик не выполнится

Взаимодействие с History API

Page.js активно использует History API:

  • pushState
  • replaceState
  • popstate

После page.stop():

  • изменения истории браузера больше не отслеживаются
  • переходы назад/вперёд не вызывают маршруты

Однако сам History API продолжает работать независимо от Page.js.


Влияние на перехват ссылок

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

<a href="/about">About</a>

В активном состоянии:

  • переход обрабатывается через JavaScript
  • страница не перезагружается

После page.stop():

  • ссылка работает как обычная
  • происходит полный переход с загрузкой страницы

Частые ошибки и особенности

1. Ожидание автоматического возобновления

page.stop() не имеет механизма автозапуска. После остановки требуется явный вызов:

page.start();

2. Попытка использовать маршруты без start()

page.stop();

page('/home'); // не сработает

Маршруты выполняются только при активном роутере.


3. Дублирование обработчиков

Если вызвать page.start() несколько раз без stop():

  • возможно дублирование событий
  • обработчики могут вызываться несколько раз

Правильный паттерн:

page.stop();
page.start();

Использование в модульной архитектуре

В крупных приложениях маршрутизация может быть разбита на модули. В таком случае page.stop() применяется для управления жизненным циклом модулей.

Пример:

export function initModule() {
  page('/module', handler);
  page.start();
}

export function destroyModule() {
  page.stop();
}

Интеграция с другими роутерами

При использовании нескольких роутеров (например, миграция с одной библиотеки на другую):

page.stop();
// инициализация другого роутера

Это предотвращает:

  • конфликты маршрутов
  • двойную обработку URL
  • некорректное состояние истории

Отладка и диагностика

При проблемах с маршрутизацией важно учитывать состояние роутера:

  • активен (page.start())
  • остановлен (page.stop())

Признаки остановленного роутера:

  • маршруты не срабатывают
  • ссылки ведут к полной перезагрузке
  • popstate не вызывает обработчики

Практический пример

// маршруты
page('/', () => console.log('Home'));
page('/about', () => console.log('About'));

// запуск
page.start();

// остановка через 5 секунд
setTimeout(() => {
  page.stop();
  console.log('Router stopped');
}, 5000);

После остановки:

  • переходы перестают логироваться
  • навигация возвращается к стандартному поведению браузера

Сравнение с альтернативными подходами

В отличие от некоторых роутеров:

  • Page.js не уничтожает маршруты при остановке
  • не требует пересоздания экземпляра
  • не имеет состояния «destroy», только «stop/start»

Это делает page.stop() лёгким инструментом управления жизненным циклом.


Рекомендации по использованию

  • вызывать page.stop() только при необходимости
  • всегда контролировать повторный запуск
  • избегать частых переключений без причины
  • использовать в связке с архитектурой приложения

Связанные методы

  • page.start() — запуск маршрутизации
  • page() — объявление маршрутов
  • page.redirect() — программный редирект

page.stop() является частью базового управления состоянием роутера и критически важен для контроля поведения SPA-приложений.