webpack編譯速度提高之DllPlugin

1、前言

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

DllPlugin結合DllRefrencePlugin插件的運用,對將要產出的bundle文件進行拆解打包,能夠很完全地加快webpack的打包速度,從而在開發過程當中極大地縮減構建時間。html

2、構建效果

結論先行:使用DllPluginDllRefrencePlugin進行構建,能夠縮減50%~70%的構建時間。java

參考Demo:dllplugin-demojquery

2.1 使用DllPlugin前的構建速度

入口文件 main.js引入了一個 jQuery文件,圖示打包耗時2.3s。

2.2 使用DllPlugin後的構建速度

使用插件後,打包耗時0.6s,單次對比,縮減時長達到73%!

2.3 如何驗證DLLPlugin已經生效

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

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

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

3、Get Started

DllPlugin做用示意圖: github

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

3.1.1 定義webpack.dll.config.js

爲了減少篇幅,只帖關鍵配置內容,詳細訪問dllplugin-demoweb

// 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中聲明項目程序中所引用的靜態公共資源。shell

// 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文件。npm

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 構建速度

相關文章
相關標籤/搜索