|
webpack v4 以前,使用 CommonsChunkPlugin 插件来提取公用的js文件和库,但是这个插件的功能有限,只能把公共文件打包到一个公共文件中,进入页面时加载,只能避免重复加载文件和库,并不能起到优化页面加载速度。
webpack v4版本推出后,官方把代码的分割工作交给了SplitChunksPlugin插件,这是一个内置的插件,无需额外引入,直接在optimization.splitChunks中书写配置即可。该插件不仅可以提取公共的文件和库,还可以提取按需加载的文件(即通过import('../a.js')动态引入的文件)。
官方推荐开发者将不需要立刻使用的代码(例如:登陆弹窗的代码,点击事件的代码)通过异步的方式引入,这样才是加快网页速度的关键。配合Prefetching和Preloading就更完美了,扯远了~~,这两个不在本文的讨论范围,有兴趣的朋友自行了解。
默认配置
官网给出的默认配置如下,即如果你不手动配置 soptimization.plitChunks ,webpack 将按照这个默认配置对代码进行分割操作。
module.exports = {
//...
optimization: {
splitChunks: {
chunks: 'async',
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
};
复制代码
默认配置的大概意思是:
默认只对按需引入的模块进行代码分割;
来自 node_modules 的模块,或被引用两次及以上的模块,才会做代码分割;
被分割的模块必须大于30kb(代码压缩前);
按需加载时,并行的请求数必须小于或等于5;
初始页加载时,并行的请求数必须小于或等于3;
配置参数解读
解读配置前,先科普一下什么叫 "chunks" 吧,可能有些人有疑问,SplitChunksPlugin 中的chunks是什么东西,为什么要split它?
通俗的讲,"chunks" 是指交给webpack处理的文件,例如:js/css/img文件,通过import的方式引入的模块或文件都可以称之为"chunks"。
splitChunks.chunks
可选值: function (chunk) | initial | async | all
initial 表示入口文件中非动态引入的模块
all 表示所有模块
async 表示异步引入的模块
配置如下:
// src/index.js
// 静态引入
import lodash from 'lodash' // 大小约529kb(压缩后)
// 动态引入
import(/*webpackChunkName:"jquery"*/ 'jquery') // 大小约281kb(压缩后)
复制代码
// webpack.config.js
module.exports = {
//...
optimization: {
splitChunks: {
chunks: 'async'
}
}
};
复制代码 |
|