webpack CommonsChunkPlugin與SplitChunksPlugin

基礎

commons-chunk-plugin
split-chunks-plugin
即webpack的分包插件。CommonsChunkPlugin于4.0及以后被移除空盼,使用SplitChunksPlugin替代纫事。

chunk:塊册着,指若干個js module的集合
bundle:形式上是塊的集合,意義是代表一個可以運行的整體
chunk和bundle:what-are-module-chunk-and-bundle-in-webpack
比較難說明判莉,搜的基本都是個人總結(jié),官方描述也比較抽象育谬。
就我個人總結(jié)來說券盅,一個模塊化的js文件就是一個模塊,若干個js模塊會打包成一個總的js文件膛檀,這個js文件稱作bundle锰镀。但如果是多頁面應用,往往會安排為一個html對應一個bundle宿刮,那么兩個html的bundle之間重復的模塊就是重復代碼互站。此時我們會把這兩個bundle重復的模塊抽出來,稱為common chunk僵缺,余下的兩部分直接稱作兩個chunk。即此時一共有3個chunk踩叭,但依然只有兩個bundle磕潮。
單頁面應用中異步加載,或者單純想分離出不變的第三方庫容贝,均可采用該手段進行優(yōu)化自脯。

入口chunk:entry里面的指定的入口,他們對應一個chunk并且key值就是chunk name


CommonsChunkPlugin

最基本使用

CommonsChunkPlugin基本選項:
name:選擇一個chunk斤富。該chunk存在則選中膏潮,不存在則新建。代表把下面的chunks他們的重復模塊合并到這個chunk
chunks:chunk來源满力,不設置代表選擇全部入口chunk
minChunks:被多少次重復引用時才抽出來焕参。數(shù)量必須大于等于2,或者少于等于chunks的數(shù)量
請對照著官方示例直接上:

良心作圖1

圖解1:入口有6個油额,當然有6個chunk了叠纷。每個chunk都是js模塊的集合,如pageA這個chunk就有4個模塊{a-b,a-c,a-b-c,pageA}潦嘶,圖里省略了一些路徑和入口文件的那個模塊(如pageA.js也在pageA這個chunk里涩嚣,但省略了),這樣分析比較清楚掂僵。

良心作圖2

圖解2:第一個new CommonsChunkPlugin那個執(zhí)行完成后航厚,如圖所示。有7個chunk锰蓬,其中a-b-c.js和admin.js被抽出放到admin-commons中

良心作圖3

圖解3:minChunks為2幔睬,即重復引用兩次即可抽出,顯然a-b重復兩次互妓、a-b-c重復3次溪窒,均被抽出

良心作圖4

圖解4:a-b-c抽出

最終盗誊,9個chunk收叶,生成9個js文件。
至于“父子關系”,看圖即可驮吱。假如我們要引入adminPageA.js,就要先引入admin-commons.js逊拍,因為他有部分代碼在admin-commons.js爱咬;同理要引入admin-commons.js就要先引入commons.js,最終在html的導入寫法如官方例子所示份汗。

進階使用

1.minChunks: Infinity有何用盈电?無窮次重復引用才抽出?
明確第三方庫 chunk杯活。注意name的說明有說是存在則選擇匆帚,chunks的說明有說不寫則默認選中全部入口chunk,這說明可能會把入口chunk之間重復的模塊抽到vendor(早已存在旁钧,包含"jquery", "other-lib"模塊)吸重。這里只是一個保證,自己能弄明白的時候這個可以換種寫法或者直接整個省略不寫歪今。

2.children嚎幸、async
弄懂這兩個就算大成了,剩下的minSize寄猩、deepChildren自己猜都能猜到嫉晶。
這里右轉(zhuǎn):webpack中ensure方法和CommonsChunkPlugin中的children選項
上面的例子都是基于require直接靜態(tài)導入的,但是對于動態(tài)導入的require.ensure和動態(tài)import函數(shù)來說田篇,情況比較特殊替废,因為他們是直接生成目標模塊的chunk并掛在當前所在chunk下。如a是父親斯辰,b舶担、c是兒子,在動態(tài)引入情況下彬呻,b衣陶、c可能包含相同的模塊。

children闸氮、async就是用來處理子chunk有重復模塊的剪况。
children:true表示chunks等于當前chunk的所有子chunk(你也可以手動chunks:["..."]來選擇它的所有子chunk,前提是你要清晰地知道所有子chunk的chunk name)蒲跨,然后邏輯同上译断,把選中的chunks的重復模塊抽出,合并到當前模塊或悲,換種新的說法就是把子chunk重復的模塊抽出到父chunk孙咪。
async:true表示異步的堪唐,作為 options.name 的子模塊,和 options.chunks 的兄弟模塊被創(chuàng)建(官網(wǎng)的解釋夠鬼畜的)翎蹈。簡單來說淮菠,就是chunk的重復模塊會被抽出,重新組合成一個新的chunk而不是合并到當前chunk荤堪。存在的意義基本上就是為上面那個children合陵,作用是把子chunk重復模塊抽出成新的chunk,不要合并到父chunk中


SplitChunksPlugin

不知道上面有沒有繞暈你澄阳,反正是有點復雜的難說明的拥知。因此webpack4.0后提供一個新的分包插件SplitChunksPlugin,讓你可以開箱即用碎赢,高度抽象低剔。

用法方面,直接當做webpack配置使用即可揩抡,不用再去new一個plugin

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
        }
    }
}

上面是默認配置户侥,你的更改會被合并到該配置中。最外層的配置充當全局配置峦嗤,可被cacheGroups中的配置給繼承和局部覆蓋。
這個不再需要我們?nèi)シ治鍪裁锤缸觕hunk屋摔、哪些chunk之間可能相同需要抽取等等烁设。即使你硬要配置,也只用站在全局角度去考慮首屏靜態(tài)加載的js文件最大數(shù)量maxInitialRequests钓试、動態(tài)加載的最大js數(shù)量maxAsyncRequests等装黑,比起CommonsChunkPlugin那坨東西舒服多了。
詳細學習可右轉(zhuǎn):Webpack4之SplitChunksPlugin

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弓熏,一起剝皮案震驚了整個濱河市恋谭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挽鞠,老刑警劉巖疚颊,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異信认,居然都是意外死亡材义,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門嫁赏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來其掂,“玉大人,你說我怎么就攤上這事潦蝇】畎荆” “怎么了深寥?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贤牛。 經(jīng)常有香客問我惋鹅,道長,這世上最難降的妖魔是什么盔夜? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任负饲,我火速辦了婚禮,結(jié)果婚禮上喂链,老公的妹妹穿的比我還像新娘返十。我一直安慰自己,他們只是感情好椭微,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布洞坑。 她就那樣靜靜地躺著,像睡著了一般蝇率。 火紅的嫁衣襯著肌膚如雪迟杂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天本慕,我揣著相機與錄音排拷,去河邊找鬼。 笑死锅尘,一個胖子當著我的面吹牛监氢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藤违,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼浪腐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了顿乒?” 一聲冷哼從身側(cè)響起议街,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璧榄,沒想到半個月后特漩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡犹菱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年拾稳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腊脱。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡访得,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悍抑,我是刑警寧澤鳄炉,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站搜骡,受9級特大地震影響拂盯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜记靡,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一谈竿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摸吠,春花似錦空凸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至啼止,卻和暖如春道逗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背献烦。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工滓窍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巩那。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓贰您,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拢操。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • configuration webpack 的配置文件舶替,是導出一個對象的 JavaScript 文件 因為 web...
    wfield閱讀 396評論 0 0
  • CommonsChunkPlugin主要是用來提取第三方庫和公共模塊令境,避免首屏加載的bundle文件或者按需加載的...
    My_Life001閱讀 15,011評論 1 14
  • section-3.1 Tree Shaking 概念詳解 當引入一個模塊的時候,只引入需要的代碼顾瞪,而不是所有的代...
    羽晞yose閱讀 601評論 0 1
  • 在開發(fā)vue時舔庶,發(fā)現(xiàn)即使使用了路由懶加載,webpack打包出來的靜態(tài)文件依然還是有點大陈醒,因此惕橙,在開發(fā)途中抽空出來...
    冰Q閱讀 1,013評論 0 0
  • webpack 介紹 webpack 是什么 為什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert閱讀 6,450評論 2 71