Preact предоставляет лёгкую и производительную альтернативу React, сохраняя знакомый API, включая возможности декларативной маршрутизации. Маршрутизация в Preact часто реализуется с помощью библиотеки preact-router, которая обеспечивает управление навигацией через компоненты и URL.
Для использования маршрутизации необходимо установить пакет:
npm install preact-router
После установки импортируются ключевые элементы:
import { h } from 'preact';
import Router from 'preact-router';
import { route } from 'preact-router';
Router — основной компонент, который управляет
отображением маршрутов.route — функция программной навигации между
маршрутами.Маршруты определяются внутри компонента Router с помощью
атрибута path у дочерних компонентов:
const Home = () => <h1>Главная</h1>;
const About = () => <h1>О сайте</h1>;
const Profile = ({ username }) => <h1>Профиль: {username}</h1>;
const App = () => (
<Router>
<Home path="/" />
<About path="/about" />
<Profile path="/profile/:username" />
</Router>
);
Особенности определения маршрутов:
:username).
Они автоматически передаются компоненту как пропсы.*) для обработки
несуществующих страниц.Функция route позволяет изменять маршрут без
перезагрузки страницы:
import { route } from 'preact-router';
const goToProfile = (username) => {
route(`/profile/${username}`);
};
Использование route особенно удобно для переходов после
событий, таких как отправка формы или нажатие кнопки.
Компонент Router поддерживает событие
onChange, которое вызывается при любом изменении
маршрута:
const handleRoute = (e) => {
console.log('Новый путь:', e.url);
};
<Router onCha nge={handleRoute}>
<Home path="/" />
<About path="/about" />
</Router>
Событие onChange предоставляет объект с параметрами:
url — новый путьprevious — предыдущий путьmatches — массив совпадающих маршрутовЭто полезно для аналитики, логирования или динамического изменения состояния приложения.
Для крупных приложений важно оптимизировать загрузку компонентов.
Preact поддерживает ленивую загрузку через динамический
import:
import { lazy } from 'preact/compat';
const LazyAbout = lazy(() => import('./About'));
const App = () => (
<Router>
<Home path="/" />
<LazyAbout path="/about" />
</Router>
);
Это позволяет разделять код и уменьшить первоначальный размер бандла.
Preact-router не имеет встроенной поддержки вложенных маршрутов, но
их можно реализовать с помощью дочерних компонентов
Router:
const Dashboard = () => (
<Router>
<Stats path="/dashboard/stats" />
<Settings path="/dashboard/settings" />
</Router>
);
В этом случае родительский маршрут может включать дочерние маршруты, создавая иерархию страниц.
Для редиректов используется route с флагом замены
истории:
route('/login', true); // заменяет текущий путь
Для обработки несуществующих маршрутов удобно использовать wildcard:
const NotFound = () => <h1>Страница не найдена</h1>;
<Router>
<Home path="/" />
<NotFound default />
</Router>
Атрибут default гарантирует отображение компонента, если
ни один путь не совпал.
onChange для отслеживания
навигации и аналитики.default.Декларативная маршрутизация в Preact позволяет строить легковесные и производительные SPA-приложения, сочетая простоту с гибкостью управления навигацией.