webapck v4
开始,移除了CommonsChunkPlugin
,转而使用SplitChunksPlugin
做为新的代码块分割插件。node
CommonsChunkPlugin
主要是用来提取第三方库和公共模块,优化加载。SplitChunksPlugin
一样也是这个做用。react
SplitChunksPlugin
是开箱即用的,这对大多数开发者来讲很是友好。webpack
webpack
将根据如下条件自动拆分块:web
node_modules
文件夹的模块min + gz
以前)SplitChunksPlugin
的参数是很是多的缓存
optimization: {
splitChunks: {
chunks: 'async',
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
automaticNameMaxLength: 30,
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
复制代码
chunks
: 打包的模块是异步、同步、仍是所有,对应的值为async
initial
all
,也能够写成函数形式,自定义打包minSize
: 抽离公共包的最小sizemaxSize
: 最大sizeminChunks
: 最少使用次数maxAsyncRequests
: 最大异步请求数maxInitialRequests
: 最大同步请求数automaticNameDelimiter
: 默认状况下,webpack将使用块的名称和原始文件名称生成文件名(例如vendors~main.js)。此选项容许您指定用于生成的名称的分隔符。automaticNameMaxLength
: 容许设置由SplitChunksPlugin
生成的块的名称字符的最大值maxAsyncRequests
: 按需加载时最大并行请求数maxAsyncRequests
: 入口处最大请求并行数name
: 生成块的名称,为true
时,将根据块和缓存组密钥自动生成名称cacheGroups
: 缓存组能够继承或者覆盖上面的选项,可是priority
test
reuseExistingChunk
只能在这里设置。若是不想使用缓存组,能够直接置为false
priority
: 表示缓存的优先级;test
: 缓存组的规则,表示符合条件的的放入当前缓存组,值能够是function
、boolean
、string
、RegExp
,默认为空;reuseExistingChunk
: 表示可使用已经存在的块,即若是知足条件的块已经存在就使用已有的,再也不建立一个新的块。1.默认打包chunks: async
bash
webpack.config.js
dom
optimization: {
splitChunks: {
chunks: 'initial'
}
}
复制代码
a.js
异步
import 'react'
复制代码
b.js
async
import(/* webpackChunkName: "async-lodash" */ 'lodash')
import 'react-dom'
复制代码
a.js
同步引入了
react
,在
b.js
同步引入了
react-dom
,异步引入了
lodash
打包以后咱们能够发现,同步引入原封不动都被打包到了
main.js
,而异步引入的
lodash
被单独独立成了一个模块。
因此SplitChunksPlugin
的默认打包是异步打包。webpack-dev-server
2.chunks: initial
webpack.config.js
optimization: {
splitChunks: {
chunks: 'initial',
filename: 'vendor.js'
}
}
复制代码
依然是上面文件
react
和
react-dom
都单独打包进了
vendor.js
。异步依然是单独打包优化。
initial
这个选项就是将全部来自node_modules
的模块分配到一个叫vendors
的缓存组。
3.chunks: all
webpack.config.js
optimization: {
splitChunks: {
chunks: 'all'
}
}
复制代码
all
这个选项也会将全部来自node_modules的模块分配到一个叫vendors的缓存组。
这就很尴尬了,两个选项打包出来同样,不甚理解根本区别在哪?请精通的大佬赐教~
4.minChunks
webpack.config.js
optimization: {
splitChunks: {
chunks: 'all',
minChunks: 2
}
}
复制代码
a.js
import 'react'
复制代码
b.js
import './a'
复制代码
由于只被调用了一次,不符合要求,因此react
并无单独打包成文件
5.cacheGroup
webpack.config.js
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
test: /lodash/
}
}
}
复制代码
a.js
import 'lodash'
复制代码
b.js
import 'react'
复制代码
由于test
只匹配了lodash
,因此react
并无抽离出来。
webpack学习之路(六)hash/chunkHash/contentHash
webpack学习之路(五)loader初识及经常使用loader介绍
webpack学习之路(四)webpack-hot-middleware实现热更新
webpack学习之路(三)webpack-dev-middleware
webpack学习之路(二)webpack-dev-server实现热更新
I am moving forward.