Element Plus предоставляет полный набор компонентов для Vue 3, которые могут быть интегрированы с серверным рендерингом (SSR). Основная цель оптимизации для SSR — обеспечить корректное отображение компонентов на сервере без ошибок гидратации на клиенте. Важно учитывать, что не все компоненты полностью поддерживают SSR «из коробки», особенно те, которые зависят от window, document или сторонних браузерных API.
Ключевые моменты:
Для интеграции Element Plus в SSR-проект создается серверная сборка с использованием Vite или Webpack:
npm install element-plus vue@3 vue-server-renderer
server.js или аналогичный файл с функцией
renderToString из @vue/server-renderer.app необходимо регистрировать все глобальные
компоненты Element Plus:import { createSSRApp } from 'vue';
import ElementPlus from 'element-plus';
import App from './App.vue';
export function createApp() {
const app = createSSRApp(App);
app.use(ElementPlus);
return { app };
}
Element Plus поддерживает поименный импорт компонентов, что уменьшает размер бандла:
import { ElButton, ElInput } from 'element-plus';
Для SSR это критично: ненужные компоненты не рендерятся на сервере, сокращая время генерации HTML.
Dynamic import можно использовать для компонентов с тяжелой логикой или интерактивностью:
const AsyncDialog = defineAsyncComponent(() =>
import('element-plus/es/components/dialog')
);
Для элементов интерфейса, отображаемых выше «фолда» страницы, стоит использовать critical CSS и SSR для полного рендера на сервере, чтобы пользователь сразу видел готовый интерфейс.
Element Plus активно использует Teleport для всплывающих компонентов (модальные окна, dropdown, popover). При SSR:
Контент модального окна
Это предотвращает ошибки гидратации и корректно рендерит интерфейс на сервере.
Компоненты Element Plus часто используют внутреннее состояние
(ref, reactive). Для SSR:
Пример передачи состояния:
const app = createSSRApp(App);
const store = createPinia();
app.use(store);
const html = await renderToString(app, {
// встраиваем состояние store в HTML
});
Типичные ошибки:
Решения:
typeof window !== 'undefined'.onMounted или
client-only компоненты:
{{ i }}
Nuxt 3 поддерживает Element Plus через модуль
@element-plus/nuxt. Ключевые настройки:
export default defineNuxtConfig({
modules: ['@element-plus/nuxt'],
elementPlus: {
components: 'all', // можно использовать selective-import для уменьшения бандла
importStyle: 'sass'
}
});
ssr: true для модулей и корректная
инициализация Teleport.