Webpack的splitChunks配置为什么没生效?大文件还是被打包在一起
在配置Webpack optimization.splitChunks时,我把minSize设置成30000,但发现第三方库还是被打包到vendor chunk里了,难道我的配置有问题?
之前尝试过这样写:
optimization: {
splitChunks: {
chunks: 'all',
minSize: 30000,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3
}
}
但打包后查看stats报告,axios和lodash的代码还是和react一起打包在vendor里,难道minSize没生效?或者需要配合cacheGroups使用?
常见的解决方案是显式定义 cacheGroups 来控制拆分逻辑。比如你想把 axios 和 lodash 单独拆出来,可以这样写:
注意这里的 priority 很关键,优先级高的会先匹配。比如 lodash 和 axios 的优先级高于通用的 vendor,这样它们就不会被兜底规则吃掉,才能真正拆成独立文件。
另外建议打包后用
webpack-bundle-analyzer看下体积分布,别光看 stats,不然很容易误判是否生效。有时候不是配置没起作用,而是文件加起来刚好没超 maxInitialRequests 之类的限制,看起来就像没拆。正确的做法是显式定义cacheGroups。比如你想让每个第三方库都单独拆出来,应该这样写:
这里的关键点:
cacheGroups里的每个规则都是一个chunk组
test匹配模块路径,这里用正则匹配node_modules下的包
enforce: true表示强制使用这个分组,不和默认规则合并
name指定输出的chunk名,这样就能看到单独的lodash~main.js这样的文件
另外要注意,如果你的模块体积小于minSize,它就不会被拆分。所以你设置的30000(30kb)是合理的,但像react这种大库肯定会超过阈值,说明之前没拆开是因为规则没写对。
建议你可以用webpack-bundle-analyzer插件可视化查看打包结构,这样更容易定位问题。