maxInitialRequests是splitChunks里面比較難以理解的點之一,它表示允許入口並行加載的最大請求數,之所以有這個配置也是為了對拆分數量進行限制,不至於拆分出太多模塊導致請求數量過多而得不償失。
這里需要注意幾點:
- 入口文件本身算一個請求
- 如果入口里面有動態加載得模塊這個不算在內
- 通過runtimeChunk拆分出的runtime不算在內
- 只算js文件的請求,css不算在內
- 如果同時又兩個模塊滿足cacheGroup的規則要進行拆分,但是maxInitialRequests的值只能允許再拆分一個模塊,那尺寸更大的模塊會被拆分出來
是不是感覺還是太抽象了難以理解,我下面會通過一個例子來實際演示一下:
我在webpack里面配置三個入口文件entry1.js、entry2.js和entry3.js:
splitChunks的配置如下基本就是默認配置(只不過把chunks的范圍改為了all):
splitChunks: { chunks: 'all', 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 } } }
entry1.js:
import React from 'react' import ReactDOM from 'react-dom' import $ from './assets/jquery' import OrgChart from './assets/orgchart' const App = () => { let Page1 = null import(/* webpackChunkName: "page1" */'./routes/page1').then(comp => { Page1 = comp }) return ( <div> <div>App</div> <Page1 /> </div> ) } ReactDOM.render(<App />, document.getElementById('root'))
entry2.js
import React from 'react' import ReactDOM from 'react-dom' import $ from './assets/jquery' const App = () => { console.log($) return ( <div> <div>entry2</div> </div> ) } ReactDOM.render(<App />, document.getElementById('root'))
entry3.js
import React from 'react' import ReactDOM from 'react-dom' import OrgChart from './assets/orgchart' const App = () => { return ( <div> <div>App</div> </div> ) } ReactDOM.render(<App />, document.getElementById('root'))
打包結果:
讓我們來分析下這個demo:
1、entry1.js和entry2.js兩個入口會被拆分成兩個文件就是最下面這兩個,這個沒有問題
2、因為entry1.js和entry2.js都引入了第三方庫react、react-dom所以會被cacheGroups中的vendors緩存組進行拆分成第二個包vendors~entry1~entry2
3、因為entry1.js和entry2.js都引入了共同的模塊jquery.js(注意default不是從node_modules里面引入的,是我下載到本地的),所以滿足cacheGroups的default緩存組,所以被拆成了第二個包default~entry1~entry2
4、page1因為是在entry1.js里面動態引入的所以被拆分出來
5、vendors~page1就是page1里面引入的第三方庫lodash
6、剩下的三個文件都是入口chunk
但是這里我們發現我們在entry1.js和entry3.js里面共同引入的orgchart.js沒有被拆分出來,這個文件是完全滿足cacheGroups中的default這個緩存組的,但是卻沒有被拆分出來,查看打包的分析頁面:
我們發現orgchart.js確實都還在入口文件里面面,那為什么會導致這個問題呢,這就是因為咱們今天的主角maxInitialRequests,因為它的默認值為3,所以每個入口的並發請求數就不能大於3,我們看下entry1的並發請求數目前有哪些:
1、entry1.js本身是一個對應的就是entry1.cc7c4ca4.js這個文件
2、vendors~entry1~entry2~entry3.chunkhash.chunk.js(hash太長了就不寫了= =)
3、default~entry1~entry2.chunkhash.chunk.js
所以目前已經達到了最大的請求數3,這就是為什么不會吧orgchart.js再拆分出來的原因,那么如果我把maxInitialRequests改為4呢?
打包之后的結果如下:
可以看到多打出來的包正是我們希望的orgchart.js文件,這也證明了maxInitialRequests的作用。
注意:你有沒有發現第一次打包的時候為什么是jquery被拆分了而orgchart.js沒有被拆分,為啥不是倒過來呢?
這就是我在文章開頭所說的當同時又兩個模塊滿足拆分條件的時候更大的包會先被拆分
可以看到jquery.js的大小明顯大於orgchart.js的大小,所以它被先拆分了。