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

DllPlu" />

詳解webpack編譯速度提升之DllPlugin

 更新時間:2019-02-06 22:00:23   作者:佚名   我要評論(0)

一、前言

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

DllPlu

一、前言

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

 

入口文件 main.js 引入了一個 jQuery

文件,圖示打包耗時2.3s。

2.2 使用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作用示意圖:

 

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)使用過程中的小小總結,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • 詳解如何webpack使用DllPlugin
  • 詳解基于DllPlugin和DllReferencePlugin的webpack構建優化

相關文章

  • 詳解webpack編譯速度提升之DllPlugin

    詳解webpack編譯速度提升之DllPlugin

    一、前言 The DllPlugin and DllReferencePlugin provide means to split bundles in a way that can drastically improve build time performance. DllPlu
    2019-02-06
  • Vue從TodoList中學父子組件通信

    Vue從TodoList中學父子組件通信

    簡單的 TodoList 實現一個簡單的 todolist,當我輸入內容后,點擊提交自動添加在下面,如下圖所示: 用代碼實現這個效果: <div id="app"> <input ty
    2019-02-06
  • Tensorflow分類器項目自定義數據讀入的實現

    Tensorflow分類器項目自定義數據讀入的實現

    在照著Tensorflow官網的demo敲了一遍分類器項目的代碼后,運行倒是成功了,結果也不錯。但是最終還是要訓練自己的數據,所以嘗試準備加載自定義的數據,然而d
    2019-02-06
  • ES6 對象的新功能與解構賦值介紹

    ES6 對象的新功能與解構賦值介紹

    ES6 通過字面量語法擴展、新增方法、改進原型等多種方式加強對象的使用,并通過解構簡化對象的數據提取過程。 一、字面量語法擴展 在 ES6 模式下使用字
    2019-02-06
  • Redis連接錯誤的情況總結分析

    Redis連接錯誤的情況總結分析

    前言 最近由于流量增大,redis 出現了一連串錯誤,比如: LOADING Redis is loading the dataset in memory use of closed network connection connec
    2019-02-06
  • 使用TensorFlow實現二分類的方法示例

    使用TensorFlow實現二分類的方法示例

    使用TensorFlow構建一個神經網絡來實現二分類,主要包括輸入數據格式、隱藏層數的定義、損失函數的選擇、優化函數的選擇、輸出層。下面通過numpy來隨機生成一
    2019-02-06
  • PHP實現字符串大小寫轉函數的功能實例

    PHP實現字符串大小寫轉函數的功能實例

    字符串的大小寫轉換功能在日常中經常使用。那么如何實現一個簡單的大小寫轉換功能呢&#63; 在php中,最終使用的是c語言的toupper,tolower函數將字符進行大小寫
    2019-02-06
  • Nginx代理時header頭中帶"_"信息丟失問題的解決

    Nginx代理時header頭中帶"_"信息丟失問題的解決

    前言 開發網關項目時,在請求時往請求頭header中放入了簽名sign_key信息,在接收請求時再從header中拿出,在本地調試時是可以的,但上線之后通過Nginx代理之后
    2019-02-06
  • Python實現E-Mail收集插件實例教程

    Python實現E-Mail收集插件實例教程

    __import__函數 我們都知道import是導入模塊的,但是其實import實際上是使用builtin函數import來工作的。在一些程序中,我們可以動態去調用函數,如果我們
    2019-02-06
  • C++類中的特殊成員函數示例詳解

    C++類中的特殊成員函數示例詳解

    前言 C++類中有幾個特殊的非靜態成員函數,當用戶未定義這些函數時,編譯器將給出默認實現。C++11前有四個特殊函數,C++11引入移動語義特性,增加了兩個參數為
    2019-02-06

最新評論

黑龙江新11选5开奖结果