理解webpack4.splitChunks

来源:https://www.cnblogs.com/kwzm/archive/2019/01/24/10314438.html
-Advertisement-
Play Games

一、前言 之前一直也沒有研究過webpack4是基於怎樣的規則去拆分模塊的,現在正好有時間打算好好瞭解一下,看了官方文檔也陸陸續續的看了看網上別人寫的文章,感覺大部分都是將官方文檔翻譯了一遍,很多問題都沒有解釋清楚,無奈只好自己寫demo去通過實際編譯結果來理解,經過一天多的不斷調試和百度,基本弄清 ...


一、前言

  之前一直也沒有研究過webpack4是基於怎樣的規則去拆分模塊的,現在正好有時間打算好好瞭解一下,看了官方文檔也陸陸續續的看了看網上別人寫的文章,感覺大部分都是將官方文檔翻譯了一遍,很多問題都沒有解釋清楚,無奈只好自己寫demo去通過實際編譯結果來理解,經過一天多的不斷調試和百度,基本弄清楚了splitChuns的運行規則了,特此記錄下來。

二、webpack中的三個概念module、chunk和bundle

  在研究splitChunks之前,我們必須先弄明白這三個名詞是什麼意思,主要是chunk的含義,要不然你就不知道splitChunks是在什麼的基礎上進行拆分。

  從官網上貌似沒找太多的解釋,去網上搜了搜基本上都在轉述這位老哥的回答《what are module,chunk and bundle in webpack》,我根據自己的理解給出我個人的看法:

  • module:就是js的模塊化webpack支持commonJS、ES6等模塊化規範,簡單來說就是你通過import語句引入的代碼。
  • chunk: chunk是webpack根據功能拆分出來的,包含三種情況:

    1、你的項目入口(entry)

    2、通過import()動態引入的代碼

    3、通過splitChunks拆分出來的代碼

    chunk包含著module,可能是一對多也可能是一對一。

  • bundle:bundle是webpack打包之後的各個文件,一般就是和chunk是一對一的關係,bundle就是對chunk進行編譯壓縮打包等處理之後的產出。

三、splitChunks

  下麵進入正題講解splitChunks,splitChunks就算你什麼配置都不做它也是生效的,源於webpack有一個預設配置,這也符合webpack4的開箱即用的特性,它的預設配置如下:

module.exports = {
  //...
  optimization: {
    splitChunks: {
      chunks: 'async',
      minSize: 30000,
      minChunks: 1,
      maxAsyncRequests: 5,
      maxInitialRequests: 3,
      automaticNameDelimiter: '~',
      name: true,
      cacheGroups: {
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          priority: -10
        },
        default: {
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true
        }
      }
    }
  }
};

我們現在用一個簡單的react項目來測試下打包之後的效果如何,我的這個項目有兩個頁面entry1.js和page1.js,entry1.js是入口文件,entry1.js裡面動態引入了page1.js。

entry1.js

 1 import React from 'react'
 2 import ReactDOM from 'react-dom'
 4 
 5 const App = () => {
 6   let Page1 = null
 7 
 8   import(/* webpackChunkName: "page1" */'./routes/page1').then(comp => {
 9     Page1 = comp
10   })
11   console.log($)
12   return (
13     <div>
14       <div>App</div>
15       <Page1 />
16     </div>
17   )
18 }
19 
20 ReactDOM.render(<App />, document.getElementById('root'))

page1.js

 1 import React from 'react'
 2 import _ from 'lodash'
 4 
 5 const Page1 = () => {
 6   console.log($)
 7   
 8   return (
 9     <div>
10       <div>Page1</div>
11     </div>
12   )
13 }
14 
15 export default Page1

讓我們想一想打包之後的代碼是怎樣的呢?

 

以上就是打包之後的代碼,是否如你所想呢,讓我們分析一下:

1、第一個main文件就是打包之後的入口文件,這個我們上面說了webpack會把入口文件單獨拆成一個chunk,這個沒有問題

2、第三個page1文件,我們上面也說過動態載入得文件webpack會將其拆分為一個chunk,這個也沒有問題

3、第二個vendor~page1文件,這個是對page1文件裡面引入的第三方庫進行打吧,具體就是lodash那個第三方庫了,這個涉及到cacheGroup,我們在下麵的系列文章裡面會詳細講述

以上就是所有被拆分出來的包,但是我們發現有一個文件沒有拆分出來,那就是entry1裡面引入的第三方庫react-dom,這個是為什麼呢,這個就要涉及到我們接下來講到的chunks屬性的配置。

註意:這裡提個小問題為什麼react-dom這個第三方庫只在entry1.js裡面引入了一次就被拆分出來了?這個答案我將在第三篇文章《理解webpack4.splitChunks之cacheGroups》裡面進行解釋。

 

為了方便閱讀我將整個系列分為了若幹小部分,大家可以各取所需:

《理解webpack4.splitChunks之chunks》

《理解webpack4.splitChunks之cacheGroups》

《理解webpack4.splitChunks之maxInitialRequests》

《理解webpack4.splitChunks之maxAsyncRequests》

《理解webpack4.splitChunks之其餘要點》

 

文章中所用到的源碼倉庫地址是webpack-splitChunks-demo


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

-Advertisement-
Play Games
更多相關文章
  • ACCP8.0 HTML標簽 第一章1、HTML超文本標記語言2、網頁<html></html>3、網頁頭部<head></head>4、網頁標題<title></title>5、網頁主體<body></body>6、DOCTYPE聲明3種級別:(1)Strict 嚴格類型(2)Transition ...
  • 問題描述: You're given strings J representing the types of stones that are jewels, and S representing the stones you have. Each character in S is a type o ...
  • html的標簽可以分為: 塊級標簽:div(白板),H系列(加大加粗,H1—H7,字體一般逐漸變小,一般用作標題),p標簽(段落之間有間距) 行內標簽:span(白板) 此外,標簽之間是可以嵌套的。為何存在標簽,是為了實現css和js操作(後續會學到)。 input系列的標簽: input type ...
  • 在網頁的<head>中增加以上這句話,可以讓網頁的寬度自動適應手機屏幕的寬度 其中: width=device-width :表示寬度是設備屏幕的寬度 height=device-height :表示寬度是設備屏幕的寬度 initial-scale=1.0:表示初始的縮放比例(初始規模為1.0倍,即 ...
  • v-on指令用來觸發頁面事件的指令。 如上代碼,指令書寫格式為:v-on:事件名稱,不要忘記書寫:,等於號後面的內容是Vue對象里聲明的方法。 在Vue對象里,我們添加了一個新的屬性,叫做methods,它用來聲明方法對象,其中show即為我們聲明的方法對象。 運行結果: 在Vue中,我們還可以對v ...
  • 前言:最近正好在找工作,當面試官問到我事件冒泡和事件捕獲的時候,我想我的回答並不全面合理,基於這方面的原因,我打算抽點時間來和大伙聊聊, 並不一定全面,多多包涵。 首先咱們先聊聊事件冒泡: 什麼是事件冒泡 事件冒泡:如果一個元素的事件被觸發,那麼他的所有父級元素的同名事件也會被依次觸發 元素->父元 ...
  • 1. 字元串: 2. 數值 js中,數值類型比較簡單,不區分整型浮點型等數字類型。就是這個數,帶不帶小數點,對js來說都是一樣進行識別。 <!DOCTYPE html><html><body> <script>var a = 1;var b = 2.3;var c = a + b;var name1 ...
  • HTML是什麼? 超文本標記語言(Hypertext Markup Language, HTML)是一種用於創建網頁的標記語言。 本質上是瀏覽器可識別的規則,我們按照規則寫網頁,瀏覽器根據規則渲染我們的網頁。對於不同的瀏覽器,對同一個標簽可能會有不同的解釋。(相容性問題) 網頁文件的擴展名:.htm ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...