Preact — это лёгкий и быстрый альтернативный фреймворк для создания интерфейсов, совместимый с экосистемой React, но с меньшим размером и упрощённой архитектурой. Работа с Preact часто подразумевает использование сторонних библиотек и зависимостей для расширения функциональности и интеграции с современными инструментами разработки.
preact Основной пакет, реализующий виртуальный DOM и компонентную модель. Предоставляет базовые функции:
h() — создание виртуальных узлов.Component — базовый класс для классовых
компонентов.render() — рендеринг компонентов в DOM.preact/hooks Поддержка хуков, аналогичных React. Позволяет управлять состоянием и жизненным циклом компонентов через функциональные конструкции:
useState() — локальное состояние компонента.useEffect() — побочные эффекты.useRef() — сохранение ссылок на DOM-элементы или
значения между рендерами.useContext() — доступ к контексту.preact/compat Совместимость с библиотеками,
написанными для React. Позволяет использовать существующие пакеты из
экосистемы React без переписывания кода. Чаще всего применяется вместе с
alias в сборщиках типа Webpack или Vite:
resolve: {
alias: {
react: 'preact/compat',
'react-dom': 'preact/compat'
}
}Preact не требует отдельного сборщика, но для современных приложений часто используются:
Webpack Позволяет организовать модульную структуру проекта, подключать стили и изображения, оптимизировать сборку. Важные плагины для Preact:
babel-loader — транспиляция современного
JavaScript/JSX.html-webpack-plugin — генерация HTML-файла с
подключёнными скриптами.Vite Быстрый инструмент сборки, поддерживающий
Preact из коробки через плагин @preact/preset-vite.
Обеспечивает мгновенную перезагрузку модулей (HMR) и минимизацию
сборки.
Babel Транспиляция JSX в вызовы h()
для Preact. Конфигурация включает пресет @babel/preset-env
и плагин @babel/plugin-transform-react-jsx с указанием
pragma: 'h'.
Хотя Preact предоставляет базовые хуки, для сложных приложений часто применяются сторонние библиотеки:
Пример использования сигналов:
import { useSignal } from '@preact/signals';
const counter = useSignal(0);
function Counter() {
return (
<button onCl ick={() => counter.value++}>
{counter.value}
</button>
);
}
Preact не содержит встроенного роутера. Для навигации применяются внешние пакеты:
Пример маршрутизации с preact-router:
import Router from 'preact-router';
import Home from './pages/Home';
import About from './pages/About';
function App() {
return (
<Router>
<Home path="/" />
<About path="/about" />
</Router>
);
}
CSS и CSS-in-JS
styled-components через preact/compat.UI-библиотеки
preact/compat.preact-material-components, preact-mdc.Для оптимальной работы Preact-приложений применяются дополнительные зависимости:
Использование сигналов и мемоизации компонентов (memo)
снижает количество лишних рендеров:
import { memo } from 'preact/compat';
const ExpensiveComponent = memo(({ data }) => {
// тяжелая отрисовка
});
package-lock.json,
pnpm-lock.yaml) обеспечивают стабильные сборки.Современные проекты Preact обычно включают минимальный набор
зависимостей: основной Preact, роутер, хуки и инструменты сборки.
Остальные пакеты добавляются по необходимости, учитывая совместимость
через preact/compat.
Эта структура зависимостей и библиотек обеспечивает лёгкость, скорость и масштабируемость приложений на Preact, позволяя использовать преимущества как нативного фреймворка, так и богатой экосистемы React.