Объект Context в библиотеке Page.js представляет собой
центральную сущность, которая передаётся в обработчики маршрутов и
содержит всю информацию о текущем переходе. Он создаётся автоматически
при каждом совпадении маршрута и используется для доступа к параметрам
URL, данным запроса и состоянию навигации.
Каждый экземпляр Context формируется на основе текущего
URL и конфигурации маршрута, обеспечивая единый интерфейс для работы с
навигацией в одностраничных приложениях.
ctx.pathСодержит путь URL без домена и протокола.
// URL: /users/42
ctx.path === '/users/42'
Используется для анализа текущего маршрута и построения логики переходов.
ctx.paramsОбъект с параметрами маршрута, извлечёнными из динамических сегментов.
page('/users/:id', (ctx) => {
console.log(ctx.params.id);
});
При переходе на /users/42:
ctx.params = {
id: '42'
}
Особенности:
ctx.querystringСтрока запроса без символа ?.
// URL: /search?q=test&page=2
ctx.querystring === 'q=test&page=2'
Полезно при необходимости ручного разбора параметров.
ctx.queryОбъект, содержащий разобранные GET-параметры.
ctx.query = {
q: 'test',
page: '2'
}
Особенности:
querystringctx.hashСодержимое якоря URL (часть после #).
// URL: /docs#section1
ctx.hash === 'section1'
Используется для навигации внутри страницы или управления состоянием интерфейса.
ctx.pathnameПуть без query-параметров и hash.
// URL: /products?category=books#top
ctx.pathname === '/products'
Удобен для сравнения маршрутов без учёта дополнительных данных.
ctx.stateОбъект состояния, переданный через History API.
page('/profile', (ctx) => {
console.log(ctx.state);
});
Может содержать произвольные данные:
page.show('/profile', { from: 'home' });
Результат:
ctx.state = {
from: 'home'
}
Используется для передачи данных между маршрутами без изменения URL.
ctx.titleЗаголовок документа, связанный с текущим маршрутом.
ctx.title = 'Профиль пользователя';
При наличии может быть применён к document.title.
ctx.canonicalPathПолный путь с учётом querystring.
// URL: /search?q=test
ctx.canonicalPath === '/search?q=test'
Отличается от path, так как включает строку запроса.
ctx.prevСодержит предыдущий путь перед текущим переходом.
ctx.prev === '/home'
Используется для:
ctx.push(path, state)Программный переход на новый маршрут.
ctx.push('/dashboard');
С передачей состояния:
ctx.push('/dashboard', { ref: 'login' });
Особенности:
ctx.save()Сохраняет текущее состояние в истории.
Используется редко, в специфических сценариях:
ctx.save();
Context является изменяемым объектом, что позволяет
расширять его в middleware:
page('*', (ctx, next) => {
ctx.user = { name: 'Alice' };
next();
});
В последующих обработчиках:
page('/profile', (ctx) => {
console.log(ctx.user.name);
});
Context передаётся по цепочке функций:
page('/admin',
checkAuth,
loadData,
renderPage
);
Каждая функция получает один и тот же объект:
function checkAuth(ctx, next) {
if (!ctx.user) return page.redirect('/login');
next();
}
Context тесно связан с History API браузера:
ctx.state → history.statectx.push() → history.pushState()Это обеспечивает:
page('*', (ctx, next) => {
ctx.isMobile = /mobile/i.test(navigator.userAgent);
next();
});
page('/posts/:id',
loadPost,
renderPost
);
function loadPost(ctx, next) {
ctx.post = fetchPost(ctx.params.id);
next();
}
function renderPost(ctx) {
display(ctx.post);
}
page('/search', (ctx) => {
const query = ctx.query.q || '';
performSearch(query);
});
page('/docs', (ctx) => {
if (ctx.hash) {
scrollToSection(ctx.hash);
}
});
params, query) представлены
строкамиВозможна интеграция с другими библиотеками путём добавления свойств:
page('*', (ctx, next) => {
ctx.api = apiClient;
next();
});
Такой подход превращает Context в контейнер зависимостей
для маршрутов.
Объект Context выступает связующим звеном между:
Он обеспечивает:
Благодаря своей структуре и расширяемости, Context
становится фундаментом для построения сложных клиентских приложений с
маршрутизацией на стороне клиента.