Preact — это лёгкий и быстрый альтернативный вариант React, совместимый с его экосистемой. Основная цель интеграции Preact в существующие проекты — уменьшение размера бандла и ускорение загрузки без значительных изменений архитектуры.
Для большинства проектов с React возможна полная замена через alias в сборщике модулей, например, Webpack или Vite. Это позволяет использовать Preact без изменения существующего кода компонентов.
Пример конфигурации для Webpack:
resolve: {
alias: {
'react': 'preact/compat',
'react-dom/test-utils': 'preact/test-utils',
'react-dom': 'preact/compat',
'react/jsx-runtime': 'preact/jsx-runtime'
}
}
preact/compat обеспечивает совместимость с большинством
библиотек React.unstable_ функции) могут быть недоступны.Для Vite используется плагин @preact/preset-vite,
который автоматически подставляет необходимые алиасы:
import { defineConfig } from 'vite';
import preact from '@preact/preset-vite';
export default defineConfig({
plugins: [preact()]
});
Preact позволяет использовать инкрементальный подход: внедрять его в отдельные части приложения, оставляя остальной код на React. Это полезно для крупных проектов с большим количеством компонентов.
Шаги инкрементной интеграции:
preact/compat только для
выбранного модуля.Такой подход снижает риск ошибок и позволяет оценить производительность перед полной миграцией.
Preact хорошо сочетается с серверными рендерерами и статическими генераторами, например, Next.js, Express или даже PHP-шаблонами, через клиентский рендеринг:
import { h, render } from 'preact';
import App from './App';
const rootElement = document.getElementById('root');
render(<App />, rootElement);
h — функция для создания элементов Preact.render — метод, который монтирует компонент в DOM.Такой подход подходит для постепенного внедрения интерактивных элементов без полной переделки фронтенда.
Главное преимущество Preact — малый размер. Даже при полной замене React на Preact можно сократить бандл в 3–4 раза. Для оптимизации важно:
preact,
preact/hooks, preact/compat).Пример оптимизации с Vite:
build: {
minify: 'esbuild',
rollupOptions: {
treeshake: true
}
}
Preact поддерживает все основные хуки React: useState,
useEffect, useRef, useMemo,
useCallback. Их поведение практически идентично, что
облегчает миграцию существующих компонентов.
import { h } from 'preact';
import { useState, useEffect } from 'preact/hooks';
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setInterval(() => setCount(c => c + 1), 1000);
return () => clearInterval(timer);
}, []);
return <div>Счетчик: {count}</div>;
}
Особенности хуков в Preact:
useEffect и useLayoutEffect работают
аналогично React.useRef создаёт ссылку на DOM-элемент, но компонентные
refs также совместимы с preact/compat.Большинство React-библиотек работают через
preact/compat, однако есть исключения:
react-test-renderer, некоторые версии React Router) могут
требовать патчей.contextType без использования hooks иногда
вызывают несовместимость.preact/compat для Provider и
connect.Preact поддерживает серверный рендеринг через
preact-render-to-string. Это позволяет генерировать HTML на
сервере с последующей гидратацией на клиенте:
import { h } from 'preact';
import renderToString from 'preact-render-to-string';
import App from './App';
const html = renderToString(<App />);
Гидратация:
import { render } from 'preact';
render(<App />, document.getElementById('root'));
Preact не накладывает ограничений на стилизацию и управление состоянием:
preact/compat.preact/compat для работы с библиотеками
React.Интеграция Preact позволяет уменьшить нагрузку на клиент, ускорить рендер и поддерживать существующую архитектуру React с минимальными изменениями кода.