The
DllPlugin
andDllReferencePlugin
provide means to split bundles in a way that can drastically improve build time performance.javascript
DllPlugin
結合DllRefrencePlugin
插件的運用,對將要產出的bundle文件進行拆解打包,能夠很完全地加快webpack的打包速度,從而在開發過程當中極大地縮減構建時間。html
結論先行:使用DllPlugin
和DllRefrencePlugin
進行構建,能夠縮減50%~70%的構建時間。java
參考Demo:dllplugin-demojquery
main.js
引入了一個
jQuery
文件,圖示打包耗時2.3s。
對比上面兩張圖打包的模塊列表,圖二有一行不同的輸出:webpack
[0] delegated ./src/components/jquery.js from dll-reference vendor_57c12dcd8d9774596525 42 bytes {0} [built]
複製代碼
這說明,這次的打包過程,沒有從新打包jQuery
模塊,而是直接從vendor_57c12dcd8d9774596525
中代理了。git
DllPlugin做用示意圖: github
爲了減少篇幅,只帖關鍵配置內容,詳細訪問dllplugin-demo:web
// webpack.dll.config.js
module.exports = {
entry: {
// 定義程序中打包公共文件的入口文件vendor.js
vendor: [path.resolve(src, 'js', 'vendor.js')],
},
plugins: [
new webpack.DllPlugin({
// manifest緩存文件的請求上下文(默認爲webpack執行環境上下文)
context: process.cwd(),
// manifest.json文件的輸出位置
path: path.join(src, 'js', 'dll', '[name]-manifest.json'),
// 定義打包的公共vendor文件對外暴露的函數名
name: '[name]_[hash]'
})
]
}
複製代碼
在配置好webpack.dll.config.js
文件以後,在vendor.js
中聲明項目程序中所引用的靜態公共資源。shell
// vendor.js
// 引入自定義在項目目錄中的公共資源(能夠在配置中聲明alias映射關係)
import 'jquery';
// or 引入npm包資源
// import 'Vue';
複製代碼
// cross-env模塊須要另外安裝
cross-env NODE_ENV=production webpack --config webpack.dll.config.js --colors --display-modules
複製代碼
根據webpack.dll.config.js
,會在指定位置生成vendor.dll.js
文件。npm
生成靜態公共資源vendor.dll.js
以後,下一步就要在入口文件中關聯引用,這項工做則是由DllRefrencePlugin
完成的。
// webpack.config.js
module.exports = {
entry: {
// 項目入口文件
'app':path.resolve(src, 'js', 'main.js')
},
plugins: [
// dllPlugin關聯配置
new webpack.DllReferencePlugin({
// 跟dll.config裏面DllPlugin的context一致
context: process.cwd(),
// dll過程生成的manifest文件
manifest: require(path.join(src, 'js', "dll", "vendor-manifest.json"))
})
]
}
複製代碼
// main.js
// 引入的公共模塊若是在vendor中有被引用過,那麼編譯的時候直接使用靜態文件vendor.dll.js
import $ from 'jquery';
console.log($)
// import Vue from "Vue";
// console.log(Vue)
複製代碼
引入方式沒有什麼不一樣的,跟平時正常引入便可。
最後一步,在模板中注入vendor.dll.js
<!-- index.html -->
<script type="text/javascript" src="/src/js/dll/vendor.dll.js"></script>
複製代碼
如此,在接下來的本地開發(dev過程)和線上構建過程,將再也不重複靜態公共資源的構建,極大地縮減咱們的構建時間。
以上爲webpack
(Version 4)使用過程當中的小小總結,歡迎刊誤或提供優化建議~
參考: