组件按需加载(antd、element-ui)

按需加载插件全解析:ts-import-plugin / babel-plugin-import / babel-plugin-component

本文系统梳理三款前端组件库按需加载插件的核心区别、适配场景,以及在 Nuxt/Vue CLI 框架下结合不同 UI 库(ant-design-vue、Element-UI、Vant)的实战配置方法,帮助你精准选择并落地按需加载方案。

一、核心区别(定位/出品方/适配场景)

三款插件均为解决「UI 库全量引入导致包体积过大」的问题,核心逻辑是「按需引入组件代码+样式」,但适配场景和底层实现有明确差异:

插件名称 出品方/衍生关系 核心定位 适配场景 适配语言/工具链
babel-plugin-import 蚂蚁集团(ant-design 团队) 基础款 Babel 按需加载插件 基于 Babel 构建的项目(Vue/React)、非 TS 项目 JavaScript + Babel(@babel/core)
babel-plugin-component 饿了么团队(ElementUI) 基于 babel-plugin-import 定制 ElementUI 专属(也兼容部分其他 UI 库) JavaScript + Babel
ts-import-plugin 社区(基于前者适配) babel-plugin-import 的 TS 版本 TypeScript 项目(Vue CLI/React + TS) TypeScript + TS Loader

关键补充

  • babel-plugin-componentbabel-plugin-import 的「ElementUI 定制版」,优化了 ElementUI 样式库的按需引入逻辑(如 styleLibraryName 配置);
  • ts-import-plugin 无独立 Babel 依赖,直接作用于 TS 编译阶段,适配 Vue CLI + TypeScript 项目;
  • 三者核心配置逻辑一致:指定 libraryName(UI 库名)、libraryDirectory(组件目录)、style(样式引入规则)。

二、实战配置(按 UI 库分类)

1. ant-design-vue(Nuxt 框架)→ 适配 babel-plugin-import

ant-design-vue 官方推荐使用 babel-plugin-import,适配 Nuxt 框架的配置步骤如下:

步骤1:安装依赖

1
2
yarn add babel-plugin-import --dev
# 或 npm install babel-plugin-import --save-dev

步骤2:Nuxt 配置(nuxt.config.js)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
export default {
build: {
// 必须转译 ant-design-vue,避免按需加载失效
transpile: ['ant-design-vue'],
babel: {
plugins: [
[
'import', // 插件名称
{
libraryName: 'ant-design-vue', // 目标 UI 库名称
libraryDirectory: 'es', // 组件代码目录(es/lib 二选一,es 为 ESModule 版本)
style: 'css' // 样式引入规则:
// - 不配置:不引入样式(需手动导入)
// - true:引入组件的 .less 源文件(需配置 less 解析)
// - 'css':引入编译后的 .css 文件(推荐)
}
]
]
}
}
};

2. Element-UI(Nuxt 框架)→ 适配 babel-plugin-component

Element-UI 官方定制了 babel-plugin-component,对其样式库的按需引入更友好,Nuxt 框架配置如下:

步骤1:安装依赖

1
2
yarn add babel-plugin-component --dev
# 或 npm install babel-plugin-component --save-dev

步骤2:Nuxt 配置(nuxt.config.js)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
export default {
build: {
// 转译 Element-UI 确保按需加载生效
transpile: [/^element-ui/],
babel: {
plugins: [
[
'component', // 插件名称
{
libraryName: 'element-ui', // 目标 UI 库名称
styleLibraryName: 'theme-chalk' // ElementUI 专属:指定样式库目录(theme-chalk 为默认主题)
}
]
]
}
}
};

3. Vant(Vue CLI + TypeScript)→ 适配 ts-import-plugin / babel-plugin-import

Vant 支持两种按需加载方案:TS 项目优先用 ts-import-plugin,非 TS 项目用 babel-plugin-import

方案1:Vue CLI + TS → ts-import-plugin(推荐)

步骤1:安装依赖
1
2
yarn add ts-import-plugin webpack-merge --dev
# 或 npm install ts-import-plugin webpack-merge --save-dev
步骤2:Vue CLI 配置(vue.config.js)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const tsImportPluginFactory = require("ts-import-plugin");
const webpackMerge = require("webpack-merge");

module.exports = {
chainWebpack: config => {
// 针对 TS 文件配置 ts-import-plugin
config.module
.rule("ts") // 匹配 .ts/.tsx 文件
.use("ts-loader") // 关联 ts-loader
.tap(options => {
// 合并原有配置 + 按需加载插件配置
options = webpackMerge.merge(options, {
transpileOnly: true, // 仅转译,不做类型检查(提升构建速度)
getCustomTransformers: () => ({
before: [
// 初始化 ts-import-plugin
tsImportPluginFactory({
libraryName: "vant", // 目标 UI 库名称
libraryDirectory: "es", // 组件目录(es 为 ESModule 版本)
style: true // 引入 Vant 组件的 less 源文件(需配置 less 解析)
})
]
}),
compilerOptions: {
module: "es2015" // 编译为 ESModule,适配按需加载
}
});
return options;
});
}
};

方案2:Vant + babel-plugin-import(非 TS 项目)

Vant 官方也支持 babel-plugin-import,配置可参考官方文档:
https://vant-contrib.gitee.io/vant/#/zh-CN/quickstart#fang-shi-yi.-zi-dong-an-xu-yin-ru-zu-jian-tui-jian

三、核心配置项说明

无论使用哪款插件,核心配置项的含义一致,理解后可灵活适配其他 UI 库:

配置项 含义 常用值
libraryName 目标 UI 库的 npm 包名 ant-design-vue/element-ui/vant
libraryDirectory 组件代码所在的子目录(ESModule 用 es,CommonJS 用 lib) es/lib
style 样式引入规则(babel-plugin-import/ts-import-plugin) true/.less/css/false
styleLibraryName ElementUI 专属,指定样式库目录(如 theme-chalk 对应 element-ui 的默认主题) theme-chalk

四、参考资料

  1. babel-plugin-import 官方仓库:https://github.com/ant-design/babel-plugin-import
  2. ts-import-plugin 官方仓库:https://github.com/Brooooooklyn/ts-import-plugin
  3. babel-plugin-component 官方仓库:https://github.com/ElementUI/babel-plugin-component
  4. 插件选型问答:https://segmentfault.com/q/1010000022005673?sort=created

总结

  1. 选型核心:TS 项目选 ts-import-plugin,非 TS 项目选 babel-plugin-import,ElementUI 优先选 babel-plugin-component
  2. 配置关键:务必配置 transpile(Nuxt)/ 确保 loader 关联(Vue CLI),否则按需加载会失效;
  3. 样式规则style: 'css' 适合直接用编译后的样式,style: true 适合自定义主题(需配置 less 解析)。

组件按需加载(antd、element-ui)
https://cszy.top/20201112-h5-ui-pc/
作者
csorz
发布于
2020年11月12日
许可协议