Page.js — это легковесная библиотека для маршрутизации в одностраничных приложениях (SPA) на JavaScript. Она позволяет управлять переходами между различными представлениями без перезагрузки страницы. Важным аспектом является различие между внутренними и внешними ссылками, так как обработка каждого типа требует разного подхода.
Внутренние ссылки — это ссылки, ведущие на страницы
внутри текущего приложения. Их обработка полностью контролируется
Page.js через функцию page(path, callback). Внешние
ссылки — это ссылки на ресурсы за пределами SPA. Они должны
открываться стандартным образом через браузер.
Для корректной работы внутренних ссылок используется синтаксис:
page('/home', () => {
console.log('Отображение домашней страницы');
});
page('/about', () => {
console.log('Отображение страницы "О нас"');
});
Page.js перехватывает клики по ссылкам с атрибутом href
внутри приложения. Для этого необходимо подключить обработчик:
document.addEventListener('click', function(e) {
const target = e.target.closest('a[href]');
if (!target) return;
const href = target.getAttribute('href');
if (href.startsWith('http') || href.startsWith('//')) return;
e.preventDefault();
page.show(href);
});
Ключевой момент: важно проверять, чтобы ссылка не вела на внешний ресурс. В противном случае браузер должен открыть её стандартным образом.
Внешние ссылки, как правило, имеют абсолютный URL или протокол
http/https. Page.js не должен перехватывать такие переходы.
Можно использовать следующие подходы:
target="_blank" для открытия в
новой вкладке:<a href="https://example.com" target="_blank">Внешний ресурс</a>
if (href.startsWith('http') || href.startsWith('//')) return;
Это предотвращает конфликт между SPA и обычной навигацией.
Page.js предоставляет метод
page.show(path, [state], [dispatch]) для программного
перехода:
// Переход на внутреннюю страницу
page.show('/about');
// Переход с добавлением состояния
page.show('/profile', { userId: 123 });
Метод page.show полезен для динамических переходов,
например, после отправки формы или клика по кнопке, которая не является
ссылкой <a>.
Page.js позволяет использовать динамические сегменты URL:
page('/user/:id', (ctx) => {
console.log(`Пользователь с ID: ${ctx.params.id}`);
});
При этом ссылки на такие маршруты могут быть сформированы как:
<a href="/user/42">Профиль пользователя 42</a>
Page.js автоматически подставит значение параметра в объект
ctx.params.
Для контроля переходов можно использовать middleware:
page('*', (ctx, next) => {
console.log(`Навигация на: ${ctx.path}`);
next();
});
Такой подход позволяет добавлять логирование, авторизацию и другие промежуточные действия до загрузки контента.
SPA с Page.js может сталкиваться с проблемами SEO при использовании внутренних ссылок, так как поисковые роботы могут не выполнять JavaScript. Для внешних ссылок это не критично, так как они открываются стандартным образом. Рекомендуется:
<a href> даже
при программной навигации.rel="noopener noreferrer" для внешних ссылок,
открывающихся в новой вкладке, чтобы повысить безопасность и
производительность.При неправильном URL или отсутствии маршрута важно определить обработку 404:
page('*', () => {
document.body.innerHTML = '<h1>Страница не найдена</h1>';
});
Это универсальный обработчик для всех ссылок, включая внутренние и потенциально некорректные внешние переходы внутри приложения.
page.show
позволяет переходить без клика по <a>.page.show предотвращает
случайный перехват внешних ссылок.Эти принципы позволяют создать устойчивую навигацию в SPA, где внутренние ссылки управляются библиотекой Page.js, а внешние остаются стандартными, без конфликтов и неожиданных перезагрузок страницы.