Символ звездочки для произвольных путей

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

Основной синтаксис

page('*', function(ctx) {
  console.log('Произвольный путь:', ctx.path);
});

В данном примере любой URL, который не совпадает с другими явно заданными маршрутами, будет обработан функцией-колбэком. Контекст ctx содержит всю информацию о текущем пути:

  • ctx.path — полный путь URL (например, /products/123/details)
  • ctx.params — объект с параметрами маршрута, если они были указаны
  • ctx.querystring — строка запроса после ?
  • ctx.hash — фрагмент после # в URL

Комбинация с другими маршрутами

Символ * чаще всего применяется в конце маршрута, чтобы «поймать» все оставшиеся сегменты:

page('/files/*', function(ctx) {
  console.log('Путь к файлу:', ctx.params[0]);
});

Здесь любой URL, начинающийся с /files/, будет соответствовать маршруту, а ctx.params[0] вернет все оставшиеся сегменты пути после /files/. Например:

  • /files/images/photo.jpgctx.params[0] === "images/photo.jpg"
  • /files/docs/report.pdfctx.params[0] === "docs/report.pdf"

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

page('/archive/*/edit', function(ctx) {
  console.log('Редактируемый архив:', ctx.params[0]);
});

Для URL /archive/2026/march/edit результат будет:

ctx.params[0] === "2026/march"

Использование для маршрутов с вложенными параметрами

Символ * удобен, когда структура URL глубоко вложена и заранее неизвестна. Например, блог с произвольной глубиной категорий:

page('/blog/*', function(ctx) {
  const fullPath = ctx.params[0]; // полный путь категории и статьи
  const segments = fullPath.split('/');
  console.log('Сегменты пути:', segments);
});

При URL /blog/technology/javascript/page массив segments будет:

["technology", "javascript", "page"]

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

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

Символ * может использоваться вместе с именованными параметрами. Например:

page('/user/:id/*', function(ctx) {
  console.log('ID пользователя:', ctx.params.id);
  console.log('Остальная часть пути:', ctx.params[0]);
});

Для URL /user/42/settings/profile:

ctx.params.id === "42"
ctx.params[0] === "settings/profile"

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

Порядок определения маршрутов

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

page('/about', aboutPage);
page('/contact', contactPage);
page('*', notFoundPage); // ловит все остальные URL

Если разместить '*' выше конкретных маршрутов, все остальные маршруты станут недоступны, так как Page.js будет считать их совпадением с универсальным обработчиком.

Практические советы

  • Использовать * для обработки 404 страниц или любых непредусмотренных маршрутов.
  • Для сложных URL с глубокой вложенностью применять разбиение строки через .split('/').
  • Совмещать с именованными параметрами для получения гибкой маршрутизации.
  • Всегда размещать маршруты с * в конце списка, чтобы не блокировать другие обработчики.

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