淺談webpack性能榨汁機(jī)(打包速度優(yōu)化)
最近對(duì)項(xiàng)目的本地開發(fā)環(huán)境進(jìn)行了打包速度優(yōu)化,原有項(xiàng)目,網(wǎng)上能搜到的優(yōu)化方案基本都加了,在16年低配mac pro 上打包時(shí)間為25秒多,但我發(fā)現(xiàn)細(xì)節(jié)做一些調(diào)整可能大大降低打包時(shí)間,最終優(yōu)化到7秒多
dll
原有項(xiàng)目是線上和本地公用一套dll配置,因?yàn)閍ntd這類ui庫需要按需加載所以不能放到dll中,這時(shí)可以單獨(dú)寫一個(gè)dll配置,將所有第三方庫添加到dll中。
這時(shí)因?yàn)?babelrc中添加了babel-plugin-import插件會(huì)導(dǎo)致優(yōu)化不生效,所以需要對(duì)開發(fā)環(huán)境單獨(dú)配置babel
options的babelrc設(shè)置為false,然后重寫一份babel配置,一定不要添加“import”插件
一個(gè)新問題,因?yàn)闆]有import插件,導(dǎo)致所有antd組件樣式丟失。這時(shí)我在index-template.html中加入一行注釋<!-- local-style -->,在本地打包時(shí)將其替換為antd相應(yīng)版本在cdn上的css文件
緩存
cache-loader專治花里胡哨!雖然你能在webpack的配置里找到n種緩存設(shè)置,但我發(fā)現(xiàn)cache-loader可以替代其它選項(xiàng),它會(huì)在你的項(xiàng)目中創(chuàng)建一個(gè) .cache-loader的文件夾,里面存放緩存文件,因?yàn)槭侵苯訉懭胗脖P,所以第一次打包的時(shí)候會(huì)多消耗幾秒
babel-loader & 多線程
上面的圖中可以看到我將babel-loader升級(jí)到8+,新的preset和plugin都有了命名上的變化。preset-env是用來替代以前201X的,通過targets可以指定目標(biāo)代碼(編譯后代碼)的版本,因?yàn)槭潜镜亻_發(fā),可以指定到chrome的高版本,這樣很多新語法都不需要轉(zhuǎn)換,可以節(jié)省一點(diǎn)時(shí)間(打包速度在10秒以下之后減一秒都是10%的提升?。。┎贿^這個(gè)方案要慎重使用,因?yàn)闀?huì)造成線上本地環(huán)境不統(tǒng)一,難保不出現(xiàn)什么神奇的bug
拔掉HappyPack提升性能
在測(cè)試的過程中我發(fā)現(xiàn)一個(gè)神奇的事情,就是HappyPack反倒會(huì)降低打包時(shí)間,我經(jīng)過反復(fù)測(cè)試,似乎babel-loader8+自帶了多線程優(yōu)化,所以HappyPack已經(jīng)沒用了(反而因?yàn)榫€程通信造成了資源浪費(fèi))。babel-loader8+的cpu使用率以及打包時(shí)間和babel-loader6+加HappyPack是相差不多的,但我在google上搜索時(shí)并沒有看到有人提及此事,官網(wǎng)也沒看到有個(gè)說明(管他那么多呢,能提升速度就行啦!)
后續(xù)計(jì)劃
這個(gè)項(xiàng)目是兩個(gè)人迭代一年份的代碼量,按照上面的配置大部分項(xiàng)目應(yīng)該都可以優(yōu)化到10秒左右的速度(看項(xiàng)目大小,20秒以下應(yīng)該都是正常的),還有一些小的優(yōu)化細(xì)節(jié)對(duì)性能影響不大所以忽略掉了。目前webpack還是3+版本,因?yàn)?的一些變化擔(dān)心影響過大,暫時(shí)沒升級(jí),升級(jí)之后應(yīng)該還會(huì)有一些小提速
這7秒還不是最終的速度,我估計(jì)5秒應(yīng)該沒啥問題,后面再想優(yōu)化就需要腦洞大開了
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解JavaScript中的鏈?zhǔn)秸{(diào)用
這篇文章主要介紹了JavaScript中的鏈?zhǔn)秸{(diào)用的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下2020-11-11javascript常用方法、屬性集合及NodeList 和 HTMLCollection 的瀏覽器差異
對(duì)于 HTMLCollection集合對(duì)象 必須要說一說的是 namedItem方法. 看看規(guī)范的解釋.2010-12-12js實(shí)現(xiàn)帶關(guān)閉按鈕始終顯示在網(wǎng)頁最底部工具條的方法
這篇文章主要介紹了js實(shí)現(xiàn)帶關(guān)閉按鈕始終顯示在網(wǎng)頁最底部工具條的方法,是非常實(shí)用的javascript固定效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03Javascript中類式繼承和原型式繼承的實(shí)現(xiàn)方法和區(qū)別之處
其它的面向?qū)ο蟪绦蛟O(shè)計(jì)語言都是通過關(guān)鍵字來解決繼承的問題。但是javascript中并沒有定義這種實(shí)現(xiàn)的機(jī)制。接下來通過本文給大家介紹Javascript中類式繼承和原型式繼承的實(shí)現(xiàn)方法和區(qū)別,需要的朋友可以參考下2017-04-04javascript 系統(tǒng)文件夾文件操作及參數(shù)介紹
javascript文件操作包括寫入文件、當(dāng)前目錄文件、讀文件、刪除文件、批量刪除,未刪除文件夾,刪除不了當(dāng)前目錄文件等等,感興趣的朋友可以參考下2013-01-01Javascript 獲取字符串字節(jié)數(shù)的多種方法
Javascript 字符串字節(jié)數(shù)獲取功能多種方法2009-06-06html中通過JS獲取JSON數(shù)據(jù)并加載的方法
本篇內(nèi)容主要給大家講了如何通過javascript解析JSON并得到數(shù)據(jù)后添加到HTML中的方法,需要的朋友參考下。2017-11-11