Tree-shaking — это механизм оптимизации, который позволяет исключать из сборки неиспользуемый код, снижая размер итогового бандла. В контексте Element Plus, использование tree-shaking особенно важно, поскольку библиотека содержит множество компонентов и утилит, не все из которых могут быть нужны в проекте.
Element Plus поддерживает модульный импорт, что обеспечивает эффективный tree-shaking при правильной конфигурации сборщика, такого как Vite, Webpack 5 или Rollup.
Без tree-shaking обычно используется глобальный импорт:
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
const app = createApp(App)
app.use(ElementPlus)
Проблема: весь код библиотеки и все стили включаются в бандл, даже
если реально используются только ElButton и
ElInput.
Правильная стратегия для tree-shaking:
import { ElButton, ElInput } from 'element-plus'
import 'element-plus/theme-chalk/el-button.css'
import 'element-plus/theme-chalk/el-input.css'
const app = createApp(App)
app.component(ElButton.name, ElButton)
app.component(ElInput.name, ElInput)
Ключевые моменты:
Element Plus предоставляет официальное решение — unplugin-vue-components, позволяющее автоматически импортировать компоненты и их стили без ручного перечисления:
// vite.config.js
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
export default defineConfig({
plugins: [
vue(),
Components({
resolvers: [ElementPlusResolver()],
}),
],
})
Преимущества автоматического импорта:
Vite по умолчанию поддерживает ES модули и позволяет tree-shaking без дополнительной настройки. Важный момент — использовать ESM-версию Element Plus, а не UMD.
import { ElButton } from 'element-plus'
Использование плагина unplugin-vue-components
дополнительно упрощает настройку.
Для Webpack 5 нужно:
sideEffects в package.json:"sideEffects": [
"*.css"
]
Это указывает сборщику, что JavaScript-файлы без побочных эффектов могут быть безопасно удалены, а CSS — нужно сохранять.
Rollup естественно поддерживает tree-shaking. Рекомендуется использовать следующие настройки:
export default {
input: 'main.js',
output: {
file: 'bundle.js',
format: 'es',
},
plugins: [
vue(),
resolve(),
commonjs(),
],
}
Важно подключать только ES модули и избегать импортов через
dist UMD-файлы.
Element Plus использует CSS-файлы для каждого компонента, что позволяет подключать только нужные стили:
import 'element-plus/theme-chalk/el-button.css'
import 'element-plus/theme-chalk/el-select.css'
Для автоматического подключения можно использовать
unplugin-vue-components, который подгружает соответствующие
стили вместе с компонентами.
lib или dist могут включать весь код.app.use(ElementPlus), tree-shaking не будет работать.require() могут препятствовать удалению
неиспользуемого кода.unplugin-vue-components для автоматизации
импорта.Эти меры позволят максимально уменьшить размер бандла и ускорить загрузку приложения.