Гидрация (hydration) в Preact представляет собой процесс связывания уже отрендеренного на сервере HTML с клиентским виртуальным DOM, чтобы приложение стало интерактивным без полной перерисовки интерфейса. В отличие от обычного рендеринга на клиенте, гидрация позволяет сократить время до первой интерактивной отрисовки (Time to Interactive) и уменьшить нагрузку на браузер.
Совпадение структуры DOM Для успешной гидрации HTML, сгенерированный на сервере, должен точно соответствовать виртуальному DOM на клиенте. Любое расхождение может привести к предупреждениям или к перерисовке элемента, что снижает производительность.
Минимизация повторной работы браузера Гидрация использует существующие DOM-узлы, вместо того чтобы их полностью удалять и заново создавать. Это критически важно для крупных страниц с большим количеством компонентов.
Состояние компонентов Компоненты, рендеренные на сервере, могут содержать заранее вычисленное состояние. При гидрации это состояние передается в клиентский рендер, что позволяет избежать лишних запросов или вычислений.
preact.hydrateВ Preact для гидрации применяется функция hydrate:
import { hydrate } from 'preact';
import App from './App';
const rootElement = document.getElementById('root');
hydrate(<App />, rootElement);
Ключевые моменты:
hydrate принимает JSX-компонент и корневой
DOM-элемент.rootElement уже должны содержать HTML,
сгенерированный на сервере.renderМетод render создаёт новые DOM-узлы и заменяет
содержимое целевого контейнера. hydrate использует
существующую разметку, что позволяет:
Пример различия:
import { render, hydrate } from 'preact';
import App from './App';
const container = document.getElementById('root');
// render создаст новые DOM-узлы
render(<App />, container);
// hydrate использует существующие узлы
hydrate(<App />, container);
При работе с гидрацией важно учитывать синхронизацию состояния:
<div id="root"><!-- HTML приложения --></div>
<script>
window.__INITIAL_STATE__ = { user: { name: 'Иван' } };
</script>
import { useState } from 'preact/hooks';
import { hydrate } from 'preact';
import App from './App';
const initialState = window.__INITIAL_STATE__;
hydrate(<App initialState={initialState} />, document.getElementById('root'));
Это позволяет избежать повторного запроса данных после загрузки страницы.
При гидрации Preact автоматически привязывает обработчики событий к уже существующим DOM-элементам. Для корректной работы необходимо:
import { lazy, Suspense } from 'preact/compat';
const LazyComponent = lazy(() => import('./LazyComponent'));
<Suspense fallback={<div>Загрузка...</div>}>
<LazyComponent />
</Suspense>
Минимизация разметки на сервере Чем проще структура HTML, тем меньше вероятность расхождения с виртуальным DOM, а значит, меньше ресурсов тратится на исправление несоответствий.
Синхронизация состояний Передача данных с сервера в клиент снижает количество дополнительных рендеров и запросов.
componentDidMount или
useEffect до завершения гидрации. В результате возможны
лишние перерисовки.Warning: Did not expect server HTML to contain a ...
указывают на расхождение серверного и клиентского DOM.Гидрация в Preact обеспечивает быстрый и плавный переход от статического серверного HTML к интерактивному приложению на клиенте, позволяя использовать преимущества серверного рендера без потери производительности. Правильная организация компонентов, стабильность разметки и синхронизация состояния являются ключевыми факторами успешной гидрации.