这是webpack实战
系列笔记的第9篇记录——代码分片
,前几篇记录如下:
“实现高性能应用其中重要的一点就是尽可能的让用户每次只加载必要的资源,优先级不太高的资源则采用延迟加载(懒加载)等技术渐进式的获取,这样可以保证首屏页面加载的速度。 代码分片是Webpack作为打包工具所特有的一项技术,通过这项技术我们可以把代码按照特定的形式进行拆分,使用户按需加载。
通过入口配置进行一些简单有效的代码拆分。
对于web应用来说通常会有一些库和工具是不常变动的,可以将它们放在一个单独的入口中,由该入口产生的资源不会经常更新,因此可以有效地利用客户端缓存,让用户不必在每次请求页面时都让资源重新加载。
// webpack.config.js
...
entry:{
app: './src/app.js',
lib: ['lib-a', 'lib-b', 'lib-c']
}
<!--index.html-->
...
<script src="./dist/lib.js"></script>
<script src="./dist/app.js"></script>
这种拆分方法主要适用于那些将接口绑定在全局对象上的库,因为业务代码中的模块无法直接引用库中的模块,而这属于不同的依赖树。
但这样仍会带来新的问题:公共模块与业务模块处于不同依赖树的问题以及很多页面并不需要公共模块的问题。
在webpack4之前,做代码切片使用的是CommonsChunkPlugin,而在4及之后,取而代之的是optimization。
“optimization.SplitChunks简称optimization,是Webpack4为了改进CommonChunkPlugin而重新设计和实现的代码分片特性。
// 两种方式二选一
yarn add optimization react
// 或
npm install optimization react
// a.js
import React from 'react'
import('./b.js');
document.write('a.js', React.version)
// b.js
import React from 'react'
console.log('b.js', React.version)
// webpack.config.js
module.exports = {
entry: './src/a.js',
output: {
filename: 'a.js',
publicPath: '/dist/'
},
mode: 'development',
optimization: {
splitChunks: {
chunks: 'all'
}
}
}
yarn build
// 或
npm run build
结果如图所示:
点击查看大图
首先观察上面的配置,从上面的配置项中可以看到:
而从上图打包结果中看,可以看到三个文件包:0.a.js
、a.js
和vendors~main.a.js
。其中,vendors~main.a.js
则是将react提取到了里面。
需要注意的是,默认提取方式为异步提取。
分为四类:
module.exports = {
...
splitChunks: {
chunks: 'async',
miSize: {
javascript: 30000,
style: 50000,
},
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
}
}
}
}
本篇了解了两种代码分片方式:
而借助这些方法,我们可以有效的缩小资源体积,更好的利用缓存,从而给用户更有好的体验度。
下一篇介绍生产环境优化中的一些配置,如环境配置封装、sourceMap等。