Hydration — это процесс «оживления» статически сгенерированного HTML на клиенте с помощью Vue, на котором основана библиотека Element Plus. В современных SPA и SSR-приложениях (Server-Side Rendering) hydration позволяет браузеру эффективно подключить интерактивность к уже отрендеренной сервером разметке, минимизируя время до полной загрузки функционала компонентов.
При SSR сервер генерирует готовый HTML, включая компоненты
Element Plus, такие как el-button,
el-input, el-dialog. На клиенте Vue
идентифицирует эти элементы и привязывает к ним реактивные данные и
обработчики событий. Этот процесс и называется hydration.
Ключевые аспекты:
@click, @change и т.д., подключаются без
пересоздания элементов.Для корректной работы компонентов Element Plus при SSR необходимо импортировать стили и скрипты в точке входа клиента и сервера:
import { createApp } from 'vue';
import App from './App.vue';
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
const app = createApp(App);
app.use(ElementPlus);
app.mount('#app');
В случае SSR:
// client-entry.js
import { createApp } from './main';
const { app, router, store } = createApp();
router.isReady().then(() => {
app.mount('#app', true); // Второй аргумент true включает hydration
});
Здесь true указывает Vue использовать существующий HTML
при монтировании, а не создавать новый.
Компоненты Element Plus полностью поддерживают реактивность Vue. При hydration данные, переданные через props или store, автоматически синхронизируются с уже отрендеренной разметкой. Пример с диалогом:
<template>
<el-dialog :visible.sync="dialogVisible" title="Hydration Demo">
<p>Контент диалога</p>
</el-dialog>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const dialogVisible = ref(false);
return { dialogVisible };
}
}
</script>
При SSR сервер создаст HTML для el-dialog, а на клиенте
hydration подключит реактивную переменную dialogVisible,
обеспечивая полноценное взаимодействие.
Hydration критичен для компонентов с интерактивными элементами: кнопки, переключатели, селекты и формы Element Plus. Все обработчики событий привязываются без пересоздания DOM:
<template>
<el-button @click="handleClick">Нажми меня</el-button>
</template>
<script>
export default {
methods: {
handleClick() {
console.log('Кнопка нажата');
}
}
}
</script>
При hydration el-button сохраняет серверный HTML и лишь
подключает handleClick.
Несовпадение серверного и клиентского DOM Если props или данные изменяются между SSR и клиентским рендером, Vue выдаст предупреждение:
Hydration failed: mismatched text content
Решение: убедиться, что начальные данные на сервере и клиенте одинаковы.
Преждевременное монтирование компонента
Монтирование без ожидания router.isReady() может привести к
потере состояния или неправильной интерактивности.
Неиспользование :visible.sync для диалогов и
всплывающих окон Для компонентов, скрытых по умолчанию, важно
использовать реактивное связывание, чтобы hydration корректно подключил
состояние видимости.
Для динамических компонентов el-table,
el-select, el-carousel hydration важен для
корректного отображения начальных данных:
<el-table :data="tableData">
<el-table-column prop="name" label="Имя"/>
<el-table-column prop="age" label="Возраст"/>
</el-table>
Если tableData отличается на клиенте и сервере, Vue
заменит весь DOM таблицы, что снижает эффективность hydration. Поэтому
начальные данные должны совпадать.
Hydration обеспечивает плавную интеграцию Element
Plus компонентов в SSR-приложения, позволяя сохранить
интерактивность, реактивность и производительность. Корректное
использование mount с параметром true,
синхронизация данных и привязка событий — ключевые аспекты успешной
реализации.