webpack代碼分片的實現(xiàn)
背景
實現(xiàn)高性能應(yīng)用其中最重要的一點就是盡可能地讓用戶每次只加載必要的資源,優(yōu)先級不要太高的資源則采用延遲加載等技術(shù)漸進(jìn)式地獲取,這樣可以保證頁面的首屏速度。代碼分片是webpck打包工具所特有的一項技術(shù),通過這項功能可以把代碼按照特定的形式進(jìn)行拆分,使用戶不必一次全部加載,而是按需加載。
CommonsChunkPlugin
雖然這個插件在webpack4當(dāng)中已經(jīng)不推薦使用,但是我們還是要了解一下。這個插件可以將多個Chunk中的公共的部分提取出來。公共模塊提取可以為幾個項目帶來幾個收益:
- 開發(fā)過程中減少了重復(fù)模塊打包,可以提升開發(fā)速度;
- 減小整體資源體積;
- 合理分片后的代碼可以更有效的利用客戶端緩存。
該插件的默認(rèn)規(guī)則是只要一個模塊被兩個入口chunk所使用就會被提取出來,比如只要a和b用了react,react就會被提取出來。但是它仍有些不足之處:
- 一個CommonChunkPlugin只能提取一個vendor,假如我們想提取多個vendor,則需要配置多個插件,這回增加很多重復(fù)的配置代碼。
- 前面我們提到的mainfest實際上使瀏覽器多加載一個資源,這對于頁面渲染速度不是友好的。
- 由于內(nèi)部設(shè)計上的一些缺陷,CommonChunkPlugin在提取公共模塊的時候會破壞掉原有的chunk中模塊的依賴關(guān)系,導(dǎo)致難以進(jìn)行更多的優(yōu)化。
splitChunks
這是webpack新增的一個功能,改進(jìn)了CommonChunkPlugin而重新設(shè)計和實現(xiàn)的代碼分片特性,不僅比CommonChunkPlugin功能更加強(qiáng)大,還更簡單易用。代碼如下
module.exports = { entry: './foo.js', output: { filename: 'foo.js', publicPath: '/dist/' }, mode: 'development', optimization: { splitChunks: { chunks: 'all', } } } // foo.js import React from 'react'; import('./bar.js'); document.write('foo.js', React.version); // bar.js import react from 'react'; console.log('bar.js', React.version);
splitChunk默認(rèn)情形下的提取條件:
- 提取后的chunk可被共享或者來自node_modules目錄。這一條很容易理解,被多次引用或處于node_modules中的模塊更傾向于是通用模塊,比較適合被提取出來。
- 提取后的js chunk會有相應(yīng)的體積,比如大于30KB,Css Chunk體積假如大于50KB,這個也比較容易理解,如果提取后的資源體積太小,那么帶來的優(yōu)化效果也一般。
- 在按需加載的過程,并行請求的資源最大值小于等于5,按需加載指的是,通過動態(tài)插入script標(biāo)簽的方式加載腳本。我們一般不希望同時加載過多的資源,因為每一個請求都要花費建立鏈接和釋放鏈接的成本,因此提取的規(guī)則只在并行請求不多的時候生效。
- 在首次加載時,并行請求的資源數(shù)最大值小于等于3,和上一條類似,只不過在頁面首次加載時往往對性能要求更高,因此這里的默認(rèn)閥值也更低。
配置
splitChunk:{ chunks: 'async', minSize: { javascript: 30000, style: 50000, }, maxSize: 0, minChunks: 1, maxAsyncRequests: 5, maxInitialRequests: 3, automaticNameDelimiter: '~', name: true, cacheGroups:{ vendor: { test: /[\\/]node_modules[\\/]/, priority: -10, }, default: { minChunks: 2, priority: -20, reuseExistingChunk: true } } }
匹配模式
chunks的值有三個,async(默認(rèn))、initial、all。async只提取異步chunks,initial只對入口chunk生效,all兩種模式同時開啟(推薦使用)
匹配條件
minSize、minChunks、maxAsyncRequests、maxInitialRequests
命名
默認(rèn)為true,它意味著可以根據(jù)不能cacheGroups和作用范圍自動為新生成的chunk命名,并以automaticNameDelimiter分隔。
cacheGroup
可以理解為分離chunks時 的規(guī)則,默認(rèn)情況下兩種規(guī)則:vendors和default。vendors
用于提取所有node_modules中符合條件的模塊,default則作用于被多次引用的模塊??梢詫@些規(guī)則進(jìn)行增加或者修改,如果要禁用某種規(guī)則,也可以直接將其設(shè)置為false。當(dāng)一個模塊同時符合多個cacheGroups時,則更具其中的priority配置項確定優(yōu)先級。
異步加載資源
資源異步加載主要解決的問題是,當(dāng)模塊數(shù)量過多,資源體積過大時,可以把一些暫時使用不到的模塊延遲加載。這樣使頁面初次渲染的時候用戶下載的資源盡可能小,后續(xù)的模塊等到需要的時候在再去觸發(fā)加載,因此這種一般都叫做按需加載。
webpack中有兩種異步加載的方式,import(webapck2開始)和require.ensure(webapck1),import和es6 module的區(qū)別就是,不需要頂層加載,即用即加載。因為只是簡單的函數(shù)調(diào)用,這里不做其他闡述。
總結(jié)
代碼分片有幾種方式---CommonChunkPlugin或SplitChunks,以及異步資源加載。借助這些方法可以有效的縮小資源體積,同時更好的利用緩存,給用戶更友好的體驗。
到此這篇關(guān)于webpack代碼分片的實現(xiàn)的文章就介紹到這了,更多相關(guān)webpack代碼分片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序?qū)崿F(xiàn)紅包功能(后端PHP實現(xiàn)邏輯)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)紅包功能,以及后端PHP實現(xiàn)邏輯,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07基于JavaScript實現(xiàn)移動端TAB觸屏切換效果
我們使用移動端時可以通過觸屏手勢左右滑動來切換TAB欄目,如網(wǎng)易新聞等APP欄目切換。我們說的TAB一般由導(dǎo)航條和TAB對應(yīng)的內(nèi)容組成,切換導(dǎo)航條上的標(biāo)簽同時標(biāo)簽對應(yīng)的內(nèi)容也會跟著切換。本文將結(jié)合實例給大家介紹一個移動端TAB觸屏切換效果。2015-10-10JS中利用localStorage防止頁面動態(tài)添加數(shù)據(jù)刷新后數(shù)據(jù)丟失
本文給大家分享一段js代碼利用利用localStorage防止頁面動態(tài)添加數(shù)據(jù)刷新后數(shù)據(jù)丟失問題,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下2017-03-03javascript對talbe進(jìn)行動態(tài)添加、刪除、驗證實現(xiàn)代碼
javascript對talbe進(jìn)行動態(tài)添加、刪除、驗證實現(xiàn)代碼,需要的朋友可以參考下2012-03-03JavaScript動態(tài)創(chuàng)建form表單并提交的實現(xiàn)方法
這篇文章主要介紹了JavaScript動態(tài)創(chuàng)建form表單并提交的實現(xiàn)方法,涉及JavaScript動態(tài)創(chuàng)建頁面元素及模擬表單提交的技巧,需要的朋友可以參考下2015-12-12js與jquery獲取父級元素,子級元素,兄弟元素的實現(xiàn)方法
本篇文章主要是對js與jquery獲取父級元素,子級元素,兄弟元素的實現(xiàn)方法進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01javascript實現(xiàn)輸出指定行數(shù)正方形圖案的方法
這篇文章主要介紹了javascript實現(xiàn)輸出指定行數(shù)正方形圖案的方法,可實現(xiàn)javascript獲取用戶輸入及根據(jù)輸入?yún)?shù)打印圖形的功能,需要的朋友可以參考下2015-08-08JavaScript Title、alt提示(Tips)實現(xiàn)源碼解讀
我們知道給某些HTML標(biāo)簽加上title屬性后,這個標(biāo)簽對象在瀏覽的時候,鼠標(biāo)移上去就會有一個小提示框出來,并顯示title定義的內(nèi)容。2010-12-12用javascript為頁面添加天氣顯示實現(xiàn)思路及代碼
為頁面添加天氣顯示的方法有很多,在本文為大家介紹下使用js來輕松實現(xiàn),具體的代碼如下,感興趣的朋友不要錯過2013-12-12