Webpack打包时如何合理拆分Chunk避免重复代码?
我用Webpack打包项目,发现多个页面引用了相同的第三方库(比如lodash和axios),但每个chunk里都包含了这些库的代码,体积特别大。
我试过用splitChunks配置,但效果不明显,甚至有时候还会把公共代码拆得更碎。有没有推荐的配置方式能真正把公共依赖抽出来?
这是我现在用的配置:
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\/]node_modules[\/]/,
name: 'vendors',
chunks: 'all',
}
}
}
}
在cacheGroups里加个minSize和maxSize,控制拆分粒度。另外vendor组可以再细化下规则,避免误伤。我给你个改进版:
这里把vendor规则写得更明确些,只针对你提到的库。minSize和maxSize能防止拆得太碎或太集中。记得把priority调低点,让默认规则有机会生效。
折腾这些确实挺烦人,不过一旦搞定了能省不少流量。服务端压力也能小一点,特别是用户量上来的时候。要是还不行,考虑用Dynamic Imports动态加载公共模块。
试试这个思路:把大的第三方库单独抽出来,再配合缓存组优先级。
几个关键点:
1. 把lodash、axios、react这些大库用正则单独抽出来,打成vendor-libs chunk,它们更新频率低,可以长期缓存
2. priority很关键,数字大的先匹配,你的配置没设priority可能导致匹配顺序不对
3. minSize设20000是因为太小的库拆出来反而增加HTTP请求负担,不划算
另外提醒一下,如果你用的是lodash,别直接import整个库:
lodash全量引入差不多700KB,拆成按需引入后可能就几十KB,差距巨大。
还有就是检查一下你的入口文件配置,如果用了多页面应用确保每个page都正确指向入口。