webpack編譯速度提升之DllPlugin

_安歌發表於2018-07-08

一、前言

The DllPlugin and DllReferencePlugin provide means to split bundles in a way that can drastically improve build time performance.

DllPlugin結合DllRefrencePlugin外掛的運用,對將要產出的bundle檔案進行拆解打包,可以很徹底地加快webpack的打包速度,從而在開發過程中極大地縮減構建時間。

二、構建效果

結論先行:使用DllPluginDllRefrencePlugin進行構建,可以縮減50%~70%的構建時間

參考Demo:dllplugin-demo

2.1 使用DllPlugin前的構建速度

webpack編譯速度提升之DllPlugin
入口檔案main.js引入了一個jQuery檔案,圖示打包耗時2.3s。

2.2 使用DllPlugin後的構建速度

webpack編譯速度提升之DllPlugin
使用外掛後,打包耗時0.6s,單次對比,縮減時長達到73%!

2.3 如何驗證DLLPlugin已經生效

對比上面兩張圖打包的模組列表,圖二有一行不一樣的輸出:

[0] delegated ./src/components/jquery.js from dll-reference vendor_57c12dcd8d9774596525 42 bytes {0} [built]
複製程式碼

這說明,此次的打包過程,沒有重新打包jQuery模組,而是直接從vendor_57c12dcd8d9774596525中代理了。

三、Get Started

DllPlugin作用示意圖:

webpack編譯速度提升之DllPlugin

3.1 配置webpack.dll.config.js打包靜態公共資源

3.1.1 定義webpack.dll.config.js

為了減小篇幅,只帖關鍵配置內容,詳細訪問dllplugin-demo

// 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]'
        })
    ]
}
複製程式碼
3.1.2 宣告靜態公共資源

在配置好webpack.dll.config.js檔案之後,在vendor.js中宣告專案程式中所引用的靜態公共資源。

// vendor.js
// 引入自定義在專案目錄中的公共資源(可以在配置中宣告alias對映關係)
import 'jquery';

// or 引入npm包資源
// import 'Vue';
複製程式碼
3.1.3 打包靜態公共資源
// cross-env模組需要另外安裝
cross-env NODE_ENV=production webpack --config webpack.dll.config.js --colors --display-modules
複製程式碼

根據webpack.dll.config.js,會在指定位置生成vendor.dll.js檔案。

3.2 配置webpack.config.js打包入口檔案

生成靜態公共資源vendor.dll.js之後,下一步就要在入口檔案中關聯引用,這項工作則是由DllRefrencePlugin完成的。

3.2.1 在webpack.config.js中關聯引用
// 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"))
        })
    ]
}
複製程式碼
3.2.2 專案入口檔案中引用靜態公共資源
// main.js
// 引入的公共模組如果在vendor中有被引用過,那麼編譯的時候直接使用靜態檔案vendor.dll.js
import $ from 'jquery';
console.log($)

// import Vue from "Vue";
// console.log(Vue)
複製程式碼

引入方式沒有什麼不同的,跟平時正常引入即可。

3.2.3 專案模板中引用公共靜態資源

最後一步,在模板中注入vendor.dll.js

<!-- index.html -->
<script type="text/javascript" src="/src/js/dll/vendor.dll.js"></script>
複製程式碼

如此,在接下來的本地開發(dev過程)和線上構建過程,將不再重複靜態公共資源的構建,極大地縮減我們的構建時間。

結語

以上為webpack(Version 4)使用過程中的小小總結,歡迎刊誤或提供優化建議~

參考:

DllPlugin

使用 HappyPack 和 DllPlugin 來提升你的 Webpack 構建速度

相關文章