Hydration — это процесс «оживления» уже сгенерированного на сервере HTML с помощью JavaScript на клиенте. В контексте Vue.js он применяется в серверной отрисовке (SSR, Server-Side Rendering), где HTML создаётся на сервере и отправляется пользователю для ускоренной загрузки и улучшенной SEO. После получения HTML на клиенте Vue подключает свои реактивные системы и события к существующим DOM-элементам, превращая статический контент в интерактивный.
При традиционной клиентской отрисовке (CSR, Client-Side Rendering) браузер получает пустой HTML и заполняет его данными с помощью JavaScript. В SSR HTML уже содержит готовую разметку, но без реактивности Vue. Hydration решает эту проблему, выполняя следующие задачи:
v-on, v-model) начинают работать
как в обычном SPA.Процесс Hydration в Vue можно разделить на несколько этапов:
Серверная генерация HTML Сервер рендерит компоненты Vue в HTML с актуальными данными, например:
<div id="app">
<h1>Список задач</h1>
<ul>
<li>Купить продукты</li>
<li>Сделать домашку</li>
</ul>
</div>
Этот HTML уже виден пользователю и индексируется поисковыми системами.
Подключение клиентского приложения На клиент
загружается JavaScript-бандл Vue. Основная задача скрипта — найти
контейнер (#app) и «подключить» Vue к существующему
DOM:
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')Сравнение структуры и повторная инициализация компонентов Vue проверяет, совпадает ли виртуальное дерево (virtual DOM), созданное на клиенте, с серверным HTML. Если структура идентична, происходит hydration, иначе Vue выполняет полную перерисовку.
Восстановление реактивности и событий После успешного сопоставления элементов с виртуальным деревом Vue добавляет:
@click, @input)computed)Идентичность HTML Любые различия между серверным
и клиентским рендером могут привести к предупреждениям в консоли и
повторной отрисовке. Например, разный порядок элементов в списке
v-for или случайные идентификаторы нарушат процесс
Hydration.
Производительность Hydration быстрее полной клиентской отрисовки, но требует больше памяти и вычислительных ресурсов на клиенте, чем статический HTML. В больших приложениях иногда применяют частичную гидратацию (partial hydration), когда интерактивность подключается только к нужным компонентам.
Асинхронные данные Для корректной гидратации
данные должны быть доступны как на сервере, так и на клиенте. Vue
предоставляет механизмы передачи состояния через
window.__INITIAL_STATE__ или специальные хранилища
(например, Pinia/ Vuex).
createSSRApp Для SSR используется
не createApp, а createSSRApp, который
специально оптимизирован для серверного рендеринга и последующего
Hydration:
import { createSSRApp } from 'vue'
import App from './App.vue'
const app = createSSRApp(App)
app.mount('#app')v-once и статический контент Для
статических частей интерфейса можно использовать директиву
v-once, чтобы избежать ненужной гидратации и ускорить
процесс.
Совмещение с Nuxt.js Nuxt автоматически
управляет Hydration и состоянием между сервером и клиентом. Разработчику
важно следить за корректным использованием асинхронных данных через
asyncData или useFetch.
Hydration обеспечивает плавный переход от статического HTML к полноценному интерактивному приложению. Понимание его механизма позволяет создавать высокопроизводительные приложения, сохраняющие SEO и пользовательский опыт без лишней нагрузки на клиентскую часть.