webpack實戰(zhàn)——打包優(yōu)化【下】

前言

這是webpack打包優(yōu)化【下】篇。前幾篇針對性能要求高的項目從加快打包速度晴圾、減小資源體積方面入手,提出了一些優(yōu)化政策墙牌,然后測試都可起到一定優(yōu)化效果。本篇描述死代碼的檢測與去除暗甥。

tree shaking

1 死代碼檢測去除

首先拋出問題,什么是死代碼捉捅?

工程中沒有被引用過的模塊撤防,這部分代碼將永遠無法被執(zhí)行,稱為“死代碼”棒口。

那知道了什么是死代碼寄月,如何檢測去除呢?

在前面我們介紹過无牵,ES6 module 依賴關系的構建是在代碼編譯時而非運行時漾肮。基于這項特性webpack提供了tree shaking功能茎毁。這個功能便可以在打包過程中幫助我們檢測沒有被引用的模塊克懊,然后對這部分代碼進行標記,并在資源壓縮時將它們從最終的bundle中去掉七蜘。

例:

// index.js
import { foo } from './util';
foo();
// util.js
export function foo() {
    console.log('this is foo');
}
export function bar() { // 沒有被任何其他模塊引用谭溉,因此屬于死代碼
    console.log('this is bar');
}

那么在webpack打包時就會對bar()添加一個標記,在正常本地開發(fā)環(huán)境下它依然會存在橡卤,但是在生產環(huán)境壓縮資源那一環(huán)節(jié)則會被移除掉扮念。

tree shaking有時可以使得bundle資源體積顯著減小,但需要一些前提條件碧库。

2 ES6 Module

tree shaking 只對ES6 Module生效柜与。 有時候我們發(fā)現(xiàn)算只引用了某個庫中的一個接口,卻把整個庫都加載了進來嵌灰,使得bundle體積并沒有什么變化弄匕,可能原因是該庫是用CommonJS導出的,而不是ES6 Module伞鲫。當然粘茄,為了更好地向下兼容,自然是使用CommonJS形式是庫依然很多秕脓。而排開第三方庫柒瓣,在我們自己書寫模塊或者庫時,可以盡可能的選擇ES6 Module形式導出吠架,這樣tree shaking的效率會更高芙贫。

3 使用webpack進行依賴關系構建

一般我們都會在工程中使用到babel-loader,如果我們有使用到傍药,那么一定要通過禁止它的模塊依賴解析磺平。原因是如果我們使用babel-loader來做依賴解析魂仍,那么webpack接收到的一般都是轉化過的CommonJS形式的模塊,那就無法對其進行tree shaking拣挪。

禁用babel-loader模塊依賴解析配置如下:

// webpack.config.js
module.exports = {
    ...
    module: {
        ryles: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: [
                    {
                        loader: 'babel-loader',
                        options: {
                            presets: [
                                // 在這里加上modules: false
                                [@babel/preset-env, { modules: false }]
                            ]
                        }
                    }
                ]
            }
        ]
    }
}

4. 使用壓縮工具去除死代碼

tree shaking本身只是為死代碼添加上標記擦酌,而真正意義上去除死代碼則是通過壓縮工具來進行的,而此工具之前介紹過:terser-webpack-plugin菠劝。在此不再贅述赊舶。

小結

通過【上】【中】【下】三篇描述,介紹的一些打包優(yōu)化的方案均可以對項目有不同程度的優(yōu)化赶诊,無論是打包速度還是減小資源體積笼平,都有涉及。然而我們更需要清楚地了解到每一種優(yōu)化策略都有其使用場景舔痪,并不是任何一個點放在一切項目中都有效寓调。

當然,我們更需要不斷培養(yǎng)自己的能力锄码,當發(fā)現(xiàn)性能問題時夺英,根據現(xiàn)有情況自己多加思考,分析出原因滋捶,然后對癥下藥秋麸。

下一篇介紹更多的JavaScript打包工具。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末炬太,一起剝皮案震驚了整個濱河市灸蟆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亲族,老刑警劉巖炒考,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霎迫,居然都是意外死亡斋枢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門知给,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓤帚,“玉大人,你說我怎么就攤上這事涩赢「甏危” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵筒扒,是天一觀的道長怯邪。 經常有香客問我,道長花墩,這世上最難降的妖魔是什么悬秉? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任澄步,我火速辦了婚禮,結果婚禮上和泌,老公的妹妹穿的比我還像新娘村缸。我一直安慰自己,他們只是感情好武氓,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布王凑。 她就那樣靜靜地躺著,像睡著了一般聋丝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上工碾,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天弱睦,我揣著相機與錄音,去河邊找鬼渊额。 笑死况木,一個胖子當著我的面吹牛,可吹牛的內容都是我干的旬迹。 我是一名探鬼主播火惊,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奔垦!你這毒婦竟也來了屹耐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤椿猎,失蹤者是張志新(化名)和其女友劉穎惶岭,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體犯眠,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡按灶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筐咧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸯旁。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖量蕊,靈堂內的尸體忽然破棺而出铺罢,到底是詐尸還是另有隱情,我是刑警寧澤残炮,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布畏铆,位于F島的核電站,受9級特大地震影響吉殃,放射性物質發(fā)生泄漏辞居。R本人自食惡果不足惜楷怒,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓦灶。 院中可真熱鬧鸠删,春花似錦、人聲如沸贼陶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碉怔。三九已至烘贴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撮胧,已是汗流浹背桨踪。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芹啥,地道東北人锻离。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像墓怀,于是被迫代替她去往敵國和親汽纠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345