记一次调整项目 babel 配置后 webpack 的 code-splitting 失效问题
问题产生背景
-
某天我们同事需要实现一个业务需求,引入了某个工具包
xxx -
然后在使用这个工具包的时候发现有点问题
-
查阅文档说需要把项目中的
babel的modules属性配置调整一下, 使用commonjs模式 -
同事调整完之后发现这个库确实好使了,业务需求实现了,产品很满意
爆雷
-
又是某个工作日的下午,我们老大发现我们的项目加载有点慢,打开控制台看了下发现我们的项目首页加载的
js文件很大,压缩完的都有十多兆,源文件直接好几十兆...然后就找我们沟通情况、排查问题、尽快解决问题。 -
然后我们小组几个铁子就立马开始排查问题产生的原因了...
问题排查
本地复现
-
我先在本地执行
build命令把项目构建成功之后 -
发现
dist里面的js文件夹里面只有下图这些js文件 -
app.10721af9.js大小为22MB... -
vendors.10721af9大小为34MB...

-
从上面的现象来看,很明显是
webpack的code-splitting没生效导致的问题 -
项目中是在路由层面通过
import()和webpackChunkName来实现的code-splitting
js
component: () => import(/* webpackChunkName: "wangzhihao" */ '@/package/wangzhihao/index.vue');
排查 webpack
在把有问题的项目中的 webpack 中 code-splitting 的相关使用方法和其他表现正常的项目对比下来,发现相关的 webpack 配置一模一样,所以关注点转移到 @babel/preset-env 的配置项 modules 上来。提出这个想法后,之前调整过 babel 配置的同事就立马反应过来了。
- 他调整的
babel配置如图

排查 babel
-
我尝试把
babel的modules属性还原为false,然后重新build一下项目 -
结果问题就解决了,构建出来的
js文件夹按预期通过webpackChunkName实现了code-splitting,按模块分好了js文件
问题复盘
为什么 babel 配置会影响 code-splitting ?
- 我一问巨佬
chatgpt它的回答就给我明确的线索!太吊了

本质原因
-
同事把
babel中@babel/preset-env的配置modules值从false改为commonjs -
modules为commonjs时,@babel/preset-env会将es module转换成commonjs -
结果就是把项目中写的
import()转换成了require() -
然而
webpack处理require()就是正常的模块打包加载,不会编译成动态加载的模块,进而导致code-splitting失效
babel modules 不同编译效果
modules 为 false

modules 为 commonjs

参考资料
