Code splitting — это метод оптимизации фронтенд-приложений, при котором исходный JavaScript-код разделяется на отдельные части (чанки), которые загружаются по мере необходимости. В контексте Element Plus это особенно важно, так как библиотека включает большое количество компонентов, и подключение всей библиотеки целиком приводит к значительному увеличению размера бандла.
Полная библиотека vs. частичный импорт
Подключение всех компонентов:
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')
Такой подход прост, но приводит к большому бандлу, даже если используются лишь несколько компонентов.
Частичный импорт позволяет включать только необходимые компоненты:
import { ElButton, ElInput } from 'element-plus'
import 'element-plus/dist/index.css'
При этом размер бандла сокращается пропорционально количеству используемых компонентов.
Динамический импорт компонентов с
defineAsyncComponent
Vue 3 поддерживает ленивую загрузку через
defineAsyncComponent:
import { defineAsyncComponent } from 'vue'
const AsyncElTable = defineAsyncComponent(() =>
import('element-plus/es/components/table')
)
Компонент AsyncElTable будет загружен только при первом
рендере, что существенно снижает первоначальный вес бандла.
Vite автоматически выполняет tree-shaking, но при работе с Element Plus важно учесть несколько моментов:
Использовать плагин для автоматического импорта компонентов
// vite.config.js
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
export default {
plugins: [
Components({
resolvers: [ElementPlusResolver()],
}),
],
}
Плагин автоматически разбивает код и импортирует только используемые компоненты без необходимости ручного указания.
Оптимизация CSS
Чтобы не загружать весь CSS Element Plus, можно использовать
unplugin-vue-components вместе с
unplugin-auto-import для автоматического подключения стилей
только нужных компонентов:
import AutoImport from 'unplugin-auto-import/vite'
export default {
plugins: [
AutoImport({
resolvers: [ElementPlusResolver()],
}),
],
}
Это уменьшает общий вес CSS в финальном бандле.
В приложениях на Vue Router можно разделять код по маршрутам:
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
{
path: '/dashboard',
component: () => import('./views/Dashboard.vue')
},
{
path: '/settings',
component: () => import('./views/Settings.vue')
},
]
const router = createRouter({
history: createWebHistory(),
routes,
})
export default router
Компоненты Element Plus внутри этих страниц будут загружаться только при переходе к соответствующему маршруту, что позволяет минимизировать начальную загрузку.
ElMessage, ElNotification) в отдельный общий
бандл.cache-control и ETag для повторного
использования уже загруженных компонентов.import { defineAsyncComponent } from 'vue'
import { ElButton } from 'element-plus'
export default {
components: {
ElButton,
AsyncElDialog: defineAsyncComponent(() =>
import('element-plus/es/components/dialog')
),
},
}
Здесь статически подключается часто используемый
ElButton, а более редкий ElDialog загружается
динамически при необходимости. Такой подход обеспечивает баланс между
удобством разработки и минимизацией размера бандла.
Эффективный code splitting в Element Plus позволяет значительно уменьшить размер исходного кода, ускорить загрузку приложения и сделать работу с компонентами максимально гибкой и производительной.