Preact — это легковесная альтернатива React, сохраняющая совместимость с его основными концепциями: виртуальный DOM, JSX, компонентная структура, хуки. Основное отличие заключается в размере библиотеки: Preact весит около 3 КБ, что значительно уменьшает время загрузки приложений и улучшает производительность, особенно на мобильных устройствах и при медленном соединении.
Другие ключевые различия:
useLayoutEffect, могут
вести себя иначе из-за различий в жизненном цикле Preact.forwardRef поддерживаются, но
внутренние механизмы обновления компонента проще, что иногда меняет
поведение сложных рефов.npm install preact preact-compat
// webpack.config.js
resolve: {
alias: {
'react': 'preact/compat',
'react-dom/test-utils': 'preact/test-utils',
'react-dom': 'preact/compat',
},
}
В Vite замена выполняется через плагин
@preact/preset-vite:
import { defineConfig } from 'vite';
import preact from '@preact/preset-vite';
export default defineConfig({
plugins: [preact()],
});
preact/compat, но нужно убедиться, что используемые функции
React поддерживаются.Preact использует функциональные компоненты и поддерживает хуки так же, как React:
import { h } from 'preact';
import { useState } from 'preact/hooks';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>{count}</p>
<button onCl ick={() => setCount(count + 1)}>Увеличить</button>
</div>
);
}
Особенности при миграции:
preact/compat, но производительность будет ниже, чем у
функциональных компонентов с хуками.shouldComponentUpdate в классах часто заменяется хуком
memo для оптимизации рендеринга.Preact поддерживает большинство стандартных хуков React:
useState, useEffect,
useContext, useReducer, useRef,
useMemo, useCallback.useLayoutEffect в
браузерах с высокой задержкой.Пример использования контекста:
import { createContext } from 'preact';
import { useContext } from 'preact/hooks';
const ThemeContext = createContext('light');
function ThemedButton() {
const theme = useContext(ThemeContext);
return <button className={theme}>Кнопка</button>;
}
Preact автоматически минимизирует количество обновлений DOM, но для крупных проектов рекомендуется:
memo для компонентов с неизменяемыми
пропсами.useEffect и
useLayoutEffect для предотвращения лишних вызовов.С Preact совместимы большинство популярных React-библиотек через
preact/compat. Однако:
act() в Preact отличается от React.import { h } from 'preact';
import { Router, Route } from 'preact-router';
import Home from './Home';
import About from './About';
function App() {
return (
<Router>
<Route path="/" component={Home} />
<Route path="/about" component={About} />
</Router>
);
}
preact/compat.preact/compat.preact и preact/compat.memo и разбивку
компонентов.Preact позволяет значительно уменьшить размер бандла и ускорить загрузку приложения, сохраняя привычную структуру React-компонентов и работу с хуками. Миграция требует внимательного анализа сторонних библиотек и компонентов с классами, но при соблюдении правил совместимости процесс проходит относительно гладко.