webpack 中,webpackPrefetch、webpackPreload 和 webpackChunkName 的區別是什麼?

来源:https://www.cnblogs.com/skychx/archive/2020/05/18/webpack-webpackChunkName-webpackPreload-webpackPreload.html
-Advertisement-
Play Games

`webpackChunkName` 是為預載入的文件取別名,`webpackPrefetch` 會在瀏覽器閑置下載文件,`webpackPreload` 會在父 chunk 載入時並行下載文件。 ...


Webpack 有非常多的概念,很多名詞長得都差不多。我把這些分散在文檔和教程里的內容總結起來,寫了一份 webpack 中的易混淆知識點,目前看是全網獨一份,大家可以加個收藏,方便以後檢索和學習。

全集鏈接 ➡️ webpack 易混淆知識點

這幾個名詞其實都是 webpack 魔法註釋(magic comments)里的,文檔中說了 6 個配置,配置都可以組合起來用。我們說說最常用的三個配置。

3.1 webpackChunkName

前面舉了個非同步載入 lodash 的例子,我們最後把 output.chunkFilename 寫死成 bundle.js。在我們的業務代碼中,不可能只非同步載入一個文件,所以寫死肯定是不行的,但是寫成 [name].bundle.js 時,打包的文件又是意義不明、辨識度不高的 chunk id

{
    entry: {
        index: "../src/index.js"
    },
    output: {
        filename: "[name].min.js",  // index.min.js
        chunkFilename: '[name].bundle.js', // 1.bundle.js,chunk id 為 1,辨識度不高
    }
}

這時候 webpackChunkName 就可以派上用場了。我們可以在 import 文件時,在 import 里以註釋的形式為 chunk 文件取別名:

async function getAsyncComponent() {
    var element = document.createElement('div');
  
    // 在 import 的括弧里 加註釋 /* webpackChunkName: "lodash" */ ,為引入的文件取別名
    const { default: _ } = await import(/* webpackChunkName: "lodash" */ 'lodash');

    element.innerHTML = _.join(['Hello!', 'dynamic', 'imports', 'async'], ' ');

    return element;
}

這時候打包生成的文件是這樣的:

現在問題來了,lodash 是我們取的名字,按道理來說應該生成 lodash.bundle.js 啊,前面的 vendors~ 是什麼玩意?

其實 webpack 懶載入是用內置的一個插件 SplitChunksPlugin 實現的,這個插件裡面有些預設配置項,比如說 automaticNameDelimiter,預設的分割符就是 ~,所以最後的文件名才會出現這個符號,這塊兒內容我就不引申了,感興趣的同學可以自己研究一下。

3.2 webpackPrefetch 和 webpackPreload

這兩個配置一個叫預拉取(Preload),一個叫預載入(Prefetch),兩者有些細微的不同,我們先說說 webpackPreload

在上面的懶載入代碼里,我們是點擊按鈕時,才會觸發非同步載入 lodash 的動作,這時候會動態的生成一個 script 標簽,載入到 head 頭裡:

如果我們 import 的時候添加 webpackPrefetch

...

const { default: _ } = await import(/* webpackChunkName: "lodash" */ /* webpackPrefetch: true */ 'lodash');

...

就會以 <link rel="prefetch" as="script"> 的形式預拉取 lodash 代碼:

這個非同步載入的代碼不需要手動點擊 button 觸發,webpack 會在父 chunk 完成載入後,閑時載入 lodash 文件。

webpackPreload 是預載入當前導航下可能需要資源,他和 webpackPrefetch 的主要區別是:

  • preload chunk 會在父 chunk 載入時,以並行方式開始載入。prefetch chunk 會在父 chunk 載入結束後開始載入。
  • preload chunk 具有中等優先順序,並立即下載。prefetch chunk 在瀏覽器閑置時下載。
  • preload chunk 會在父 chunk 中立即請求,用於當下時刻。prefetch chunk 會用於未來的某個時刻

3.3 一句話總結:

webpackChunkName 是為預載入的文件取別名,webpackPrefetch 會在瀏覽器閑置下載文件,webpackPreload 會在父 chunk 載入時並行下載文件。




最後推薦一下我的個人公眾號:「滷蛋實驗室」,平時會分享一些前端技術和數據分析的內容,大家感興趣的話可以關註一波:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • KafkaCenter是什麼 KafkaCenter是一個針對Kafka的一站式,解決方案。用於Kafka集群的維護與管理,生產者和消費者的監控,以及Kafka部分生態組件的使用。 對於Kafka的平臺化,一直缺少一個成熟的解決方案,之前比較流行的kafka監控方案,如kafka manager提供 ...
  • 新聞 1. "6分鐘完整視頻提前看光谷歌新機Pixel 4a" 1. "統一推送官方解讀:消滅Android毒瘤、待機續航猛增43%" 1. "Google Play細化搜索結果:可按評分、編輯推薦、最新上線過濾" 教程 1. "瞭解一下,Android 10中的ART虛擬機(6)" 1. "使用 ...
  • 我們知道canvas畫布可以很方便的js原生支持轉為圖片格式並下載,但是svg矢量圖形則並沒有這方面原生的支持。研究過HighChart的svg圖形的圖片下載機制,其實現原理大體是瀏覽器端收集SVG代碼信息,併發送到到伺服器端,由後端程式轉換成圖片格式後,以流的形式反射給瀏覽器端下載。 最近在項目中 ...
  • 【目錄】 一、BOM操作 1、window 對象 2、window 子對象 3、history 對象 4、location 對象(掌握) 5、彈出框 6、計時器相關 二、DOM操作 1、DOM相關概念 2、查找標簽 3、節點操作 4、獲取值操作 5、class、css操作 (以下是使用mac筆記本中 ...
  • 如果大家看過一些 webpack4 優化的文章,一定會出現 dll 動態鏈接庫。它以配置之複雜讓眾多初學者記憶猶新。今天我會以一個學習者的角度去一步一步探討 webpack dll 的配置,最後得出一個完美的解決方案。 ...
  • 在 React Native 開發中,最容易遇到的對性能有一定要求場景就是長列表了。在日常業務實踐中,優化做好後,千條數據渲染還是沒啥問題的。 ...
  • sourse-map ,裡面都有個 map 了,肯定是映射的意思。sourse-map 就是一份源碼和轉換後代碼的映射文件。 ...
  • hash 計算與整個項目的構建相關;chunkhash 計算與同一 chunk 內容相關;contenthash 計算與文件內容本身相關。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...