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.