Webpack 提取公共模塊

較早以前總結過一篇【前端構建】WebPack實例與前端性能優化。前端

此次打算寫幾篇對幾個重要的知識點進行更詳細的總結。本篇是此次 Webpack 相關的第三篇總結,以前的兩篇是:
[譯]爲何要 Webpack
Webpack 構建後文件變得很大?react

啃先生(MrKenniu) | 文jquery

上一篇文章提到我主要從四個方面解決 Webpack 構建後文件太大的問題,總結了 Code Split,即按需加載的技能點。這篇總結提取公共代碼。它要解決的問題是冗餘代碼過多,即同一個模塊在多個地方被引用,顯然是解決上一篇文章最後遺留的問題。webpack

Webpack 的 CommonsChunkPlugin 插件,負責將屢次被使用的 JS 模塊打包在一塊兒。web

使用&配置項

使用方法:在 webpack config 的 plugins 屬性裏添加 CommonsChunkPlugin 實例便可。segmentfault

clipboard.png

實例化的配置項「options」以下:數組

name 或者 names:chunk的名稱,若是是 names 數組,則至關於爲數組裏的每一個name 實例化插件。若是缺省,並且 children 或者 asyn 爲 true,那麼,全部的 chunks 都會被使用。性能優化

filename:此 common chunk 的文件名模板,能夠與 output.filename 同樣異步

minChunks:一般狀況下這是一個整數,表示至少有 minChunks 個 chunk 使用了該模塊,該模塊纔會被挪到公共代碼「common chunk」裏。minChunks 還能夠是 Infinity,意味着將沒有任何模塊被移入進來,只是建立當前這個 chunk,這一般用來生成 jquery 等第三方代碼庫。minChunks還能夠是一個返回布爾值的函數,返回 true 該模塊會被移入 common chunk,不然不會。默認值是 chunks 的長度。前端構建

chunks:這是一個元素爲 chunk 名稱的數組,插件將會從這些 chunks 裏提取 common chunks。可見,minChunks 若是是整數,那麼它應該小於 chunks 的長度,且大於1。若是缺省,全部的入口 chunks 會被選中。

children:默認false。若是爲 true ,至關於上一項 chunks 配置爲當前 chunk 的子 chunk,用於 code split。

async:默認false。若是爲 true,生成的 common chunk 將會是異步加載的。這個異步的 common chunk 是 name 這個 chunk 的子 chunk,並且跟 chunks 一塊兒並行加載

minSize:若是有指定大小,那麼 common chunk 的文件大小至少有 minSize 纔會被建立。非必填項。

提示:以上配置項理解起來有些複雜,應結合實際案例運行的結果來理解

CommonsChunkPlugin 能解決的問題

在使用插件前,考慮幾個問題:

  • 對哪些 chunk 進行提取,這決定了 chunks ,children 和 name 要怎麼配置

  • common chunk 是否異步,這決定了 async 怎麼配置

  • common chunk 的粒度,這決定了 minChunks 和 minSize 怎麼配置

如下是官方給出的經常使用的場景:

  • 提取兩個及兩個以上 Chunk 的公共代碼

  • 將 Code Split 切割出來的 Chunk「就是子 Chunk」,提取到父 Chunk

  • 將 Code Split 切割出來的 Chunk,提取到一個新的異步加載的 Chunk

  • 提取某個相似 jquery 或 react 的代碼庫「可是這個用得不多,使用用 dll 插件來打包會更好一些,一下篇介紹」

例1:chunks 的公共代碼,生成 page-comm

clipboard.png

例2:將 code split 的公共子 chunk 提取到父 chunk

clipboard.png

topic.js 使用了 code split

clipboard.png

例3:將 Code Split 切割出來的 Chunk,提取到一個新的異步加載的 Chunk
async 設置爲true,與例2同樣,不一樣的是例2提取到父 chunk,這樣會增長父 chunk 的文件大小,而例3提到一個新的 chunk 裏,這個 chunk 是異步加載的。

clipboard.png

多跑實例,理解各配置項產生的影響

相關文章
相關標籤/搜索