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

Page.js — это компактная библиотека для клиентского роутинга в JavaScript, ориентированная на работу с одностраничными приложениями (SPA). Основное отличие от более крупных фреймворков, таких как React Router или Vue Router, заключается в минимализме, прямом управлении историей браузера и простоте интеграции с любым JavaScript-кодом без необходимости привязки к конкретной экосистеме.

Лёгкость и размер Page.js занимает всего несколько килобайт, что существенно сокращает время загрузки страницы по сравнению с крупными роутерами. Например, React Router с зависимостями весит в десятки раз больше. Это делает Page.js привлекательным для проектов, где критичны скорость и производительность.

Прямое управление историей браузера Page.js работает напрямую с History API (pushState, replaceState) и hash-фрагментами. Такой подход обеспечивает гибкость и полный контроль над навигацией, тогда как некоторые роутеры высокого уровня скрывают эти механизмы, ограничивая возможности тонкой настройки.

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

page('/home', () => {
  console.log('Главная страница');
});

page('/user/:id', ctx => {
  console.log('Пользователь с ID:', ctx.params.id);
});

page();

Здесь видно:

  • Поддержка динамических сегментов через :param.
  • Контекст ctx, включающий параметры, путь, query-параметры и состояние.
  • Возможность подключать промежуточные функции (middleware) для обработки запроса до перехода к обработчику маршрута.

В отличие от Angular Router или Vue Router, где маршруты определяются через сложные объекты конфигурации с компонентами, guards и nested routes, Page.js минималистичен и не навязывает структуру приложения.

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

function auth(ctx, next) {
  if (!ctx.user) {
    page.redirect('/login');
  } else {
    next();
  }
}

page('/dashboard', auth, ctx => {
  console.log('Панель управления');
});

Подобная концепция схожа с Express.js на сервере, что упрощает понимание для разработчиков, знакомых с Node.js. В отличие от некоторых других роутеров, где guards реализованы через абстрактные хуки жизненного цикла компонентов, Page.js использует чистые функции с явным вызовом next(), обеспечивая предсказуемое поведение.

Гибкость интеграции Page.js не зависит от конкретного фреймворка. Его можно использовать с чистым JavaScript, React, Vue или любой другой библиотекой. Для сравнения, React Router ориентирован только на React, а Vue Router — только на Vue. Это делает Page.js универсальным инструментом для проектов с различной архитектурой или постепенной миграцией на SPA.

Управление навигацией и редиректами Page.js предоставляет простой API для программной навигации:

page('/old-page', () => {
  page.redirect('/new-page');
});

Такой подход отличается от React Router, где требуется использовать компоненты <Navigate> или хуки useNavigate. Page.js не требует JSX или оберток компонентов, что делает редиректы и навигацию прозрачными и прямыми.

Поддержка SEO и fallback для серверного рендеринга Page.js ориентирован на клиентскую часть, поэтому интеграция с серверным рендерингом требует дополнительных настроек. В отличие от Next.js или Nuxt.js, где роутинг глубоко интегрирован с SSR и генерацией статических страниц, Page.js остается инструментом для SPA, что упрощает, но ограничивает возможности для SEO из коробки.

Заключение по сравнению Основные преимущества Page.js перед другими роутерами:

  • Минимализм и малый размер.
  • Прямое управление историей браузера.
  • Простая система middleware.
  • Гибкость интеграции с любыми библиотеками.
  • Легкость изучения и внедрения.

Главные ограничения:

  • Нет встроенной поддержки nested routes с компонентами.
  • Не интегрирован с SSR и статической генерацией.
  • Требует ручного управления состоянием и жизненным циклом страниц.

Page.js идеально подходит для небольших и средних SPA, где критична скорость и контроль, а крупные роутеры более удобны для крупных фреймворк-приложений с компонентной архитектурой и сложной логикой маршрутов.