Библиотека Page.js предоставляет набор опций, позволяющих управлять
поведением маршрутизатора без изменения его внутренней логики.
Конфигурация осуществляется через вызов функции page() с
соответствующими аргументами или через вспомогательные методы.
Ключевые аспекты настройки:
baseОпция base задаёт базовый путь приложения. Это особенно
важно при развертывании не в корне домена.
page.base('/app');
После установки:
/users фактически будет доступен по адресу
/app/usersОсобенности:
Типичный сценарий использования:
https://example.com/app/index.html по всем вложенным
маршрутамstrictОпция strict управляет чувствительностью маршрутов к
завершающему слешу.
page.strict(true);
Поведение:
true — /about и /about/
считаются разными маршрутамиfalse (по умолчанию) — различие игнорируетсяПример:
page('/about', handler);
при strict: false:
/about/about/оба маршрута попадут в обработчик
при strict: true:
/about/ не будет соответствовать маршрутуИспользование оправдано в случаях:
decodeURLComponentsКонтролирует декодирование параметров URL.
page.decodeURLComponents = true;
При включении:
decodeURIComponentПример:
/user/%D0%98%D0%B2%D0%B0%D0%BD
→ превращается в:
Иван
Если отключить:
page.decodeURLComponents = false;
По умолчанию Page.js использует history.pushState.
page.start();
Это обеспечивает:
#hashbang режим)Если требуется поддержка старых браузеров или сервер не настроен:
page({
hashbang: true
});
URL принимает вид:
/#!/about
Особенности:
location.hashpage({
pushState: false
});
Результат аналогичен hashbang, но без
!:
#/about
clickКонтролирует автоматический перехват кликов по ссылкам.
page({
click: false
});
Если отключено:
<a>
кликиПо умолчанию:
перехватываются клики:
target="_blank"downloadЭто поведение предотвращает полную перезагрузку страницы.
popstateУправляет обработкой события popstate.
page({
popstate: false
});
Если отключено:
Используется в случаях:
dispatchОпределяет, нужно ли сразу обрабатывать текущий URL при старте.
page({
dispatch: false
});
Поведение:
true (по умолчанию) — текущий маршрут обрабатывается
сразуfalse — требуется ручной вызовpage.start({ dispatch: false });
page.show(location.pathname);
Полезно:
hashbangРасширение для hash-навигации:
page({
hashbang: true
});
Разница:
#/path — стандартный hash#!/path — hashbangИсторически использовался для:
Page.js не имеет отдельной встроенной опции, но позволяет задать fallback:
page('*', notFoundHandler);
Альтернативный способ:
page((ctx, next) => {
if (!ctx.handled) {
notFoundHandler(ctx);
}
});
Где:
ctx.handled — флаг успешного совпадения маршрутаКонтекст (ctx) формируется с учетом конфигурации:
ctx.path — текущий путьctx.params — параметры маршрутаctx.querystring — строка запросаctx.hash — якорьНекоторые параметры зависят от опций:
decodeURLComponentsstrictbaseПример полной конфигурации:
page.base('/app');
page({
click: true,
popstate: true,
dispatch: true,
hashbang: false
});
page.strict(false);
page.decodeURLComponents = true;
page.start();
Особенности:
base должен устанавливаться до маршрутовstart() — последняя операцияPage.js не поддерживает изолированные конфигурации для разных групп маршрутов. Все опции глобальны:
base для разных модулейclick для отдельных
маршрутовРешение:
Middleware-функции получают уже обработанный контекст:
page((ctx, next) => {
console.log(ctx.path);
next();
});
Влияние опций:
base — изменяет ctx.pathstrict — влияет на совпадение маршрутаdecodeURLComponents — влияет на
ctx.paramsТипичные проблемы:
Причины:
basestrictПричины:
dispatch: true + ручной вызов
page.show()Причины:
popstateДля SPA в продакшене:
page.base('/');
page.strict(false);
page.start();
Для подкаталога:
page.base('/app');
page.start();
Для старых браузеров:
page({
hashbang: true
});
Для полного контроля:
page({
click: false,
popstate: false,
dispatch: false
});
click: true — добавляет глобальный обработчик
событийpopstate: true — подписка на историю браузераdispatch: true — мгновенный вызов маршрутаОптимизация:
Page.js не предоставляет API для пользовательских опций, но можно:
ctxpage((ctx, next) => {
ctx.user = getUser();
next();
});
Конфигурация маршрутизатора должна соответствовать серверной настройке:
base должен совпадать с серверным роутингомpushState сервер должен отдавать
index.html для всех маршрутовПример для Express:
app.get('*', (req, res) => {
res.sendFile('index.html');
});
start()Решение: