精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

av一区二区高清| 亚洲wwwav| 国产午夜在线一区二区三区| 免费在线看电影| 日韩影院免费视频| 一区二区亚洲精品国产| 久久美女福利视频| 欧美激情办公室videoshd| 国产在线精品一区二区不卡了 | 人妻精品无码一区二区三区| 成人免费在线电影| 国产成人小视频| 日韩美女在线播放| 老女人性淫交视频| 丝袜连裤袜欧美激情日韩| 91福利在线看| 青青青在线观看视频| 国产不卡av在线播放| 黄色亚洲精品| 亚洲大尺度美女在线| av免费在线一区| 亚洲视频在线一区二区| αv一区二区三区| 在线免费av网| 午夜一级在线看亚洲| 久久综合电影一区| 国产三级国产精品| av成人资源| 欧美日韩卡一卡二| 草草视频在线免费观看| 亚洲 欧美 日韩 综合| 亚洲激情五月| 中文字幕日韩欧美精品在线观看| 中文字幕天堂网| 国产精品国产三级在线观看| 在线观看亚洲a| 5月婷婷6月丁香| 青青影院在线观看| 欧美激情一区在线观看| 九九99久久| 黄色av一区二区三区| 国产原创一区二区| 全球成人中文在线| 免费在线视频观看| 91精品国产乱码久久久久久| 亚洲性xxxx| 波多野结衣一本| 网友自拍一区| 亚洲精品国精品久久99热| 五月天婷婷在线观看视频| 久久久久久久性潮| 欧亚一区二区三区| 国产高清视频网站| 99久久综合国产精品二区| 一区二区视频在线| 国产女教师bbwbbwbbw| 亚洲av色香蕉一区二区三区| 国产一区二区在线看| 国产精品十八以下禁看| 丰满人妻一区二区三区四区| 日韩电影一区二区三区| 国产精品欧美激情| 中文字幕在线2019| 国模无码大尺度一区二区三区| 国产区精品视频| 国产精品久久久久久久一区二区| 国模一区二区三区白浆| 99在线影院| 日本黄色三级视频| 风间由美性色一区二区三区| 国产精品麻豆免费版| 日本精品久久久久| 91丨九色丨国产丨porny| 国产精品免费看一区二区三区| 亚洲精品97久久中文字幕| 波多野结衣中文字幕一区| 国产激情一区二区三区在线观看| 国产夫绿帽单男3p精品视频| 国产在线精品免费av| 国产精成人品localhost| 欧美视频久久久| 久久综合色之久久综合| 亚洲欧美在线网| 巨大荫蒂视频欧美另类大| 亚洲天堂免费看| 国内自拍偷拍视频| 欧美国产日韩在线播放| 日本高清不卡一区二区三区视频 | 一本一道久久久a久久久精品91| 免费大片黄在线| 中文字幕一区二区5566日韩| 青青视频免费在线观看| 在线观看特色大片免费视频| 精品久久香蕉国产线看观看亚洲| 日韩在线第三页| 成人在线精品| 日韩成人av在线| 日本午夜精品视频| 欧美 日韩 国产精品免费观看| 久久影院资源网| aaa人片在线| 国产一区二区在线观看免费| 久久精品欧美| 免费成人黄色| 欧美性xxxxx| 久久婷婷国产91天堂综合精品| 国产成人福利夜色影视| 日本韩国一区二区三区视频| 亚洲激情在线观看视频| 激情av综合| 久久激情视频久久| 毛片在线免费视频| 国产一区在线视频| 免费观看成人高| 亚洲成人三级| 色婷婷久久99综合精品jk白丝| 波多野结衣中文字幕在线播放| 亚洲免费福利一区| 综合网中文字幕| 久久不卡免费视频| 日本特黄久久久高潮| 99c视频在线| 日本a级在线| 色欧美片视频在线观看| 在线播放av网址| 色天天久久综合婷婷女18| 久久久亚洲成人| 国产精品一区二区免费视频| 国产调教视频一区| 男女午夜激情视频| 久久九九热re6这里有精品| 在线激情影院一区| 国产精品成人av久久| 日韩电影一区二区三区| 欧美性xxxx69| 羞羞视频在线免费国产| 欧美军同video69gay| 一级在线观看视频| 日韩精品亚洲专区| 国产在线一区二区三区欧美 | 久久精品夜色噜噜亚洲a∨| 日韩伦理在线免费观看| 亚洲国产aⅴ精品一区二区| 久久久91精品国产一区不卡| 一本久道久久综合无码中文| 久久久久高清精品| 男人日女人bb视频| 亚洲bt欧美bt精品777| 91sa在线看| 三级黄视频在线观看| 欧美日韩人人澡狠狠躁视频| 亚洲AV无码国产精品| 亚洲一级在线| 国语精品免费视频| 国产系列电影在线播放网址| 91国模大尺度私拍在线视频| 公肉吊粗大爽色翁浪妇视频| 9999久久久久| 欧美激情视频一区二区| 亚洲第一免费视频| 亚洲午夜精品网| 欧美国产日韩在线视频| 久久精品国产99久久| 国产成人拍精品视频午夜网站 | 波多野结衣爱爱视频| 国产一区二区三区免费| h无码动漫在线观看| 伊色综合久久之综合久久| 欧美精品videossex88| 99在线精品视频免费观看软件| 久久久久99精品国产片| 黄色永久免费网站| 亚洲午夜精品一区 二区 三区| 亚洲自拍偷拍福利| 99热99re6国产在线播放| 日韩国产高清视频在线| 中文在线免费观看| 亚洲乱码中文字幕| 国产高清成人久久| 日韩精品91亚洲二区在线观看| 亚洲欧洲另类精品久久综合| 欧美专区视频| 欧美一乱一性一交一视频| 春暖花开成人亚洲区| 欧美日韩1234| 精品视频一区二区在线观看| 久久色视频免费观看| 在线看的黄色网址| 久久人体视频| 粉嫩av免费一区二区三区| 国产蜜臀在线| 亚洲色图美腿丝袜| www.久久成人| 色成年激情久久综合| 大胸美女被爆操| 国产成人在线电影| 黑人糟蹋人妻hd中文字幕| 色狼人综合干| 92裸体在线视频网站| 免费h在线看| 久久亚洲影音av资源网| 头脑特工队2在线播放| 久久久久国产精品麻豆ai换脸 | 亚洲欧美在线综合| 97精品免费视频| 亚洲日本香蕉视频| 在线亚洲免费视频| 99视频只有精品| 成人在线综合网| 欧美交换配乱吟粗大25p| 久久不见久久见中文字幕免费| 成人一区二区电影| 欧美成人a交片免费看| 欧美国产视频一区二区| a视频网址在线观看| 亚洲精品成a人在线观看| 国产女18毛片多18精品| 午夜av区久久| 亚洲二区在线播放| 久久久噜噜噜久久中文字幕色伊伊| 三级黄色片播放| 日日夜夜精品视频免费| 色欲色香天天天综合网www| 亚洲va在线| 午夜精品福利一区二区| 国产精品久久久网站| 亚洲在线一区二区| 成人开心激情| 欧洲成人在线视频| av激情在线| 久久精品成人动漫| 视频午夜在线| 亚洲精品720p| 精品国产av 无码一区二区三区 | 一级黄色在线观看| 天天影视涩香欲综合网| 国模无码国产精品视频| 亚洲欧美在线另类| 欧美日韩生活片| 国产精品系列在线| av黄色一级片| 成人免费视频app| 无码人妻aⅴ一区二区三区玉蒲团| 久久机这里只有精品| 亚洲福利精品视频| 性久久久久久| 精品www久久久久奶水| 久久久久免费| 免费高清在线观看免费| 天堂成人免费av电影一区| 青青视频在线播放| 国产精品久久国产愉拍| 欧美一区二区中文字幕| 亚洲三级网站| 动漫av网站免费观看| 国内综合精品午夜久久资源| 欧美在线观看黄| 欧美激情五月| 国产中文字幕乱人伦在线观看| 久久精品久久久| 2021国产视频| 国产一区清纯| 成人免费性视频| 欧美激情成人在线| 国产免费一区二区视频| 永久亚洲成a人片777777| 亚洲av综合色区| 最新欧美人z0oozo0| 国产精品一线二线三线| 久久精品30| 成人午夜免费在线| 亚洲精品乱码久久久久久蜜桃麻豆| 最新国产精品久久| 午夜精品一区二区三区国产 | 色视频成人在线观看免| 亚洲一区二区影视| 欧美大片国产精品| 少妇高潮久久久| 中文国产成人精品久久一| 国产美女福利在线| 久热精品视频在线观看| 国产99re66在线视频| 日韩免费不卡av| 99er精品视频| 国产亚洲精品自在久久| 欧美天堂社区| 亚洲一区不卡在线| 极品少妇一区二区三区| 亚洲人成色77777| 美女视频一区在线观看| 亚洲色图欧美另类| 久久日韩精品一区二区五区| 登山的目的在线| 亚洲国产三级在线| 最近中文字幕在线观看视频| 91精选在线观看| 清纯唯美亚洲色图| 色偷偷噜噜噜亚洲男人| 爱情岛亚洲播放路线| 国产精品亚洲综合天堂夜夜| 亚洲乱码一区| 亚洲成人18| 亚洲第一毛片| 国产日韩一区二区在线| 韩国成人福利片在线播放| 欧美成人午夜精品免费| 亚洲欧美激情小说另类| 久久亚洲精品石原莉奈| 日韩视频一区二区三区在线播放| 邻居大乳一区二区三区| 欧美极品少妇与黑人| 狠狠久久伊人中文字幕| 蜜桃传媒视频麻豆一区| 成熟的女同志hd| 一区二区三区小说| 在线播放精品视频| 日韩精品一区国产麻豆| 午夜视频在线观看网站| 97超碰蝌蚪网人人做人人爽| 日本成人网址| 国产精品久久久久99| 欧美变态网站| 99在线视频精品| 国产综合中文字幕| 国模少妇一区二区三区| 国产无遮挡在线观看| 2欧美一区二区三区在线观看视频| 免费看日本黄色片| 欧美日韩久久久久| 欧美熟妇另类久久久久久不卡| 日韩一区二区久久久| 成人高清一区| 青青草国产精品| 久久国产日韩| 亚洲专区区免费| 狠狠躁夜夜躁人人爽超碰91| 蜜臀av中文字幕| 精品视频一区二区不卡| 免费国产羞羞网站视频| 久久97久久97精品免视看 | 高清国产一区二区| 欧美偷拍第一页| 7777精品伊人久久久大香线蕉经典版下载 | 成人动漫一区二区在线| 欧美卡一卡二卡三| 欧美一区二区三区免费视频| 日本黄色片在线观看| 国产精品中文字幕久久久| 不卡中文字幕| 九色porny自拍| 国产一线二线在线观看| 欧美极品少妇xxxxⅹ免费视频| 亚洲精品一区国产| 欧美国产视频一区| 国产丶欧美丶日本不卡视频| 极品久久久久久| 日韩一区二区三区免费观看| 菠萝菠萝蜜在线视频免费观看| 久久久久久久色| 国产极品嫩模在线观看91精品| 欧美一区观看| 美女尤物国产一区| 国产wwwwxxxx| 欧美三级资源在线| 性中国古装videossex| 91精品国产一区| 少妇一区二区视频| 黄色免费福利视频| 国产欧美日韩久久| 色男人天堂av| 久久综合久久99| www.久久com| 亚洲精品自拍动漫在线| 黄色一级a毛片| 国产成人激情小视频| 四虎成人精品永久免费av九九| 亚洲一二区在线观看| 亚洲福利一区二区三区| 蜜桃免费在线| 91久久香蕉国产日韩欧美9色| 在线观看免费视频国产| 91麻豆福利精品推荐| 国产一区免费看| 国产一区二区三区精品久久久| 亚洲二区av| 男人添女荫道口女人有什么感觉| www.av精品| 毛片在线免费播放| 亚洲国产精品字幕| 日本中文字幕电影在线免费观看| 日韩电影网在线| 福利在线视频网站| 亚洲一区二区久久久久久| 亚洲精品偷拍| 可以免费看av的网址| 亚洲成人教育av| 外国成人毛片| 免费在线观看的av网站| 一区二区三区**美女毛片| 免费在线黄色影片|