Webpack 5(七)Tree Shaking

參考文檔

Tree Shaking 在打包的時(shí)候去除掉沒有用到的代碼祝钢。

想要實(shí)現(xiàn) Tree Shaking 的功能觅闽,必須保證各個(gè)模塊都采用 es6-module 語法來進(jìn)行導(dǎo)入和導(dǎo)出。

有些第三方庫不是采用 es6-module 語法來編寫模塊席揽,則該庫無法 Tree Shaking判呕。

如果使用 Babel 的話品嚣,這里有一個(gè)小問題,因?yàn)?Babel 的預(yù)案(preset)默認(rèn)會將任何模塊類型都轉(zhuǎn)譯成 CommonJS 類型求冷。修正這個(gè)問題也很簡單瘤运,不是在 .babelrc 文件中就是在 webpack.config.js 文件中設(shè)置 modules: false 就好了。

對于 import() 動態(tài)引入的模塊匠题,無法進(jìn)行 Tree Shaking拯坟。

配置

production 模式下,webpack 自動幫你配置好 optimization 選項(xiàng)韭山,你不用做任何配置就能夠 Tree Shaking郁季。非 production 模式下,需要手動配置 optimization 選項(xiàng)钱磅,才能夠 Tree Shaking梦裂。

相關(guān)配置選項(xiàng):

  • optimization.minimize
  • optimization.minimizer
  • optimization.usedExports
  • optimization.sideEffects

optimization.usedExports: true optimization.sideEffects: true 標(biāo)記未引用代碼(dead code)
optimization.minimize: true 刪除未引用代碼,并壓縮代碼
optimization.minimizer: [] 指定代碼壓縮引擎

optimization 配置選項(xiàng)

optimization.minimize

是否使用壓縮插件來壓縮生成的 bundle 代碼盖淡。

在 production 模式中 minimize 默認(rèn)為 true年柠。

module.exports = {
  optimization: {
    minimize: true
  }
}

optimization.minimizer

配置壓縮插件,只有 minimize 為 true 的時(shí)候褪迟,配置 minimizer 才有用冗恨。

如果不配置該選項(xiàng),則 webpack 4 默認(rèn)采用 terser-webpack-plugin 插件味赃,并且自動配置 terser-webpack-plugin 插件的 options 選項(xiàng)派近。安裝 webpack 4 的時(shí)候會自動安裝 terser-webpack-plugin,因此不需要 npm i -D terser-webpack-plugin洁桌。

如果想要自己配置 terser-webpack-plugin 插件的 options 選項(xiàng)渴丸,需要手動配置 optimization.minimizer 選項(xiàng)。

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin(options)
    ]
  }
}

還可以使用其他插件,例如使用 CssMinimizerPlugin 插件來壓縮 css 代碼

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin()谱轨,
      new CssMinimizerPlugin()
    ]
  }
}

通過 '...' 表明使用系統(tǒng)默認(rèn)的 TerserPlugin 插件以及默認(rèn)配置

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      '...'戒幔,
      new CssMinimizerPlugin()
    ]
  }
}

optimization.usedExports

webpack 在打包文件的過程中,為未使用的 export 代碼添加 /* unused harmony export */ 這樣的注釋土童。

在 production 模式中 usedExports 默認(rèn)為 true诗茎。

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

optimization.sideEffects

一個(gè) es6 模塊如果只是 export 一些變量以及函數(shù),則該模塊沒有副作用献汗。

如果一個(gè) es6 模塊除了 export 一些變量和函數(shù)敢订,還做了其他的操作,比如定義了全局變量罢吃,或者寫入日志等等楚午,例如 import '@babel/polyfill' 這個(gè)模塊,這個(gè)模塊并沒有 export 變量尿招,而是直接定義了全局變量矾柜,因此該模塊有副作用。

有副作用的模塊不能夠 tree shaking就谜,因?yàn)殡m然你的代碼里面沒有用到有副作用模塊 export 的變量怪蔑,但是也不能刪除,因?yàn)槟切┐a可能會定義全局變量或者其他副作用丧荐。你刪除了就不會定義全局變量或者其他副作用了缆瓣。

如果一個(gè)包里面所有 es 模塊都沒有副作用,那么可以在 package.jsonsideEffects: false 指定虹统,來告知 webpack 它可以安全地刪除未用到的 export弓坞。

{
  "name": "your-project",
  "sideEffects": false
}

如果你的代碼確實(shí)有一些副作用,可以改為提供一個(gè)數(shù)組:

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

optimization.sideEffects 字段表明 webpack 是否會關(guān)注各個(gè)庫中的 package.json 文件的 sideEffects 字段窟却。

在 production 模式中 sideEffects 默認(rèn)為 true。

module.exports = {
  optimization: {
    sideEffects: true
  }
}

實(shí)例

production 模式下

production 模式下呻逆,自動實(shí)現(xiàn) Tree Shaking

module.exports = {
  mode: 'production'
}

非 production 模式下

none 和 development 模式下夸赫,需要配置 optimization.minimize optimization.usedExports optimization.sideEffects,才能實(shí)現(xiàn) Tree Shaking

module.exports = {
  mode: 'none',
  optimization: {
    minimize: true,
    usedExports: true,
    sideEffects: true
  }
}

Tree Shaking 第三方庫

如果你想要對庫進(jìn)行 Tree Shaking咖城,首先要記住的注意點(diǎn)還是前面所說的:使用 ES6 模塊茬腿。然而許多庫并不一定使用 ES6 模塊,比如 lodash 就是這樣宜雀。因此我們需要安裝 lodash-es 來代替 lodash切平。

npm i lodash-es
import { join } from lodash-es
join(['hello', 'webpack'], ' ')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辐董,隨后出現(xiàn)的幾起案子悴品,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苔严,死亡現(xiàn)場離奇詭異定枷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)届氢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門欠窒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人退子,你說我怎么就攤上這事岖妄。” “怎么了寂祥?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵荐虐,是天一觀的道長。 經(jīng)常有香客問我壤靶,道長缚俏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任贮乳,我火速辦了婚禮忧换,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘向拆。我一直安慰自己亚茬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布浓恳。 她就那樣靜靜地躺著刹缝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颈将。 梳的紋絲不亂的頭發(fā)上梢夯,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音晴圾,去河邊找鬼颂砸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛死姚,可吹牛的內(nèi)容都是我干的人乓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼都毒,長吁一口氣:“原來是場噩夢啊……” “哼色罚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起账劲,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤戳护,失蹤者是張志新(化名)和其女友劉穎金抡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姑尺,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竟终,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了切蟋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片统捶。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柄粹,靈堂內(nèi)的尸體忽然破棺而出喘鸟,到底是詐尸還是另有隱情,我是刑警寧澤驻右,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布什黑,位于F島的核電站,受9級特大地震影響堪夭,放射性物質(zhì)發(fā)生泄漏愕把。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一森爽、第九天 我趴在偏房一處隱蔽的房頂上張望恨豁。 院中可真熱鬧,春花似錦爬迟、人聲如沸橘蜜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽计福。三九已至,卻和暖如春徽职,著一層夾襖步出監(jiān)牢的瞬間象颖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工姆钉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留说订,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓育韩,卻偏偏與公主長得像克蚂,于是被迫代替她去往敵國和親闺鲸。 傳聞我的和親對象是個(gè)殘疾皇子筋讨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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