这篇文章的主题主要是两件事
1.对elementui这个技术栈做一个沉淀
2.对于vue-cli这个技术栈需要对elementui做的配置
1.对elementui这个技术栈做一个沉淀
1.什么是elementui,用通俗的语言,解释一下他主要解决什么问题
2.对于elementui在引入到工程的时候需要做什么配置
3.elementui的知识体系是什么,提供了哪些机制供使用
4.elementui实现的底层原理
Element-UI 技术沉淀
文档说明:本文对 Element-UI 技术栈进行系统性的知识沉淀,涵盖从概念认知、工程配置到源码原理的完整知识体系。
一、什么是 Element-UI?
1.1 通俗理解
Element-UI 可以理解为一套"乐高积木"------它提供了一系列开箱即用的界面组件(按钮、输入框、表格、弹窗等),开发者只需要像搭积木一样把这些组件组合起来,就能快速搭建出一个界面美观、功能完整的网页应用。
它主要解决什么问题?
在没有这类组件库之前,前端开发者做一个后台管理系统,需要从零开始写 HTML 结构、写 CSS 样式、写 JavaScript 交互逻辑。做一个表格可能要花一两天,做一个日期选择器可能要研究半天。Element-UI 将这些高频使用的界面元素预置好,开发者只需要写一行 <el-table> 就能得到一个功能完整的表格(自带排序、筛选、分页)。
1.2 官方定义
Element-UI 是由饿了么前端团队于 2016 年开源的一款基于 Vue 2.0 的桌面端 UI 组件库,旨在为开发者、设计师和产品经理提供一套完整、统一、美观的 UI 解决方案。
1.3 核心价值
| 维度 | 说明 |
|---|---|
| 开发效率 | 几行代码实现复杂功能,无需重复造轮子 |
| 设计统一 | 提供完整的色彩/字体/间距规范,保证界面一致性 |
| 响应式布局 | 基于 24 列栅格系统,适配不同屏幕尺寸 |
| 生态成熟 | 详尽文档、活跃社区、丰富的第三方扩展 |
二、Element-UI 的工程配置
2.1 安装
bash
npm install element-ui --save
2.2 完整引入(适用于快速原型)
在 main.js 中全量引入:
javascript
import Vue from 'vue';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
特点:配置简单,但打包体积较大(全量约 1.5MB),影响首屏加载速度。
2.3 按需引入(性能优化推荐)
第 1 步:安装 babel-plugin-component
bash
npm install babel-plugin-component --save-dev
第 2 步:配置 babel.config.js
javascript
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
],
plugins: [
[
'component',
{
libraryName: 'element-ui',
styleLibraryName: 'theme-chalk'
}
]
]
};
第 3 步:在需要使用的地方单独引入组件
javascript
import { Button, Select, Input } from 'element-ui';
export default {
components: {
'el-button': Button,
'el-select': Select,
'el-input': Input
}
}
通过这种方式,只有实际使用的组件会被打包,显著减小最终体积。
2.4 Vue CLI 插件方式(自动化配置)
如果使用 Vue CLI 3+,可以通过插件一键配置:
bash
vue add element
命令行会弹出交互式选项,选择「完全引入」或「按需引入」,插件会自动完成所有配置。
三、Element-UI 的知识体系
3.1 组件分类
Element-UI 提供了 60+ 组件,主要分为以下几大类:
| 分类 | 核心组件 | 说明 |
|---|---|---|
| 基础组件 | Button、Icon、Link | 最基础的 UI 元素 |
| 布局组件 | Container、Row、Col | 页面结构搭建,24 列栅格系统 |
| 表单组件 | Input、Select、Radio、Checkbox、DatePicker、Form | 数据收集与验证 |
| 数据展示 | Table、Tag、Progress、Tree、Pagination | 数据呈现与组织 |
| 导航组件 | Menu、Tabs、Breadcrumb、Dropdown | 页面路由与层级 |
| 反馈组件 | Dialog、Message、Notification、Popover | 用户交互反馈 |
| 其他 | Upload、Carousel、InfiniteScroll | 特殊功能组件 |
3.2 核心机制
(1)栅格系统
基于 24 列的布局系统,通过 span 和 offset 控制列宽与偏移,支持响应式断点(xs/sm/md/lg/xl)。
html
<el-row :gutter="20">
<el-col :span="12">左侧</el-col>
<el-col :span="12">右侧</el-col>
</el-row>
(2)表单验证
内置表单验证机制,支持必填、格式校验、自定义校验规则。
html
<el-form :model="form" :rules="rules">
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email"></el-input>
</el-form-item>
</el-form>
(3)全局配置
通过 Vue.use(ElementUI, { size: 'small', zIndex: 3000 }) 可以设置全局默认属性。
(4)主题定制
支持通过修改 SCSS 变量或使用在线主题生成器进行样式定制。
四、Element-UI 的底层原理
4.1 整体架构
Element-UI 的源码组织遵循「组件独立 + 统一导出」的模块化设计:
element-ui/
├── packages/ # 独立组件目录
│ ├── button/
│ │ ├── src/ # 组件源码
│ │ └── index.js # 组件导出入口
│ └── ...
├── src/
│ └── index.js # 全局入口文件
└── theme-chalk/ # 样式文件(SCSS)
4.2 组件的可插拔设计
每个组件都是一个独立的 Vue 插件,具备 install 方法:
javascript
// packages/button/index.js
import Button from './src/main';
Button.install = function(Vue) {
Vue.component(Button.name, Button);
};
export default Button;
这样做的好处是:组件既可以单独注册(Vue.use(Button)),也可以被插件系统统一收集后批量注册。
4.3 插件注册机制
全局入口文件 src/index.js 的核心逻辑:
javascript
const components = [Button, Input, Table, /** ...所有组件 */];
const install = function(Vue) {
components.forEach(component => {
Vue.component(component.name, component);
});
};
// CDN 自动安装
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
export default {
install,
...components
};
这种设计使得 Element-UI 同时支持 Vue.use(ElementUI) 的插件方式引入,也支持通过 <script> 标签的 CDN 方式直接使用。
4.4 按需引入的原理(Tree Shaking + Babel 插件)
按需引入的实现依赖两个层面:
(1)构建层面的 Tree Shaking
通过 package.json 中的 sideEffects 字段告诉 Webpack 哪些文件有副作用(如 CSS 文件),未被使用的组件代码会被摇掉:
json
{
"sideEffects": ["**/*.css"]
}
(2)Babel 编译时的路径转换
babel-plugin-component 插件会将:
javascript
import { Button } from 'element-ui'
自动转换为:
javascript
import Button from 'element-ui/packages/button'
import 'element-ui/theme-chalk/button.css'
这个转换通过解析 AST(抽象语法树)实现,对开发者完全透明。
4.5 样式系统的组织
Element-UI 的样式基于 SCSS 编写,每个组件对应独立的样式文件:
theme-chalk/
├── index.css # 全量样式
├── button.css # 按钮样式
├── input.css # 输入框样式
└── ...
样式变量集中管理在 common/var.scss 中,通过修改这些变量即可实现主题定制。
补充说明:Element-UI 与 Vue CLI 的配合
在 Vue CLI 创建的项目中使用 Element-UI,推荐配置如下:
- 开发环境:使用完整引入,开发效率高
- 生产构建:启用按需引入 + 样式分离
如果是 Vue CLI 3+ 项目,最简配置方式就是执行 vue add element,它会自动处理 babel 配置、样式引入等所有细节。
版本提醒 :Element-UI 是基于 Vue 2.x 的版本。如果项目使用的是 Vue 3,需要选用官方升级版 Element Plus。