chunks:指定哪些类型的chunk参与拆分,值可以是string可以是函数。如果是string,可以是这个三个值之一:all, async, initial,all 代表所有模块,async代表只管异步加载的, initial代表初始化时就能获取的模块。如果是函数,则可以根据chunk参数的name等属性进行更细致的筛选。
再次打包:
可以看到a.js,index.js从300多K减少到6点几K。同时增加了一个common.js文件,并且两个打包入口都自动添加了common.js这个公共模块:
进入dist目录,依次查看这3个js文件:
a.js里不包含任何模块的代码了,只有webpack生成的默认代码。
index.js里同样不包含任何模块的代码了,只有webpack生成的默认代码。
common.js里有a,b,c,index,jquery代码。
发现,提是提取了,但是似乎跟我们预料的不太一样,所有的模块都跑到common.js里去了。
这是因为我们没有告诉webpack(splitChunks)什么样的代码为公共代码,splitChunks默认任何模块都会被提取。
- minChunks
splitChunks是自带默认配置的,而缓存组默认会继承这些配置,其中有个minChunks属性:
它控制的是每个模块什么时候被抽离出去:当模块被不同entry引用的次数大于等于这个配置值时,才会被抽离出去。
它的默认值是1。也就是任何模块都会被抽离出去(入口模块其实也会被webpack引入一次)。
我们上面没有配置minChunks,只配置了name和chunk两个属性,所以minChunks的默认值 1 生效。也难怪所有的模块都被抽离到common.js中了。
优化一下,在缓存组里配置minChunks覆盖默认值:
//webpack.config.js optimization: { splitChunks: { cacheGroups: { default: { name: 'common', chunks: 'initial', minChunks: 2 //模块被引用2次以上的才抽离 } } } }
然后运行webpack
可以看到有2个文件的大小发生了变化:common.js由314K减小到311K,index.js由6.22K增大到7.56K。
进入dist目录查看:
a.js里依然不包含任何模块的代码(正常,因为a作为模块被index引入了一次,又作为入口被webpack引入了一次,所以a是有2次引用的)。
index.js里出现了b和index模块的代码了。
common.js里只剩a,c,和jquery模块的代码。
现在我们把共同引用的模块a, c, jquery,从a和index这两个入口模块里抽取到common.js里了。有点符合我们的预期了。
3. 配置多个拆分规则
3.1 实现代码分离,拆分第三方库
接下来,我希望公共模块common.js中,业务代码和第三方模块jquery能够剥离开来。
我们需要再添加一个拆分规则。
//webpack.config.js optimization: { splitChunks: { minSize: 30, //提取出的chunk的最小大小 cacheGroups: { default: { name: 'common', chunks: 'initial', minChunks: 2, //模块被引用2次以上的才抽离 priority: -20 }, vendors: { //拆分第三方库(通过npm|yarn安装的库) test: /[\\/]node_modules[\\/]/, name: 'vendor', chunks: 'initial', priority: -10 } } } }
我给cacheGroups添加了一个vendors属性(属性名可以自己取,只要不跟缓存组下其他定义过的属性同名就行,否则后面的拆分规则会把前面的配置覆盖掉)。
- minSize