webpack--關於CommonsChunkPlugin拆分模塊的應用

官網介紹:http://www.css88.com/doc/webpack2/plugins/commons-chunk-plugin/

生成的js文件見:https://github.com/ChpShy/single-play-demo/tree/master/CommonsChunkPlugin

關於minChunks的介紹:

https://segmentfault.com/q/1010000008726439/revision

https://segmentfault.com/q/1010000009070061/a-1020000009073036

一、介紹

CommonsChunkPlugin 插件,是一個可選的用於建立一個獨立文件(又稱作 chunk)的功能,這個文件包括多個入口 chunk 的公共模塊。通過將公共模塊拆出來,最終合成的文件能夠在最開始的時候加載一次,便存起來到緩存中供後續使用。這個帶來速度上的提升,因爲瀏覽器會迅速將公共的代碼從緩存中取出來,而不是每次訪問一個新頁面時,再去加載一個更大的文件。

以上是官網的介紹,其實CommonsChunkPlugin又什麼好處呢,簡單來說,webpack編譯,如果文件內容有改動,生成的編譯文件的hash值是會變的,即生成的文件名就不一樣了(前提是將hash放入了文件名當中),那麼瀏覽器就會重新請求該資源。不使用CommonsChunkPlugin拆分模塊,會把項目中的依賴打進app.js當中,如jqury.js等,會導致如果只是改了項目中的一個小地方,瀏覽器就得把所有內容都重新加載一遍,是很耗資源的,而如果我們把jquery拆分到一個獨立的js(vendor.js)中,那麼只要這個js中的內容不變,瀏覽器就不會重新請求,是不是很棒棒、、、

二、參數解釋

1. name: 提取出來的公共chunk的名字

2. filename: 生成公共文件的文件名,如果不配置,默認的output裏面的filename

3. minChunks:  number|Infinity|function(module, count) -> boolean,三種選擇,

number:代表模塊至少被調用定義的次數纔會被放到公共模塊當中;(默認爲chunks的數量)

Infinity: 生成的公共文件只包含webpack運行代碼,不會包含其他的模塊

function:設置特定的模塊,webpack會遍歷工程的所有模塊調用改函數,並作爲module入參傳入,

只要匹配(return true),該模塊就會被編譯進該公共js中

4. chunks:用於從公共模塊當中再進行抽取。如vue工程配置由app.js,vendor.js,manifest.js,

最後的manifest.js就是將vendor裏面的webpack運行代碼和動態生成script節點的代碼提取了出來。

三、場景及總結

1. 不使用CommonsChunkPlugin生成的js文件(289K):


這個沒什麼總結的,jquery編譯在了app.js。

2. 在entry定義chunk:


如果不定義filename,生成的名字由output裏面的filename決定。

生成的js(忽略中間的圖片):


可以看出,app裏面只有21K了,vendor裏面272K

3. 在CommonsChunkPlugin定義chunk,並且只分離jquery:



編譯結果,和2相同:


4. CommonsChunkPlugin定義chunk,並且選中node_modules目錄:


編譯結果:


app.js小了,vendor.js大了,是因爲把除了jquery之外,把css和style的方法也放進了vendor.js



總結:以上並沒有做公共模塊的二次提取,會導致如果app.js的hash變了,vendor裏面有一段生成script插入到html當中的代碼也會改變,從而vendor改變,所以應該生成3個文件,app.js: 工程代碼。vendor.js,依賴的模塊代碼。manifest.js,webpack運行代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章