Element Plus — это современная библиотека компонентов для Vue 3, разработанная с учетом модульности и гибкости. При использовании серверного рендеринга (SSR) важно учитывать ряд специфических особенностей, связанных с гидратацией компонентов, управлением состоянием и стилизацией.
При SSR критически важно, чтобы состояние компонентов на сервере совпадало с состоянием на клиенте. Element Plus активно использует внутренние идентификаторы для компонентов, таких как диалоги, уведомления и селекты. Несовпадение этих идентификаторов может приводить к предупреждениям о несоответствии контента при гидратации:
import { ElMessage } from 'element-plus';
ElMessage({
message: 'Привет из SSR!',
type: 'success'
});
При рендеринге на сервере необходимо избегать вызовов, которые
напрямую манипулируют DOM, так как на сервере DOM отсутствует.
Компоненты, генерирующие динамические ID, должны использовать
универсальные стратегии генерации, например
useId или uuid с предсказуемым начальным
значением.
Element Plus использует CSS-in-JS подход с injection для многих динамических компонентов. В SSR необходимо гарантировать, что стили компонента включены в серверный HTML, иначе при гидратации на клиенте произойдет “мерцание” или нарушение дизайна.
Пример подключения стилей для SSR:
import 'element-plus/dist/index.css';
Для динамических тем важно инжектировать стили через
ssrContext:
app.use(ElementPlus, {
ssr: true
});
Teleport и модальных компонентовКомпоненты Element Plus, такие как ElDialog и
ElPopover, используют Teleport для рендеринга
в конец body. В SSR Teleport не работает
напрямую, так как DOM отсутствует. Решения:
v-if="isClient".onMounted:<template>
<el-dialog v-if="mounted" title="SSR Диалог">
Контент
</el-dialog>
</template>
<script>
import { ref, onMounted } from 'vue';
export default {
setup() {
const mounted = ref(false);
onMounted(() => {
mounted.value = true;
});
return { mounted };
}
}
</script>
Компоненты ElSelect и ElAutocomplete часто
используют асинхронные источники данных. В SSR важно:
v-model для синхронизации выбранного
значения между сервером и клиентом.fetch в onMounted, если
требуется первичная серверная отрисовка.<el-select v-model="selected" placeholder="Выберите элемент">
<el-option
v-for="item in options"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
Для корректной работы SSR рекомендуется:
import { ElButton, ElInput } from 'element-plus';
app.component(ElButton.name, ElButton);
app.component(ElInput.name, ElInput);
import ElementPlus from 'element-plus';
import 'element-plus/theme-chalk/index.css';
app.use(ElementPlus, { ssr: true });
Компоненты ElMessage, ElNotification,
ElMessageBox создают контейнеры динамически. На сервере это
недопустимо. Практика:
onMounted.setup, если
есть SSR.import { onMounted } from 'vue';
import { ElMessage } from 'element-plus';
onMounted(() => {
ElMessage.success('Привет с клиента!');
});
ssrContext или глобальные CSS.v-if и onMounted для
компонентов, требующих клиентский DOM (Teleport,
уведомления, диалоги).Эти практики обеспечивают стабильную работу Element Plus в серверном рендеринге, предотвращают ошибки гидратации и сохраняют корректный визуальный стиль при переходе с SSR на клиент.