集成 Element Plus
本节目标
将 Element Plus 按需引入集成到 Vue3 + Vite 项目中,配置 TypeScript 类型提示,并验证组件正常工作。
按需引入 vs 完整引入
| 维度 | 完整引入 | 按需引入(推荐) |
|---|---|---|
| 打包体积 | 全量引入,体积大 | 只打包使用的组件,体积小 |
| 配置复杂度 | 简单,三行代码 | 需要配置自动导入插件 |
| 开发体验 | 无类型提示(需额外配置) | 配合 resolver 自动类型推导 |
| 适用场景 | 快速原型验证 | 生产项目(推荐) |
本项目选择按需引入,因为已集成 unplugin-vue-components 和 unplugin-auto-import,配置成本几乎为零。
安装
pnpm add element-plus
bash
配置步骤
步骤一:TypeScript 类型支持
在 tsconfig.app.json 的 compilerOptions.types 中添加 element-plus/global,使模板中的 Element Plus 组件标签获得类型检查和自动补全。
// tsconfig.app.json
{
"compilerOptions": {
"types": [
"element-plus/global"
]
}
}
json
效果:在 <el-button type="xxx"> 中,type 属性会被限制为合法值(success / warning / info / primary / danger),输入非法值会有红色波浪线提示。
类型检查示例:
<el-button type="primary"> // OK
<el-button type="success"> // OK
<el-button type="xx"> // Error: Type '"xx"' is not assignable to type...
text
步骤二:Vite 配置自动导入
在 vite.config.ts 中导入 ElementPlusResolver,并配置到 AutoImport 和 Components 插件中。
// vite.config.ts
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import Unocss from 'unocss/vite'
export default defineConfig({
plugins: [
Vue(),
// 自动 API 导入
AutoImport({
imports: ['vue', 'vue-router', '@vueuse/core', 'pinia'],
resolvers: [
// Element Plus API 自动导入(如 ElMessage, ElNotification 等)
ElementPlusResolver(),
],
dts: 'src/auto-imports.d.ts',
}),
// 自动组件注册
Components({
resolvers: [
// Element Plus 组件自动注册
ElementPlusResolver(),
],
dts: 'src/components.d.ts',
}),
Unocss(),
],
})
ts
关键点:
ElementPlusResolver()需要同时配置在AutoImport和Components中AutoImport中的 resolver 负责自动导入 API(如ElMessage.success())Components中的 resolver 负责自动注册组件(如<el-button>)
步骤三:验证集成
<!-- pages/index.vue -->
<template>
<div class="p-8">
<h1 class="text-2xl font-bold mb-4">Element Plus 集成验证</h1>
<!-- 按钮组件 -->
<div class="flex gap-2 mb-4">
<el-button>默认按钮</el-button>
<el-button type="primary">主要按钮</el-button>
<el-button type="success">成功按钮</el-button>
<el-button type="warning">警告按钮</el-button>
<el-button type="danger">危险按钮</el-button>
<el-button type="info">信息按钮</el-button>
</div>
<!-- 消息提示 -->
<el-button type="primary" @click="showMessage">
点击弹出消息
</el-button>
</div>
</template>
<script setup>
// ElMessage 无需 import,AutoImport 的 resolver 会自动处理
function showMessage() {
ElMessage.success('Element Plus 集成成功!')
}
</script>
vue
启动开发服务器后访问 http://localhost:5173,看到彩色按钮说明 Element Plus 集成成功。
pnpm dev
bash
工作原理详解
自动导入流程
开发者编写 <el-button type="primary">
│
▼
unplugin-vue-components 扫描模板
│
▼
ElementPlusResolver 解析组件名
│
▼
自动生成 import 语句:
import { ElButton } from 'element-plus'
import 'element-plus/es/components/button/style/css'
│
▼
注入到编译后的组件代码中
text
自动生成的类型文件
配置完成后,插件会在 src/ 目录下自动生成两个类型声明文件:
// src/components.d.ts(自动生成)
// 由 unplugin-vue-components 生成
declare module 'vue' {
export interface GlobalComponents {
ElButton: typeof import('element-plus/es')['ElButton']
ElInput: typeof import('element-plus/es')['ElInput']
ElSelect: typeof import('element-plus/es')['ElSelect']
// ...更多组件
}
}
ts
// src/auto-imports.d.ts(自动生成)
// 由 unplugin-auto-import 生成
export {}
declare global {
const ElMessage: typeof import('element-plus')['ElMessage']
const ElNotification: typeof import('element-plus')['ElNotification']
const ElMessageBox: typeof import('element-plus')['ElMessageBox']
// ...更多 API
}
ts
VS Code 开发增强
组件 Snippet 扩展
虽然 TypeScript 配置提供了类型检查,但不会自动生成 Element Plus 组件的代码片段。安装以下 VS Code 扩展可以获得 snippet 支持:
扩展名称:element-plus-snippets 或 Element Plus Snippets
安装后,输入 elb 即可快速生成 <el-button> 的完整模板代码,输入 elt 可生成 <el-table> 等。
推荐的 VS Code 扩展
| 扩展 | 作用 |
|---|---|
Vue - Official | Vue3 语法高亮、TypeScript 支持 |
Element Plus Snippets | Element Plus 组件代码片段 |
UnoCSS | UnoCSS 类名高亮和预览 |
Iconify IntelliSense | 图标类名自动补全 |
完整引入方式(仅作参考)
如果项目确实需要完整引入(如快速原型验证),配置如下:
// src/main.ts
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')
ts
// tsconfig.app.json(完整引入也需要类型配置)
{
"compilerOptions": {
"types": ["element-plus/global"]
}
}
json
注意:完整引入会将所有 Element Plus 组件和样式打包,即使未使用也会增加构建产物体积。按需引入是生产环境的标准做法。
配置文件结构说明
本项目的 TypeScript 配置分为三部分:
tsconfig.json → 根配置(项目引用入口)
├── tsconfig.app.json → 应用代码配置(Vue 组件、业务代码)
├── tsconfig.node.json → Node 环境配置(Vite 配置、构建脚本)
text
Element Plus 类型配置添加到 tsconfig.app.json,因为组件和 API 在应用代码中使用。tsconfig.node.json 负责的是构建工具层面的类型支持,不需要 UI 组件类型。
常见问题排查
问题一:组件未渲染
现象:<el-button> 在页面上显示为纯文本。
原因:Components 插件中未配置 ElementPlusResolver()。
解决:确认 vite.config.ts 中 Components 的 resolvers 数组包含 ElementPlusResolver()。
问题二:ElMessage / ElNotification 未定义
现象:调用 ElMessage.success() 报错 ElMessage is not defined。
原因:AutoImport 插件中未配置 ElementPlusResolver(),或调用的是命令式 API 而非组件。
解决:确认 AutoImport 的 resolvers 数组包含 ElementPlusResolver()。
问题三:样式丢失
现象:组件渲染了但样式不正确(按钮没有颜色、布局错乱)。
原因:Element Plus 的样式未能按需导入。
解决:确认 unplugin-vue-components 版本 >= 0.26.0,ElementPlusResolver 会自动处理样式导入。
问题四:类型提示不生效
现象:<el-button> 上按住 Ctrl/Cmd 点击无法跳转到组件定义。
原因:tsconfig.app.json 中缺少 "types": ["element-plus/global"]。
解决:添加类型配置后重启 VS Code 的 TypeScript 服务(Ctrl+Shift+P -> TypeScript: Restart TS Server)。
本节回顾
- 选择按需引入:配合已有的
unplugin-auto-import和unplugin-vue-components,配置成本极低 - 三步配置:安装依赖 ->
tsconfig.app.json添加类型 ->vite.config.ts添加 resolver - 双 resolver 配置:
AutoImport负责命令式 API(ElMessage等),Components负责模板组件(<el-button>等) - 类型安全:
element-plus/global提供type等属性的值约束 - VS Code 增强:安装 snippet 扩展提升开发效率
- 后续基础:Element Plus 集成完成后,后续将在其基础上开发业务组件
↑