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 MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...