Библиотека Page.js предоставляет легкий способ
управления маршрутизацией в одностраничных приложениях на JavaScript.
Основной интерфейс взаимодействия — функция page(). Она
выполняет несколько ключевых задач: определение маршрутов, управление
переходами между ними и настройку поведения браузера при навигации.
Синтаксис вызова может быть различным:
page(path, callback)
page(callback)
page.start()
page.show(path)
page.redirect(from, to)
Каждый метод имеет свои особенности и предназначение.
page(path, callback)Используется для регистрации маршрута. Параметры:
'/about', '/users/:id'. Поддерживаются
параметры и регулярные выражения.ctx с информацией о
маршруте.Пример:
page('/users/:id', (ctx) => {
console.log(ctx.params.id); // ID пользователя
});
Особенности:
:param.ctx.querystring.page(callback)Позволяет зарегистрировать глобальный middleware, который будет срабатывать на каждом переходе. Полезно для логирования, авторизации и других общих задач.
page((ctx, next) => {
console.log('Переход к:', ctx.path);
next();
});
Ключевой момент: обязательно вызывать next() для
передачи управления следующему middleware или обработчику маршрута.
page.start(options)Запускает маршрутизатор. Параметры:
true по умолчанию.
Если false, начальная навигация не будет вызвана
автоматически.true по
умолчанию, декодирует URL перед сопоставлением с маршрутом.Пример:
page.start({ dispatch: true, decodeURLComponents: true });
Особенности:
page.start() начинаются отслеживания
изменений истории браузера.page.start() маршруты не будут
работать.page.show(path, state, dispatch)Позволяет программно инициировать переход к указанному маршруту. Параметры:
history.pushState.false, обработчики
маршрутов не будут вызваны, но URL изменится.Пример:
page.show('/dashboard', { user: '123' });
page.redirect(from, to)Определяет редирект с одного маршрута на другой. Используется для перенаправления устаревших URL или при авторизации.
page.redirect('/home', '/dashboard');
Особенности:
page('/admin', (ctx, next) => {
if (!ctx.user.isAdmin) page.redirect('/login');
else next();
});
Объект ctx, передаваемый каждому callback, содержит:
/users/:id → { id: '123' }).?page=2).page.show() или при редиректе.Пример использования параметров и query:
page('/search/:term', (ctx) => {
const query = new URLSearchParams(ctx.querystring);
console.log(ctx.params.term, query.get('page'));
});
Page.js поддерживает цепочку middleware, которая вызывается
последовательно. Порядок регистрации важен: глобальные middleware,
зарегистрированные без пути, срабатывают первыми, затем — маршруты с
конкретным path. Middleware может завершать цепочку без вызова
next(), что предотвращает выполнение следующих
обработчиков.
Пример цепочки:
page((ctx, next) => {
console.log('Глобальный middleware');
next();
});
page('/profile', (ctx, next) => {
console.log('Маршрут /profile');
next();
});
page('/profile', (ctx) => {
console.log('Финальный обработчик');
});
Page.js использует history.pushState и
popstate для управления навигацией без перезагрузки
страницы. Это позволяет:
state.Особенности:
page.show() и page.redirect() вызывают
history.pushState.popstate, который
обрабатывается Page.js.page(/^\/product\/(\d+)$/, (ctx) => {
console.log(ctx.params[0]); // ID продукта
});
Middleware могут быть асинхронными:
page('/dashboard', async (ctx, next) => {
await fetchUserData();
next();
});
Если middleware не вызывает next() и не делает
page.redirect(), переход считается остановленным.
page('/about', (ctx) => {
ctx.title = 'О компании';
document.title = ctx.title;
});
Page.js предлагает полный контроль над маршрутизацией с минимальными
усилиями, предоставляя методы page(), start(),
show(), redirect() и удобный объект
ctx для передачи данных между обработчиками. Такой подход
позволяет строить сложные одностраничные приложения с динамическими
маршрутами, редиректами и middleware, не завися от тяжелых
фреймворков.