Webpack性能優(yōu)化

減少Webpack打包時(shí)間

1.優(yōu)化Loader

對于Loader裆站,影響打包效率的是它的屬性Babel.Babel會(huì)將代碼轉(zhuǎn)為字符串 生成AST腌紧,然后對AST繼續(xù)進(jìn)行轉(zhuǎn)變最后生成新的代碼蝇裤,項(xiàng)目越大徒探,轉(zhuǎn)換代碼越多腊凶,效率就越低编矾。

優(yōu)化Loader的文件搜索范圍
module.exports = {
        module:{
            rules:[
              {
                //js文件才使用babel
                test:/\.js$/,
                loader:'babel-loader',
                //只在src文件夾下查找
                include:[resolve('src')],
                //不會(huì)去查找的路徑
                exclude:/node_modules/
              }
            ]
        }
    }
把Babel編譯過的文件緩存起來

下次只需要編譯更改過的代碼文件即可

loader: 'babel-loader?cacheDirectory=ture'
HappyPack

因?yàn)镹ode是單線程運(yùn)行的箱熬,所以Webpack在打包的過程中也是單線程的类垦,特別是在執(zhí)行Loader的時(shí)候,這樣會(huì)導(dǎo)致等待的情況
HappyPack可以將Loader的同步執(zhí)行轉(zhuǎn)換為并行的

module:{
        loader:[
           {
                //js文件才使用babel
                test:/\.js$/,
                //只在src文件夾下查找
                include:[resolve('src')]城须,
                exclude:/node_modules/,
                //id后面的內(nèi)容對應(yīng)下面
                loader:'happypack/loader?id=happypack'
           }
        ]
    },
    plugins:[
      new HappyPack({
        id:'happypack',
        loaders:['babel-loader?cacheDirectory'],
        //開啟4個(gè)線程
        threads:4
      })
    ]
DllPlugin

DllPlugin可以將特定的類庫提前打包然后引入蚤认。這種方式可以極大的減少打包類庫的次數(shù),只有當(dāng)類庫更新版本才有需要重新打包糕伐,并且也實(shí)現(xiàn)了將公共代碼抽離成單獨(dú)文件的優(yōu)化方案

//單獨(dú)配置在一個(gè)文件里
    //webpack.dll.conf.js
    const path = require('path')
    const webpack = require('webpack')
    module.exports = {
        entry:{
            //想統(tǒng)一打包的庫
            vendor:['react']
        },
        output:{
            path:path.join(__dirname,'dist'),
            filename:'[name].dll.js',
            library:'[name]-[hash]'
        },
        plugins:[
          new webpack.DllPlugin({
            //name必須和output.library一致
            name:'[name]-[hash]',
            //該屬性需要與DllReferencePlugin中一致
            context:__dirname,
            path:path.join(__dirname,'dist','[name]-mainfest.json')
          })
        ]
    }

然后需要執(zhí)行這個(gè)配置文件生成依賴文件砰琢,接下來需要使用DllReferencePluhin將依賴文件引入項(xiàng)目中

 //webpack.conf.js
   module.exports={
    //...省略其他配置
    plugins: [
      new webpack.DllReferencePlugin({
        context: __dirname,
        mainfest:require('./dist/vendor-mainfest.json')
      })
    ]
   }

減少Webpack打包后的文件體積

按需加載

如果我們把十幾個(gè)頁面甚至更多的路由頁面,把這些頁面全部打包進(jìn)一個(gè)JS文件的話良瞧,雖然將多個(gè)請求合并了陪汽,但是同樣也加載了很多并不需要的代碼,耗費(fèi)了更長的時(shí)間褥蚯。那么為了首頁能更快地呈現(xiàn)給客戶挚冤,這時(shí)候我們就可以使用按需加載,將每個(gè)路由頁面單獨(dú)打包為一個(gè)文件赞庶,當(dāng)然不僅路由可以按需加載训挡,對于loadash這種大型類庫可以使用這個(gè)功能。

當(dāng)使用的時(shí)候再去下載對應(yīng)文件歧强,返回一個(gè)Promise當(dāng)Promise成功以后去執(zhí)行回調(diào)
Scope Hoisting

Scope Hoisting會(huì)分析出模塊之間的依賴關(guān)系澜薄,盡可能的把打包出來的模塊合并到一個(gè)函數(shù)中去。

比如我們希望打包兩個(gè)模塊
   //test.js
   export const a=1
   //index.js
   import {a} from './test.js'
   對于這種情況摊册,我們打包出來的代碼類似這樣
   [
     function (module,exports,require){
        //...
     },
     function(module,exports,require){
        //...
     }

   ]
   但是如果我們使用Scope Hoisting的話表悬,代碼就會(huì)盡可能的合并到一個(gè)函數(shù)去,也就變成了這樣的類似代碼
   [
     function(module,exports,require){
        //...
     }
   ]
   這樣的打包方式生成的代碼明顯比之前的少了多了丧靡。如果在webpack4中希望開啟這個(gè)功能蟆沫,只需要啟用
   optimization.concatenateModules就可以了
   module,exports={
    optimization:{
        concatenateModules:true
    }
   }
Tree Shaking

Tree Shaking 可以實(shí)現(xiàn)刪除項(xiàng)目中未被引用的代碼

 //test.js
   export const a = 1;
   export const b = 2;
   //index.js
   import {a} from './test.js'

test文件中的變量b如果沒有在項(xiàng)目中使用到的話,就不會(huì)被打包到文件中温治。
webpack4的話饭庞,開啟生產(chǎn)環(huán)境就會(huì)自動(dòng)啟動(dòng)這個(gè)優(yōu)化功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熬荆,一起剝皮案震驚了整個(gè)濱河市舟山,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卤恳,老刑警劉巖累盗,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異突琳,居然都是意外死亡若债,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門拆融,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蠢琳,“玉大人,你說我怎么就攤上這事镜豹“列耄” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵趟脂,是天一觀的道長泰讽。 經(jīng)常有香客問我,道長昔期,這世上最難降的妖魔是什么已卸? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮镇眷,結(jié)果婚禮上咬最,老公的妹妹穿的比我還像新娘。我一直安慰自己欠动,他們只是感情好永乌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布擅憔。 她就那樣靜靜地躺著顿膨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梳码。 梳的紋絲不亂的頭發(fā)上人芽,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天望几,我揣著相機(jī)與錄音,去河邊找鬼萤厅。 笑死橄抹,一個(gè)胖子當(dāng)著我的面吹牛靴迫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楼誓,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼玉锌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疟羹?” 一聲冷哼從身側(cè)響起主守,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎榄融,沒想到半個(gè)月后参淫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愧杯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年涎才,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片民效。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡憔维,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畏邢,到底是詐尸還是另有隱情业扒,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布舒萎,位于F島的核電站程储,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏臂寝。R本人自食惡果不足惜章鲤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咆贬。 院中可真熱鬧败徊,春花似錦、人聲如沸掏缎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眷蜈。三九已至沪哺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酌儒,已是汗流浹背辜妓。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人籍滴。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓酪夷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親异逐。 傳聞我的和親對象是個(gè)殘疾皇子捶索,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

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

  • 寫在前面的話 閱讀本文之前,先看下面這個(gè)webpack的配置文件灰瞻,如果每一項(xiàng)你都懂,那本文能帶給你的收獲也許就比較...
    不忘初心_9a16閱讀 3,234評論 0 17
  • GitChat技術(shù)雜談 前言 本文較長辅甥,為了節(jié)省你的閱讀時(shí)間酝润,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,691評論 7 110
  • 目錄第1章 webpack簡介 11.1 webpack是什么璃弄? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,734評論 0 1
  • 作者:小 boy (滬江前端開發(fā)工程師)本文原創(chuàng)夏块,轉(zhuǎn)載請注明作者及出處疏咐。原文地址:https://www.smas...
    iKcamp閱讀 2,758評論 0 18
  • 輕舟晨霧小屋靜, 綠肥紅瘦殘花落脐供, 鶯啼燕語叢林中浑塞, 幽谷逸林水自流。
    愛你的人是我865432閱讀 215評論 0 3