webpack動態載入打包chunk命名

来源:https://www.cnblogs.com/dahe1989/archive/2019/09/20/11543832.html
-Advertisement-
Play Games

最近,遇到複雜h5頁面開發,為了優化H5首屏載入速度,想到使用按需載入的方式,減少首次載入的JavaScript文件體積,於是將處理過程在這裡記錄一下,涉及到的主要是以下三點: 使用Webpack如何做按需載入 filename和chunkFilename的區別 如何命名chunk的名稱(webpa ...


最近,遇到複雜h5頁面開發,為了優化H5首屏載入速度,想到使用按需載入的方式,減少首次載入的JavaScript文件體積,於是將處理過程在這裡記錄一下,涉及到的主要是以下三點:

  • 使用Webpack如何做按需載入
  • filename和chunkFilename的區別
  • 如何命名chunk的名稱(webpackChunkName)

1 使用Webpack如何做按需載入

大家都知道Webpack是現在流行的前端打包編譯工具,通過模塊之間的依賴關係,將代碼打包組織到一起。Webpack目前已經到v4.x,不同版本版支持按需載入的方式不同,主要有兩種:

  • webpack1.x 中提供了 require.ensure()
  • webpack2.x 中提供了 import()

require.ensure()

// 舉例
require.ensure([], function(require){
    require('b');
});

 

webpack 在編譯時,會靜態地解析代碼中的 require.ensure(),同時將[模塊b] 添加到一個分開的 chunk 當中。這個新的 chunk 會被 webpack 通過 jsonp 來按需載入。

為什麼說到是靜態分析,我們可以看到下麵的require.ensure語法,第二個參數callback就是一個回調函數。其中需要註意的是,這個回調函數有一個參數require,通過這個require就可以在回調函數內按需引入其他模塊。值得註意的是,雖然這個require是回調函數的參數"module",理論上可以換其他名稱,但是實際上是不能換的,否則webpack就無法靜態分析的時候處理它。

require.ensure(
    dependencies: String[], 
    callback: function(require){
        require('module');
    }, 
    errorCallback: function(error){}, 
    chunkName: String
)

import()

要註意的是import() 函數不同於import命令,import 是 ECMAScript 6 Module 的語法,import 是靜態執行,這裡不多說,可以去看import 命令

import(specifier)

上面代碼中,import函數的參數specifier,指定所要載入的模塊的位置,而且specifier可以是一個方法,動態的生成模塊路徑。import命令能夠接受什麼參數,import()函數就能接受什麼參數,兩者區別主要是後者為動態載入。

import()函數是 ECMAScript Stage 3 草案階段的語法;用於完成動態載入即運行時載入,可以用在任何地方。import()函數 返回的是一個 Promise。類似於 CommonJs 的 require() ,區別主要是前者是非同步載入,後者是同步載入。

import的應用場景有以下三種 (參考自ECMAScript 6 入門):

  1. 按需載入。import()可以在需要的時候,再載入某個模塊
  2. 條件載入。import()可以放在if代碼塊,根據不同的情況,載入不同的模塊。
  3. 動態的模塊路徑。import()允許模塊路徑動態生成。

用法大致如下:

import('./myModule.js')
    .then(myModule => {
        console.log(myModule.default);
    });

小結

目前我們用的比較多的是import來做按需載入,模塊路徑可以動態生成,更適合現在的應用場景。

filename和chunkFilename的區別

能夠打包之後,我們會發現打包出來的chunk的路徑和命名是極其簡單的1,2,3...這樣子的數字,對於我們要定製路徑和名字的話,就會涉及到filename和chunkFilename。

  • output.filename 決定了每個入口(entry) 輸出 bundle 的名稱。
  • output.chunkFilename 決定了非入口(non-entry) chunk 文件的名稱。

常用的Webpack配置如下

module.exports = {
    //...
    output: {
        filename: '[name].[hash].bundle.js',
        chunkFilename: '[name].[hash].chunk.js',
    }
};

filename和chunkFilename對應的結果可以由以下參數拼接或者返回:

模板描述
[hash] 模塊標識符(module identifier)的 hash
[chunkhash] chunk 內容的 hash
[name] 模塊名稱
[id] 模塊標識符(module identifier)
[query] 模塊的 query,例如,文件名 ? 後面的字元串
[function] 方法,可以返回一個filename字元串

不同的是chunkFilename我們不能想filename中的name那樣,可以在entry中定義。也就是說對於chunkFilename,預設[id]和[name]是一樣的,那麼如何自定義name呢?

如何命名chunk的名稱

只能說哪裡有壓迫,哪裡就會有反抗,chunkFileName不能靈活自定義,這誰能忍,於是便有了/* webpackChunkName: "" */,號稱是Magic Comments(魔術註釋法)。

Webpack通過增加內聯註釋來告訴運行時,該有怎樣的行為。通過向import中添加註釋,我們可以執行諸如命名chunk或選擇不同模式之類的操作。

這裡著重講一下webpackChunkName,它其實就是對chunkFilename定義時[name]值的改寫,/* webpackChunkName: "hello" */,意味著[name]等於hello。

於是上面的代碼就會按照下麵的方式來寫,打包出來的chunk文件將會出現在plugins文件夾下,名字叫myModule.a2d1d5d8e7d5d4d4d4se.chunk.js。

import(/* webpackChunkName: "plugins/myModule" */
    './myModule.js')
    .then(myModule => {
        console.log(myModule.default);
    });

更多的魔術註釋,請參考Webpack官方文檔

結束了

到此為止,我們已經可以將代碼打包到多個文件,每個chunk可以獨立命名,是的就是這樣。


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

-Advertisement-
Play Games
更多相關文章
  • # 今日內容: 1. JavaScript: 1. ECMAScript: 2. BOM: 3. DOM: 1. 事件 ## DOM簡單學習:為了滿足案例要求 * 功能:控制html文檔的內容 * 獲取頁面標簽(元素)對象:Element * document.getElementById("id值 ...
  • css3過渡動畫速率用到的是三階貝塞爾曲線,曲線有四個點,p0,p1,p2,p3 有四個屬性: linear 規定以相同速度開始至結束的過渡效果(等於 cubic-bezier(0,0,1,1))。 ease 規定慢速開始,然後變快,然後慢速結束的過渡效果(cubic-bezier(0.25,0.1 ...
  • JS盒子模型屬性 在JS中通過相關的屬性可以獲取(設置)元素的樣式信息,這些屬性就是盒子模型屬性(基本上都是有關於樣式的) |屬性|值| |: |: | |client |top/left/width/height| |offset |top/left/width/height/parent| |s ...
  • 1 新建plugin.js,文件內容如下 2 在main.js中引入 至此,方式屬性已經全局引入,在vue頁面可以使用 ...
  • HTML是一種描述網頁的語言。全稱是Hyper Text Markup Language(超文本標記語言),是一種標記語言,由許多的標記標簽組成。 一 HTML標簽 1,簡介 HTML語言是由許多標簽組成,HTML 標簽是由尖括弧包圍的關鍵詞,比如 <html>。 HTML標簽都是小寫的。 HTML ...
  • 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。原文出處:https://blog.bitsrc.io/pure-html-widgets-for-your-web-application-c9015563af7a 在我們以往看到的頁面效果中,很多效果是需要 ...
  • 0920自我總結 關於hover與after,before已及first letter,first line的聯用 一.寫法 元素:hover::after{樣式} 元素:hover::before{樣式} 二.使用 元素:hover::after{樣式}與元素:after{content:'插入的 ...
  • 效果 效果圖如下 ​ ​ 實現思路 dom結構 按照實現思路,我們需要如下的dom結構 <div class="container"> <div class="cube-wrap"> <div class="cube"> <div class="front">front</div> <div cla ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...