При работе с Page.js, легковесным клиентским роутером для одностраничных приложений на JavaScript, правильная организация файлового дерева является ключевым аспектом удобного масштабирования проекта и поддержки кода.
/src Основная папка, содержащая
исходный код приложения. Обычно включает:
index.js – точка входа приложения, где
инициализируется Page.js и подключаются глобальные стили, компоненты и
маршруты.routes/ – директория для отдельных
маршрутов и обработчиков страниц.views/ – шаблоны или компоненты,
отвечающие за отображение страниц.components/ – переиспользуемые
UI-компоненты.utils/ – вспомогательные функции и
утилиты.assets/ – изображения, шрифты и другие
статические ресурсы.Пример структуры:
src/
├─ index.js
├─ routes/
│ ├─ home.js
│ ├─ about.js
│ └─ contact.js
├─ views/
│ ├─ homeView.js
│ ├─ aboutView.js
│ └─ contactView.js
├─ components/
│ ├─ header.js
│ ├─ footer.js
│ └─ modal.js
├─ utils/
│ ├─ api.js
│ └─ helpers.js
└─ assets/
├─ styles.css
├─ logo.png
└─ fonts/
Page.js работает по принципу сопоставления URL с функциями-обработчиками. Для поддерживаемого масштабируемого приложения рекомендуется разделять:
routes/) – здесь
определяется логика маршрутизации и middleware:import page from 'page';
import { homeView } from '../views/homeView.js';
import { aboutView } from '../views/aboutView.js';
page('/', homeView);
page('/about', aboutView);
page();
views/) – функции или
классы, которые формируют DOM или возвращают HTML-шаблон:export function homeView(ctx, next) {
document.querySelector('#app').innerHTML = `<h1>Главная страница</h1>`;
}
export function aboutView(ctx, next) {
document.querySelector('#app').innerHTML = `<h1>О нас</h1>`;
}
Такое разделение повышает читаемость и облегчает тестирование отдельных частей приложения.
Все элементы интерфейса, которые повторяются на разных страницах
(например, навигация, футер, модальные окна), помещаются в
components/. Это позволяет избежать
дублирования кода и централизованно управлять UI.
Пример компонента:
export function header() {
const headerEl = document.createElement('header');
headerEl.innerHTML = `
<nav>
<a href="/" data-link>Главная</a>
<a href="/about" data-link>О нас</a>
</nav>
`;
return headerEl;
}
И вставка в страницу:
document.querySelector('#app').prepend(header());
Для крупных приложений имеет смысл выносить маршруты в отдельные файлы и загружать их асинхронно, чтобы сократить начальный размер бандла:
page('/contact', async () => {
const module = await import('../views/contactView.js');
module.contactView();
});
Это позволяет Page.js обрабатывать маршруты динамически, загружая код только при необходимости.
assets/ – хранятся CSS, изображения,
шрифты и иконки.index.html или
динамически через JavaScript.Пример подключения стилей в index.js:
import './assets/styles.css';
Главный файл (index.js) содержит настройку роутера и
базовую структуру приложения:
import page from 'page';
import { header } from './components/header.js';
import { homeView } from './routes/home.js';
import { aboutView } from './routes/about.js';
document.body.prepend(header());
page('/', homeView);
page('/about', aboutView);
page();
page() в конце активирует
маршрутизатор.data-link или
использовать preventDefault() для корректной работы без
перезагрузки страницы./assets и
/utils: хранение стилей, скриптов и утилит
отдельно упрощает навигацию по проекту.Такой подход к структуре файлов обеспечивает удобство масштабирования, легкость тестирования и читабельность кода, делая работу с Page.js эффективной даже для больших одностраничных приложений.