按照官网的方式,在项目中按需引入 element-ui ,
用 webpack-bundle-anaylize 分析发现,打包输出了全量的 element-ui, 按需引入没达到想要的效果。
一步注释项目代码去查找造成全量引入的原因,发现是因为在组件中写了这样的语句:
<script lang='ts'>import { Message } from "element-ui";Message.error("warn");</script>
当我把 <script lang='ts'> 改为<script lang='js'>后,发现element-ui会按需引入。
原因找到了,是因为 ts-loader对ts 处理后出现了问题。
解决
由于项目中同时使用了ts-loader 和 babel-loader,解决思路就是要么将 element-ui 按需引入的代码写到js中,要么修改tsconfig配置防止 ts-loader 编译 ESM语法。
有两种方式解决
- 把element 的按需导入代码写到一个单独
element.js文件中,并在 element.js 中导出 ,再在组件中引入这个文件 - 修改配置,升级babel 7, 使用 babel7 + @babel/preset-typescript
由于修改配置影响面比较广,先按照第一种方式解决。
后经查询 sf https://stackoverflow.com/questions/61236997/webpack-tree-shaking-still-bundles-unused-exports
发现只需要 ts 的module 配置 :
{test: /\.tsx?$/,exclude: /node_modules/,use: ['babel-loader', {loader: 'ts-loader',options: {transpileOnly: true,appendTsSuffixTo: [/\.vue$/],happyPackMode: false}}],},
不知道什么原理,但是解决问题了。
