浅析babel-plugin-component
vue + element-ui 使用 babel-plugin-component 来实现按需加载组件及样式。
一、官网按需引入示例
借助 babel-plugin-component,我们可以只引入需要的组件,以达到减小项目体积的目的。
首先,安装 babel-plugin-component:
1 | npm install babel-plugin-component -D |
然后,将 .babelrc 修改为:
1 | { |
接下来,如果你只希望引入部分组件,比如 Button 和 Select,那么需要在 main.js 中写入以下内容:
1 | import Vue from 'vue' |
二、babel 编译过程概述
使用 @babel/cli 与 @babel/core 编译文件的主要过程
加载配置文件
- 尝试加载 babel.config.js、babel.config.cjs、babel.config.mjs、babel.config.json文件
- 加载 package.json 文件
- 尝试加载 .bebelrc、.babelrc.js、.babelrc.cjs、.babelrc.mjs、.babelrc.json 文件
- 合并参数
加载 plugins 与 presets,分别遍历他们(plugins 每一项会调用它的回调,返回包含 visitor 的对象)
- 解析部分
- 以 utf8 格式读入口文件得到代码
- 之后解析生成 ast
- 遍历与转换部分
- 遍历插件数组,生成最后的访问者(visitor)对象
- 开始遍历节点,碰到感兴趣的节点就调用回调
- 生成部分
- 遍历 ast,将得到的代码保存在数组中,最后拼接起来
三、babel-plugin-component
通过一个简单的例子看一下 babel-plugin-component 在编译过程中做了哪些事情
1.项目结构
目录结构
1 | ├── index.js |
package.json
1 | { |
.babelrc 文件
1 | { |
index.js 文件
1 | import Vue from 'vue' |
编译生成文件
1 | import _Button2 from "element-ui/lib/theme-chalk/button.css"; |
2.插件做了什么
在 babel 遍历 ast 的时候,这个插件主要关注了 ImportDeclaration 与 CallExpression 与 Program
1 | Program: function Program() {// 在这里做一些初始化操作,用来保存信息 |
importMethod 方法
1 | function importMethod(methodName, file, opts) { |
babel-plugin-component 插件在遍历节点的时候做的事情
- 找到引入 element-ui 的类型为 ImportDeclaration 节点,将感兴趣的值存在对象里(比如引入 button,就存起来),之后移除当前这个节点。
- 在遍历到 CallExpression 类型节点的时候(假设使用了 button,就判断是否存在了上面的对象里),之后创建新的 ImportDeclaration 节点,用于之后加载对应的 js 与 css 文件。