Webpack代码分割配置后,vendors chunk为什么还是很大?
在优化项目时,我按文档配置了SplitChunks,但打包后的vendors chunk依然有800KB。我尝试把minSize设成0,调整cacheGroups的test正则,甚至手动命名splitChunks chunks,但打包结果没变化。难道还有其他配置没考虑到?
optimization: {
splitChunks: {
chunks: 'all',
minSize: 0,
cacheGroups: {
vendors: {
test: /[\/]node_modules[\/]/,
priority: -10
}
}
}
},
打包报告里vue和axios被分到vendors~app.js,但单独的lodash文件却没有拆分出来。是不是cacheGroups的配置逻辑哪里错了?
import _ from 'lodash'引入的,它可能被 Webpack 的 模块连接方式(module concatenation / scope hoisting)提前合并进了 entry,根本没进 node_modules 的 chunk 流程。先确认下:你有没有在
optimization里加moduleIds: 'deterministic'或'named'?不过这影响不大。重点是——你得看 lodash 到底有没有被 单独打包进 node_modules chunk。试试这个配置:
注意我加了两个东西:
1.
enforce: true:这是很多文档没强调的,它会绕过minSize、minChunks的限制,强制拆出 chunk。lodash 这种单独的大包经常卡在 minSize 上(默认 30KB),你设minSize: 0但没加enforce,它可能还是不拆。2. 单独给 lodash 开个 cacheGroup,priority 要比 vendors 高,不然它可能被 vendors 的正则吃掉。
另外建议你用
webpack-bundle-analyzer看下vendors chunk 里到底塞了啥。我见过有人把整个moment(含 locale)都打包进去,结果 500KB+,其实只要moment/min/moment.min.js就几十 KB。还有个小坑:如果你用的是 Vue CLI 或 CRA 这种脚手架,它们内部可能已经预设了 splitChunks,你写的配置可能被覆盖了,得确认下
vue.config.js或craco.config.js有没有用configureWebpack合并配置。最后说句实话:800KB 的 vendors 不一定坏——如果首屏加载快、gzip 后实际小,用户感知不强。但要是真想拆,
enforce: true加上单独 lodash 的 cacheGroup 基本能解决。enforce: true,再看看打包结果:我之前这样搞的,一般都能拆得更细。要是还大,就检查下有没有啥巨无霸库没被按需加载。