精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

原來項目打包也有這么技巧 - 淺談 Tree Shaking 機制

開發 前端
今天介紹了 Tree Shaking 的相關基本觀念,雖然說身為一位前端工程師不一定要懂這個概念,畢竟現在很多主流的框架都已經先把 bundler 的相關 ??config?? 都寫好了,但了解這些工具背后在做的事情也能幫助到自己在開發時可以稍微省思一下要如何改良自己的代碼,進而提升整體的打包后的性能。

前言

身為一位前端工程師或多或少都有聽過 Webpack 這套前端打包工具吧,為了讓最終打包的檔案不會過于龐大,Webpack 可是下了非常多的苦功,例如:利用 Code Splitting 產出一個又一個的 chunk 讓網頁不會一次載入一份很大 JS包。

然而今天的文章其實不是要講 Code Splitting,而是要講一個比較深入的原理:Tree Shaking。

什么是 Tree Shaking?

什么是 Tree Shaking?Tree Shaking 就字面上翻譯來看就是搖晃樹木,在 Webpack 的世界中我們通常都會設定一個 Entry Points 來告訴 webpack 要從哪個文件開始往其他文件進行打包,如果用 Tree 的概念來看就是一個主干配上很多的樹枝。

圖片

Dynamic Language & Static Language

接下來講個跟 Tree Shaking 比較無關的小知識,但這個小觀念可以幫助我們了解為何要在 JavaScript 上執行 Tree Shaking 并不是我們想像中的那麼容易。

接下來講個跟 Tree Shaking 比較無關的小知識,但這個小觀念可以幫助我們了解為何要在 JavaScript 上執行 Tree Shaking 并在程式語言中有分為 動態語言(Dynamic Language) 以及 靜態語言(Static Language),被歸類在 Dynamic Language 中比較常見的有 JavaScript、PHP、Python 等語不是我們想像中的那么容易。

在編程語言中有分為 動態語言(Dynamic Language) 以及 **靜態語言(Static Language)**,被歸類在 Dynamic Language 中比較常見的有 JavaScript、PHP、Python 等語言,至于被歸類在 Static Language 比較常見的有 C++、Java 等語言。

在 Dynamic Language 中由于我們可以動態的載入非常多東西,例如 function、object 等,對于 Tree Shaking 來說這種會動態載入的東西實在是太難捉摸了,這也讓 Dynamic Language 的 Tree Shaking 很難達到最完美。

Dead Code Elimination

在開始講 Tree Shaking 原理之前必須要了解一個技術:死碼刪除(Dea誒 Code Elimination)。

在 ??compiler?? 的領域中,為了達到執行時間的優化,在代碼編譯的過程中 compiler 會將對于最終結果沒有影響到的代碼刪除,進而達到執行時間的優化,這段過程稱之為 Dead Code Elimination

乍看之下 Dead Code Elimination 在做的事情好像就是 Tree Shaking 要做到的事情,就是要刪除無用的代碼,但兩者其實還是有著些微的差距,接下來就要講講 Tree Shaking 的原理。

Tree Shaking 原理

Tree Shaking 其實是 Dead Code Elimination 的一種新的實現原理,在上面的 Dynamic Language 的觀念中提到 Dynamic Language 的特性就是可以動態載入任何東西,因為這個特性讓 Dead Code Elimination 相當難實現,因為 complier 永遠不知道到底哪些程代碼是對最終結果不會有影響的。

所以 Tree Shaking 其實要做到的不會像 Dead Code Elimination 那樣死板板的要刪除對結果不會有影響的程式碼,而是要保留會需要用到的代碼,這樣也可以達到類似 Dead Code Elimination 的效果,只是兩者的原理還是有一些差異,而這就是 Tree Shaking 的原理。

ES6 module v.s commonJS

上面提到 Tree Shaking 的原理最主要的目的就是要保留會需要用到的代碼,而這點在早期的 JavaScript 其實是無法實現的,但是在 ES6 誕生后有一個非常重要的概念叫:ES6 modules

由于 ES6 modules 的誕生,我們可以在每個文件的最上方先引用即將會需要用到的東西,所以這些 bunbler 就可以藉由這些?? import file?? 很快速的知道可以保留哪些文件,進而達到 Tree Shaking 的效果。

這時候讀者可能會有另一個問題了,在 ES6 module 還沒誕生以前我們也可以利用 commonJS 來進行 module 的導入,為什麼 ES6 module 可以做到 Tree Shaking 可是 commonJS 無法呢?

其實是因為 ES6 module 有著非常多的特性,讓 bundler 可以針對這些特性來進行靜態的分析:

  • module 必須要在頂層被 import。
  • module 內部會自動被定義為 strict mode。
  • module name 不能動態改變。
  • module 內容為 immutable 無法在其他文件中被動態新增或刪除內容。

因為這些強限制在,所以 ES6 module 就可以讓 bundler 做到 Tree Shaking 的效果,而 commonJS 則無法達到此點。

改善 import 與 export 方式

我們都知道 ES6 modules 的 export 方式有分 ??named export??? 以及?? default export??,這兩種方法適用于不同的使用場景,也會對 Tree Shaking 后的文件內容有著非常大的差別。

default export

圖片圖片

named export

圖片

乍看之下 ??default export??? 跟?? named export?? 在寫法上好像沒什麼太大的差別(除了直接在項目前面加上 export 的寫法比較不一樣外),最終都是需要用一個物件來包裝輸出,但兩者在 Tree Shaking 后的結果可是有著蠻大的差別,接下來就看來一下 Tree Shaking 過后的結果吧!

default export 經由 Tree Shaking 后的結果:

圖片

named export 經由 Tree Shaking 后的結果:

圖片

可以看到上面兩張圖,雖然 Tree Shaking 都有把 multiply 這個 function 移除了,可是 ??default export??? 相較于 ??named export??? 還是新增了不少變量來處理 ??function parameter??,這樣就不是一個完美的性能優化。

所以假如讀者在開發時確定一個文件會需要同時輸出很多項目,不管是對象也好函數也罷,這時候都建議用 ??named export?? 的方式進行輸出這樣才能達到最好的性能優化。

改善第三方組件的 import 方式

最后再來看一下 import 第三方組件的最佳方式,在前端開發的過程中為了不要重復照輪子很多時候都會使用大神所開發好的第三方組件來加速開發,但第三方組件的 ??import?? 方式其實也會影響到最終的 bundle size

接下將以 ant design 這套 UI library 來進行說明。

圖片圖片

首先是利用官方文檔的說明來進行 import,其實 antd 本身就有針對其 module 進行 Tree Shaking 的性能優化,所以我們原則上是可以放心的使用官方文檔的教學進行 ??import??? 的,接下來我們利用 ??webpack-bundle-analyzer?? 來進行檔案分析。

圖片

可以發現 antd 的文件大小高達 ??842.15KB???,而且裡面還跑出了許多跟 Button 無關的 component 文件,這顯然是一個不好的 ??import??? 方式,沒想到照著官文檔的方式進行 ??import?? 也沒辦法達到最好的性能優化。

但這其實也不是 antd 的錯, antd 本身就有做好 Tree Shaking 的動作,詳細的說明可以參考 antd 的官方文件,但是這邊的事例故意沒有在項目的 bundler 設定檔中開啟 Tree Shaking 的功能,進而導致 antd 的 Tree Shaking 失效。

雖然 bundler 沒有開啟 Tree Shaking 功能讓整體的 bundle size 過大,但我們其實也可以自己手動做這件事,這時候只要我們改成從 antd 的 es folder 進行元件的單獨 ??import?? 就可以讓最終的 bundle size 差非常多,寫法如下。

圖片

接著我們一樣使用 webpack-bundle-analyzer 來進行項目分析。

圖片

可以發現整個 antd 的文件大小少了非常多,只剩下 ??74.8KB??? 而且與 Button 無關的其他 component 都沒出現了,所以同一種第三方組件不同的 import 方式真的會讓整體的性能差距非常大,這個就是比較好的第三方組件 ??import?? 方式。

package.json 中的 sideEffects

在 Webpack 的 Tree Shaking 配置中,有一個可以在 ??package.json??? 中配置的叫 ??sideEffects???,這個 ??sideEffects?? 的配置主要是讓 Webpack 這種 bundler 知道此項目是否可以做 Tree Shaking 的動作。

假如設定為 ??false??? 就代表可以將所有的文件進行 Tree Shaking,若讀者知道有哪些檔案是不能做 Tree Shaking 的,這時候只要在 ??sideEffects?? 內用一個數組將不能做 Tree Shaking 的文件路徑寫上去,這時候 bundler 就只會針對這個數組以外的文件進行 Tree Shaking。

圖片圖片

Webpack 中的 usedExports

在 Webpack 的官方文件中要達到 Tree Shaking 的效果除了在 ??package.json??? 中加上 ??sideEffects??? 外,還可以使用 ??usedExports??。

在官方文件中有這麼一段說明:

圖片

如果說 sideEffects 在做的事情是把不能做 Tree Shaking 的樹枝移除,那 ??usedExports?? 在做的事情就是把樹枝上沒有用到的樹葉移除,所以 usedExports 其實才是在做真正的 Tree Shaking。

useExports 利用 terser 這套工具進行項目的 side effects 偵測,假如打包過程中發現此弎既沒有 side effects 且某些代碼又沒有被引用到,則該代碼就會在之后的 ??uglify?? 被移除,藉此達到真正的 Tree Shaking 效果。

而 usedExports 的設定方式也非常簡單,只要在 Webpack 的配置文件中,在 ??optimization??? 內加上?? usedExports: true?? 這時候就可以將 usedExports 的功能打開,寫法如下:

圖片

小結

今天介紹了 Tree Shaking 的相關基本觀念,雖然說身為一位前端工程師不一定要懂這個概念,畢竟現在很多主流的框架都已經先把 bundler 的相關 ??config?? 都寫好了,但了解這些工具背后在做的事情也能幫助到自己在開發時可以稍微省思一下要如何改良自己的代碼,進而提升整體的打包后的性能。

像是上面提到的 import 與 export 方式,引用第三方組件時可以如何引用達到最小的 bundle
size,有了這些概念在開發時就可以提升整體的性能 ,所以筆者也建議目前正在學習網頁開發的讀者都可以稍微了解一下 Tree Shaking 的概念喔。

責任編輯:姜華 來源: 大遷世界
相關推薦

2022-02-10 14:23:16

WebpackJavaScript

2018-06-26 15:00:24

Docker安全風險

2021-01-14 05:08:44

編譯鏈接

2023-07-26 00:32:33

注解抽象spring

2024-03-11 10:15:29

2020-06-01 08:04:18

三目運算符代碼

2017-07-04 14:01:40

機房機柜

2024-05-13 16:22:25

固態硬盤接口硬盤

2017-07-12 08:20:32

閃存用途企業

2024-08-28 08:56:24

2021-06-28 07:01:50

Webpack 前端Tree shakin

2025-07-23 10:13:57

2025-01-13 00:00:00

2021-04-19 05:42:51

Mmap文件系統

2024-01-31 12:34:16

panic錯誤檢測recover

2018-01-31 16:12:47

筆記本輕薄本游戲本

2023-10-30 08:16:33

數據庫插件Mybatis

2021-08-26 10:30:29

WebpackTree-Shakin前端

2023-11-01 14:49:07

2018-12-11 12:58:20

CPU散熱器鰭片
點贊
收藏

51CTO技術棧公眾號

日本大香伊一区二区三区| 久久人人九九| 能看毛片的网站| 五月婷婷开心网| 色8久久久久| 一本色道88久久加勒比精品| 欧美二区三区的天堂| 蜜桃麻豆www久久国产精品| 激情五月少妇a| 四虎地址8848精品| 午夜精彩视频在线观看不卡| 99视频在线播放| 欧美第一页在线观看| 欧美成人福利| 中文字幕第一页久久| 欧美中文在线观看国产| 女同性恋一区二区三区| brazzers在线观看| 亚洲澳门在线| 4438成人网| 色综合666| 欧美一级做a爰片免费视频| 久久不卡国产精品一区二区| 天天做天天摸天天爽国产一区| 国产高清自拍一区| 日韩黄色三级视频| 精品亚洲自拍| 一本一道久久a久久精品综合蜜臀| 免费观看国产成人| 午夜美女福利视频| 亚洲成人原创| 亚洲情综合五月天| 天天操天天干天天做| 国产福利视频在线观看| 国产一区二区三区四区五区入口| 久久高清视频免费| www男人天堂| 在线女人免费视频| 国产精品美日韩| 亚洲一区制服诱惑| 国产福利拍拍拍| 杨幂一区二区三区免费看视频| 在线一区二区三区四区五区 | 老司机成人在线| 日韩欧美成人一区二区| 黄色一级片在线看| 欧洲亚洲精品视频| 久久av中文字幕片| 久久免费成人精品视频| 国产一区二区三区四区五区六区| 99久久精品一区二区成人| 亚洲视频精选在线| 国产一区视频观看| 中文永久免费观看| 在线播放精品| 国模极品一区二区三区| 国产无套在线观看| 凹凸成人精品亚洲精品密奴| 91精品国产综合久久小美女| 欧美美女性视频| 亚洲毛片在线免费| 羞羞视频在线观看欧美| 在线日韩第一页| 337p日本欧洲亚洲大胆张筱雨| 中文字幕人成乱码在线观看| 欧美色道久久88综合亚洲精品| 在线精品日韩| 欧美少妇另类| 成人污污视频在线观看| 国产精品流白浆视频| 久久精品视频久久| 99在线精品免费视频九九视| 欧美最猛性xxxx| 亚洲精品毛片一区二区三区| 亚洲第一在线| 日本人成精品视频在线| 免费一级片在线观看| 亚洲私拍自拍| 久久久久999| 99久久人妻无码精品系列| 香港久久久电影| 欧美日精品一区视频| 人妻久久久一区二区三区| 免费大片在线观看www| 久久伊人中文字幕| 粉嫩av四季av绯色av第一区| 色一情一乱一乱一区91av| 狠狠色狠狠色合久久伊人| 国产激情久久久| 日韩成人免费在线视频| 日韩中文字幕1| 欧美一级视频一区二区| 麻豆国产尤物av尤物在线观看 | 欧美成人激情在线| 欧美bbbbbbbbbbbb精品| 免费成人av在线| 日产精品99久久久久久| 一级黄在线观看| 日日摸夜夜添夜夜添国产精品| 国产精品视频自拍| 香蕉污视频在线观看| 久久99精品国产91久久来源| 国产在线精品一区二区三区| 91caoporm在线视频| 久久一留热品黄| 日本美女爱爱视频| av片在线观看网站| 亚洲色图在线看| 久久久999视频| 密臀av在线播放| 亚洲国产一区视频| 久久国产午夜精品理论片最新版本| 岛国中文字幕在线| 欧美午夜片欧美片在线观看| 国产又粗又猛大又黄又爽| 亚洲青青一区| 亚洲欧美日韩国产精品| 一区二区黄色片| 国产一区二区三区四区老人| 国产精品入口尤物| 日韩欧美在线观看一区二区| 悠悠色在线精品| 中国丰满熟妇xxxx性| 成人国产精选| 亚洲欧美日韩国产成人| 国产成人精品片| 韩国一区二区视频| 亚洲高清123| 大片免费在线观看| 欧美色成人综合| av黄色免费网站| 国产欧美不卡| 国产精品久久久久久久av电影| 亚洲天堂中文在线| 国模无码大尺度一区二区三区| 青青成人在线| 国产丝袜在线| 亚洲国产成人精品视频| 国产av无码专区亚洲精品| 主播大秀视频在线观看一区二区| 欧美午夜影院一区| 免费国偷自产拍精品视频| 色天天综合网| 国内精品久久久| 不卡的日韩av| 亚洲激情中文1区| 久久久久久久高清| 久久97精品| 97在线视频免费播放| www日韩在线| 亚洲高清毛片| 国产麻豆乱码精品一区二区三区| 成人亚洲综合天堂| 亚洲另类一区二区| 能在线观看的av| 无码日韩精品一区二区免费| 久久伊人精品一区二区三区| www.国产com| 狠狠色2019综合网| 欧美性受黑人性爽| 在线看片国产福利你懂的| 亚洲国产一区自拍| 中文字幕91视频| 一本色道久久综合| 久久综合一区| 另类中文字幕国产精品| 久久精品国产综合| www.久久综合| 精品久久久久久久久久久久久久| 亚洲午夜久久久久久久久红桃| 欧美aⅴ99久久黑人专区| 国产91免费观看| 大胆av不用播放器在线播放| 欧美日韩成人高清| 中文字幕国产专区| 看电视剧不卡顿的网站| 欧美日韩精品一区| av在线理伦电影| 亚洲乱码av中文一区二区| 亚洲天堂777| 亚洲国产人成综合网站| av网站免费在线看| 国产乱码一区二区三区| 相泽南亚洲一区二区在线播放 | av永久免费观看| 日韩亚洲精品在线| 日本一区二区三区免费观看| 国产精品毛片无码| 少妇高潮久久77777| 欧美一区免费看| 91亚洲国产成人精品一区二区三| 精品一区二区三区无码视频| 国产精品久久久久久久久久辛辛| 久久久久中文字幕2018| www.亚洲.com| 精品国产成人在线影院| 精品99久久久久成人网站免费| 91色九色蝌蚪| 日本r级电影在线观看| 香蕉国产精品偷在线观看不卡| 国产精品99久久久久久大便| 欧美aaa级| 7777精品视频| 国产在线看片| 国产亚洲精品日韩| 中文资源在线播放| 天天综合色天天综合色h| 蜜臀av午夜精品久久| 久久嫩草精品久久久久| aaa黄色大片| 国内精品伊人久久久久av一坑| 欧美成人xxxxx| 欧美激情五月| 成人精品一二区| av在线不卡精品| 欧美性做爰毛片| 密臀av在线| 亚洲精品电影网站| 国产精品视频一二区| 亚洲男人的天堂在线观看| 久久只有这里有精品| 成人久久18免费网站麻豆 | 国产suv精品一区| 国内成人精品一区| 毛片在线看网站| 一区二区三区国产在线观看| 色资源在线观看| 亚洲成人免费网站| 国内自拍视频在线播放| 久久久国产综合精品女国产盗摄| www.99在线| 91精品秘密在线观看| 欧美日韩综合网| 自拍偷拍精品| 欧美二区三区在线| 网友自拍一区| 欧美日韩国产精品一卡| 伊人久久大香线蕉综合网蜜芽| 精品不卡在线| 成人在线黄色| 国产精品v片在线观看不卡| 精精国产xxxx视频在线播放| 有码中文亚洲精品| 毛片免费在线| 亚洲视频综合网| 国产福利在线看| 日韩三区在线观看| 韩国av中文字幕| 午夜精品免费在线| 日韩成年人视频| 欧美三级免费观看| 黄色av网站免费观看| 欧美性生活大片免费观看网址| 亚洲免费在线观看av| 欧美色播在线播放| 免费在线不卡av| 欧美军同video69gay| 国产麻豆免费观看| 日韩欧美在线免费| 日日夜夜狠狠操| 欧美色手机在线观看| 一级黄色免费片| 91精品啪在线观看国产60岁| jizz中国少妇| 欧美日韩在线三级| 一卡二卡三卡在线| 91精品国产福利| 久久精品视频2| 欧美日韩一二三区| 精品久久国产视频| 日韩成人中文字幕| 亚洲乱码精品久久久久..| 欧美日韩中文字幕一区| 一区二区日韩在线观看| 日韩免费一区二区三区在线播放| 欧洲成人一区二区三区| 这里只有精品视频在线观看| 国内老熟妇对白xxxxhd| 日韩av在线影院| av在线电影观看| 久久99久久99精品中文字幕| 成人18在线| 欧美成人精品一区| 日韩欧美一中文字暮专区| 国产精品小说在线| 盗摄系列偷拍视频精品tp| 日韩av图片| 精品一区不卡| 欧美一区二区视频17c| 天天综合亚洲| 亚洲欧洲国产精品久久| 国产一区二区三区自拍| 可以免费在线看黄的网站| 国产欧美日韩亚洲一区二区三区| 人人爽人人av| 国产99久久久久久免费看农村| 91网址在线观看精品| 男男成人高潮片免费网站| www日本在线观看| 欧美韩日一区二区三区四区| 熟女少妇内射日韩亚洲| 亚洲一区在线电影| 中文字幕一区二区三区四区视频 | 亚洲国产第一区| av中文字幕亚洲| 这里只有精品在线观看视频| 国产精品网站在线| 久久露脸国语精品国产91| 欧美久久婷婷综合色| 免费一级在线观看播放网址| 欧美精品一区二区三区国产精品| 毛片免费看不卡网站| 国产成人av在线播放| 综合伊人久久| 国产欧美日韩综合精品二区| 国产精品99一区二区三区| 欧美 激情 在线| 成人黄色在线看| 亚洲熟妇无码av| 亚洲高清一区二区三区| 国产理论视频在线观看| 在线精品播放av| 韩国主播福利视频一区二区三区| 国产精品国产精品| 综合一区av| 久久这里只有精品23| 国产麻豆日韩欧美久久| 成人一级片免费看| 一区二区三区四区不卡在线| 中文字幕在线2018| 亚洲视频在线免费观看| 69久成人做爰电影| 久久综合色一本| 先锋影音久久久| 亚洲天堂久久新| 日韩欧美在线观看| 欧美日韩国产亚洲沙发| 91超碰caoporn97人人| 精品国产一区二区三区成人影院| av在线免费观看国产| 国产精品亚洲专一区二区三区| 久草视频手机在线| 欧美一区二区三区在线看| 国产黄大片在线观看画质优化| 成人在线精品视频| 日韩电影不卡一区| 国产中文字幕视频在线观看| 免费看欧美美女黄的网站| 亚洲自拍偷拍图| 欧美性猛交xxxxxxxx| www.国产精品.com| 国产日韩精品在线观看| 欧美中文一区| 中文字幕中文字幕99| 另类中文字幕网| 国产又粗又猛又爽又黄的视频小说| 欧美高清视频一二三区| 超碰在线caoporen| caoporn国产精品免费公开| 在线不卡亚洲| 日韩av一二区| 亚洲一区二区欧美激情| 狠狠躁日日躁夜夜躁av| 综合欧美国产视频二区| av资源在线| 欧美久久久久久久| 美日韩一区二区| 欧美黄色aaa| 亚洲韩国青草视频| 日本成人片在线| 精品久久久久久一区二区里番| 亚洲一区二区毛片| 免费黄色在线网址| 欧美日韩亚洲精品一区二区三区| a级片在线视频| 久久久影视精品| 九九亚洲视频| 亚洲天堂一区二区在线观看| 亚洲一区精品在线| 黄色av免费在线看| 欧美在线影院在线视频| 日韩在线二区| 久久免费精品国产| 亚洲精品国产第一综合99久久 | 国产午夜精品全部视频在线播放| 伊人久久综合网另类网站| 久久艹国产精品| 国产三级一区二区| 国产美女激情视频| 日韩在线视频免费观看| 国产精品中文字幕制服诱惑| jizz欧美激情18| 午夜私人影院久久久久| 1769在线观看| 国产在线精品二区| 国内精品免费**视频| 69国产精品视频免费观看| 欧美成人精品一区| 国产精品嫩模av在线| 日本成年人网址|