什麼是外掛?
loader
用於打包檔案,plugins
用於解決一些其他任務,比如程式碼壓縮,去註釋等等
語法
plugins:[xx1,xx2]
複製程式碼
陣列中的引數要求是外掛物件的例項,即必須new
plugins: [
new HtmlWebpackPlugin({template: './src/index.html'})
]
複製程式碼
下面是一些常用的外掛
程式碼壓縮外掛
UglifyJsPlugin
已棄用,生產模式會自動壓縮
圖片壓縮外掛
imagemin-webpack-plugin
用於批量壓縮圖片
1 . 安裝
cnpm install imagemin-webpack-plugin --save
複製程式碼
2 . 配置
//引入外掛
var ImageminPlugin = require('imagemin-webpack-plugin').default;
//配置
plugins: [
new ImageminPlugin({
disable: process.env.NODE_ENV !== 'production', // 開發時不啟用
pngquant: {//圖片質量
quality: '95-100'
}
})
]
複製程式碼
HTML檔案建立外掛
HtmlWebpackPlugin
用於建立html
多入口時,當你的 index.html
引入多個js,如果這些生成的js名稱構成有 [hash]
,那麼每次都能修改html中的js名稱
HtmlWebpackPlugin
在此可以用於自動重新生成一個index.html,已幫你把生產的所有js檔案引入,生成到output目錄
1 . 安裝
cnpm install html-webpack-plugin --save-dev
複製程式碼
- 配置
//引入
const HtmlWebpackPlugin = require('html-webpack-plugin');
//配置
plugins: [
new HtmlWebpackPlugin()
]
複製程式碼
清空資料夾外掛
clean-webpack-plugin
可以在每次打包時先清空指定的資料夾
1 . 安裝
cnpm install clean-webpack-plugin --save-dev
複製程式碼
2 . 配置
//引入
const CleanWebpackPlugin = require('clean-webpack-plugin');
//清空dist資料夾
new CleanWebpackPlugin(['dist'])
複製程式碼
提供全域性變數
每次 import react 是不是很煩,使用這個外掛可以匯入到全域性,之後不用再import
語法: varName : filePath
//這些變數不必再import了
new webpack.ProvidePlugin({
React:'react',
ReactDOM:'react-dom'
})
複製程式碼
公共程式碼抽取
CommonsChunkPlugin
已棄用,使用optimization.splitChunks
代替
作用
提取被重複引入
的檔案,單獨生成一個或多個檔案,這樣避免在多入口重複打包檔案
安裝
無需安裝,內建
配置項
1 . cacheGroups
自定義配置主要使用它來決定生成的檔案
test
限制範圍,可以是正則,匹配資料夾或檔案name
生成檔名priority
優先順序,多個分組衝突時決定把程式碼放在哪塊- 其他參見下面
新的chunk檔案形成應該符合下面 2-4 條規則
2 . minSize
最小尺寸必須大於此值,預設30000B
3 . minChunks
其他entry引用次數大於此值,預設1
注:
- 個人理解
minChunks
指的是被不同entry
引入的次數 - 為1時,適合分離
node_moudles
裡的第三方庫(很多人認為這個值設成2其實不合理)
4 . maxInitialRequests
entry檔案請求的chunks不應該超過此值(請求過多,耗時)
5 . maxAsyncRequests
非同步請求的chunks不應該超過此值
6 . automaticNameDelimiter
自動命名連線符
7 . chunks
值為"initial", "async"(預設) 或 "all"
- initial 入口chunk,對於非同步匯入的檔案不處理
- async 非同步chunk,只對非同步匯入的檔案處理(個人理解)
- all 全部chunk(我反正選all,不甚理解)
使用方式
1 . 使用預設配置
不配置時再production模式下開啟async
配置如下,啟用預設配置
optimization:{
splitChunks:{
chunks:"all"
}
}
複製程式碼
生成的檔案 vendors~xx.js
,xx與入口名對應(可能不生成)。
附預設配置
optimization: {
splitChunks: {
chunks: "async",
minSize: 30000,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {//cacheGroups重寫繼承配置,設為false不繼承
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
複製程式碼
2 . 自定義配置
生成的檔案 xx.js
,xx指name的值
配置示例
optimization: {
//打包 第三方庫
//打包 公共檔案
splitChunks: {
cacheGroups: {
vendor:{//node_modules內的依賴庫
chunks:"all",
test: /[\\/]node_modules[\\/]/,
name:"vendor",
minChunks: 1, //被不同entry引用次數(import),1次的話沒必要提取
maxInitialRequests: 5,
minSize: 0,
priority:100,
// enforce: true?
},
common: {// ‘src/js’ 下的js檔案
chunks:"all",
test:/[\\/]src[\\/]js[\\/]/,//也可以值檔案/[\\/]src[\\/]js[\\/].*\.js/,
name: "common", //生成檔名,依據output規則
minChunks: 2,
maxInitialRequests: 5,
minSize: 0,
priority:1
}
}
}
}
複製程式碼
配合 runtimeChunk
optimization.runtimeChunk
用來提取 entry chunk 中的 runtime部分函式,形成一個單獨的檔案,這部分檔案不經常變換,方便做快取。
配置如下
runtimeChunk: {
name: 'manifest'
}
複製程式碼
注:個人測試的時候,發現提出的東西很少,不是很理解這個 runtime