面试题答案
一键面试使用splitChunks插件实现代码分割的Webpack配置
在Webpack的webpack.config.js
文件中进行如下配置:
module.exports = {
// 其他常规配置...
optimization: {
splitChunks: {
chunks: 'all',
minSize: 30000,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
};
- chunks:指定对哪些chunk进行代码分割,
'all'
表示对所有类型的chunk(initial
、async
和all
)都进行分割。 - minSize:表示被分割出来的chunk最小大小,单位是字节,默认30000(约30KB)。
- minChunks:表示要分割的模块至少被
minChunks
个chunk引用才会被分割出来。 - maxAsyncRequests:最大的按需(异步)加载的并行请求数,默认是5。
- maxInitialRequests:最大的初始化并行请求数,默认是3。
- automaticNameDelimiter:用于生成名称时的分隔符。
- name:是否使用名称,设置为
true
会自动生成名称。 - cacheGroups:缓存组,可以定义不同规则的代码分割。这里定义了
vendors
和default
两个缓存组。vendors
缓存组用于分割来自node_modules
的模块,priority
表示优先级;default
缓存组用于通用模块的分割,reuseExistingChunk
表示如果当前chunk包含已从主bundle中分割出的模块,则复用该模块而不是再次分割。
提升性能的原理
- 减少初始加载体积:通过将不常变化的第三方库(如
node_modules
中的模块)和通用模块分割出来,使得初始加载的代码体积变小。例如,将lodash
等库单独分割成一个文件,在页面加载时,只需要加载必要的业务代码,而不是将所有代码(包括第三方库)都加载进来,从而加快首屏加载速度。 - 利用浏览器缓存:分割后的文件可以被浏览器单独缓存。当用户再次访问页面时,如果第三方库或通用模块没有更新,浏览器可以直接从缓存中加载,而不需要再次请求服务器,进一步提高加载效率。例如,
react
库的文件被分割出来且缓存后,下次访问相同使用react
的页面时,浏览器直接读取缓存,减少了等待时间。 - 并行加载优化:通过
maxAsyncRequests
和maxInitialRequests
等配置,限制并行请求数量,避免过多请求导致网络拥塞。合理的请求数量设置可以让浏览器在加载资源时更高效地利用网络带宽,提升整体加载性能。