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)使用過程當中的小小總結,歡迎刊誤或提供優化建議~
參考: