Постепенная миграция существующего проекта на Preact требует стратегического подхода. Основная цель — внедрение Preact без полной переработки приложения, минимизируя риски и сохраняя функциональность текущего кода.
Preact — лёгкая и производительная альтернатива React с совместимым API. Основные особенности, влияющие на миграцию:
preact/compat позволяет использовать существующие
React-компоненты и сторонние библиотеки без модификации кода.npm install preact preact/compat
Для Webpack достаточно добавить alias, чтобы React и ReactDOM подменялись на Preact:
resolve: {
alias: {
'react': 'preact/compat',
'react-dom': 'preact/compat'
}
}
Для Vite используется конфигурация:
import { defineConfig } from 'vite';
import preact from '@preact/preset-vite';
export default defineConfig({
plugins: [preact()]
});
Сначала идентифицируются участки кода, которые можно перенести в Preact без влияния на весь проект. Обычно это:
preact/compatpreact/compat позволяет подключать существующие
React-компоненты и сторонние библиотеки, что критично при миграции
крупных приложений. Пример использования:
import React from 'react';
import { render } from 'preact';
import App from './App';
render(<App />, document.getElementById('root'));
Preact полностью поддерживает хуки, поэтому классические компоненты
можно переписать на функциональные с useState,
useEffect и другими хуками:
// Было (React)
class Counter extends React.Component {
state = { count: 0 };
increment = () => this.setState({ count: this.state.count + 1 });
render() {
return <button onCl ick={this.increment}>{this.state.count}</button>;
}
}
// Стало (Preact)
import { useState } from 'preact/hooks';
function Counter() {
const [count, setCount] = useState(0);
return <button onCl ick={() => setCount(count + 1)}>{count}</button>;
}
Если проект использует React Router, можно заменить его на
preact-router или оставить через
preact/compat. Важно тестировать маршруты на каждом этапе
миграции, чтобы не нарушить навигацию.
Существующие библиотеки управления состоянием (Redux, Zustand, MobX)
работают с Preact через preact/compat. Для новых
компонентов можно использовать встроенные хуки:
useState для локального состояния;useReducer для сложной логики;useContext для глобального состояния без сторонних
библиотек.Пример интеграции с Redux:
import { Provider } from 'react-redux';
import store from './store';
import App from './App';
import { render } from 'preact/compat';
render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
preact/compat и React.lazy через динамический
импорт:import { Suspense, lazy } from 'preact/compat';
const LazyComponent = lazy(() => import('./LazyComponent'));
<Suspense fallback={<div>Загрузка...</div>}>
<LazyComponent />
</Suspense>
memo и useMemo помогает уменьшить лишние
обновления UI.<Fragment> позволяют
группировать элементы без лишнего DOM-узла.Постепенная миграция legacy-кода на Preact обеспечивает плавный переход, сохраняя стабильность приложения. Основные этапы:
preact/compat.Методика позволяет уменьшить риски, избежать полной переработки и повысить производительность без снижения функциональности существующего приложения.