4-1 Tree Shaking 概念詳解

1. 簡介

tree shaking 是一個術語官帘,通常用于描述移除 JavaScript 上下文中的未引用代碼(dead-code)。它依賴于 ES2015 模塊系統(tǒng)中的靜態(tài)結構特性,例如 importexport务嫡。這個術語和概念實際上是興起于 ES2015 模塊打包工具 rollup士败。

新的 webpack 4 正式版本控汉,擴展了這個檢測能力,通過 package.json"sideEffects" 屬性作為標記钟病,向 compiler 提供提示萧恕,表明項目中的哪些文件是 "pure(純的 ES2015 模塊)",由此可以安全地刪除文件中未使用的部分肠阱。

2. 使用場景

我們看如下使用場景票唆,主模塊 index.js 中引用了一個輔助模塊 math.js 中的一個方法。

// index.js

import { add } from './math';

add(1, 2);
// math.js

export const add = (a, b) => {
    console.log(a + b);
};

export const minus = (a, b) => {
    console.log(a - b);
};

打包后如下:


image.png

image.png

可以看到辖所,雖然 minus 方法未被使用惰说,但是確被打包在最終的 index.js 文件中,增大了包體缘回。

3. 使用 tree-shaking 搖晃掉多余的代碼

現(xiàn)在我們嘗試利用 tree shaking 方法來搖晃掉未被使用的代碼吆视。
首先,我們要找出未被使用的模塊:

module.exports = {
  //...
  optimization: {
    usedExports: true
  }
};

打包后如下


image.png

image.png

可以看到此時輸出代碼中仍然有 minus 方法酥宴,但是該方法已經(jīng)被標記為未使用啦吧。那么如何在最終代碼中刪除掉該方法了,需要使用如下插件:

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
...
    plugins: [
        new UglifyJsPlugin(),
        new HtmlWebpackPlugin({
            template: "./src/index.html"
        }),
        new CleanWebpackPlugin()
    ],

打包后如下:


image.png

image.png

可以看到 minus 方法被抖掉了拙寡。

3. 將文件標記為無副作用

在一個純粹的 ESM 模塊世界中授滓,識別出哪些文件有副作用很簡單。然而,我們的項目無法達到這種純度般堆,所以在孝,此時有必要向 webpack 的 compiler 提供提示哪些代碼是“純粹部分”。

這種方式是通過 package.json 的 "sideEffects" 屬性來實現(xiàn)的淮摔。

{
  "sideEffects": false
}

如同上面提到的私沮,如果所有代碼都不包含副作用,我們就可以簡單地將該屬性標記為 false和橙,來告知 webpack仔燕,它可以安全地刪除未用到的 export 導出。
「副作用」的定義是魔招,在導入時會執(zhí)行特殊行為的代碼晰搀,而不是僅僅暴露一個 export 或多個 export。舉例說明办斑,例如 polyfill外恕,它影響全局作用域,并且通常不提供 export俄周。
注意吁讨,任何導入的文件都會受到 tree shaking 的影響。這意味著峦朗,如果在項目中使用類似 css-loader 并導入 CSS 文件建丧,則需要將其添加到 side effect 列表中,以免在生產(chǎn)模式中無意中將它刪除:

{
  "name": "your-project",
  "sideEffects": [
    "./src/some-side-effectful-file.js",
    "*.css"
  ]
}

4. 使用 production 模式

上述其實是描述如何在 development 模式下開啟 tree-shaking波势,但其實在 development 模式下翎朱,為了開發(fā)和調(diào)試方便,我們是不會開啟壓縮的尺铣,而 production 下拴曲,會自動為我們開啟 tree-shaking。去掉 usedExports 和 uglifyjs-webpack-plugin 相關配置凛忿,將 mode 修改為 production:

mode: 'production',

另外澈灼,注意文章開頭所說的,tree-shaking 依賴于 ES2015 模塊系統(tǒng)中的靜態(tài)結構特性店溢,例如 importexport叁熔。所以只有 es-module 才可以被 tree-shaking。

參考

webpack-tree-shaking
https://webpack.js.org/configuration/optimization/#optimizationusedexports
https://segmentfault.com/a/1190000016767989?utm_source=tag-newest

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末床牧,一起剝皮案震驚了整個濱河市荣回,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌戈咳,老刑警劉巖心软,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壕吹,死亡現(xiàn)場離奇詭異,居然都是意外死亡删铃,警方通過查閱死者的電腦和手機耳贬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泳姐,“玉大人效拭,你說我怎么就攤上這事暂吉∨置耄” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵慕的,是天一觀的道長阎肝。 經(jīng)常有香客問我,道長肮街,這世上最難降的妖魔是什么风题? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮嫉父,結果婚禮上沛硅,老公的妹妹穿的比我還像新娘。我一直安慰自己绕辖,他們只是感情好摇肌,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仪际,像睡著了一般围小。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上树碱,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天肯适,我揣著相機與錄音,去河邊找鬼成榜。 笑死框舔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的赎婚。 我是一名探鬼主播刘绣,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惑淳!你這毒婦竟也來了额港?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤歧焦,失蹤者是張志新(化名)和其女友劉穎移斩,沒想到半個月后肚医,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡向瓷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年肠套,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猖任。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡你稚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朱躺,到底是詐尸還是另有隱情刁赖,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布长搀,位于F島的核電站宇弛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏源请。R本人自食惡果不足惜枪芒,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谁尸。 院中可真熱鬧舅踪,春花似錦、人聲如沸良蛮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽背镇。三九已至咬展,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞒斩,已是汗流浹背破婆。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胸囱,地道東北人祷舀。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像烹笔,于是被迫代替她去往敵國和親裳扯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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

  • 簡介 幾個月前谤职,我的任務是將我們組的 React 構建配置升級到 Webpack 4饰豺。我們的主要目標之一是利用 t...
    1024譯站閱讀 1,239評論 0 2
  • 在本章節(jié)中通過一個引入 Ladash 特定模塊的實例來展示 Tree-shaking 在 Webpack 中的重要...
    Dabao123閱讀 1,819評論 0 1
  • 顧名思義,搖樹允蜈,如果把整個項目想象成一棵樹冤吨,那么實際用到的源碼就相當于樹上的綠色的活的樹葉蒿柳,而灰色的則表示無用的代...
    泡杯感冒靈閱讀 349評論 0 1
  • tree-shaking是一個在前端領域比較熟知的東西了。在沒有深入了解前漩蟆,一直以為他在項目中發(fā)揮了很大的作用垒探。但...
    strong9527閱讀 21,126評論 3 34
  • 在學校時我就開始過跑步,那時候為了考試怠李,每天早起去操場跑五圈圾叼,感覺自己已經(jīng)很棒,再后來在2010年工作...
    清水_4c12閱讀 329評論 0 0