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

探討Esbuild 為什么那么快

開發 前端
大多數前端打包工具都是基于 JavaScript 實現的,而 Esbuild 則選擇使用 Go 語言編寫,兩種語言各自有其擅長的場景,但是在資源打包這種 CPU 密集場景下,Go 更具性能優勢,差距有多大呢?

[[404663]]

Esbuild 是什么

Esbuild 是一個非常新的模塊打包工具,它提供了與 Webpack、Rollup、Parcel 等工具「相似」的資源打包能力,卻有著高的離譜的性能優勢:

從上到下,耗時逐步上升達到數百倍的差異,這個巨大的性能優勢使得 Esbuild 在一眾基于 Node 的構建工具中迅速躥紅,特別是 Vite 2.0 宣布使用 Esbuild 預構建依賴后,前端社區關于它的討論熱度迅速上升。

那么問題來了,這是怎么做到的?我翻閱了很多資料后,總結了一些關鍵因素:

下面展開一一細講。

為什么快

語言優勢

大多數前端打包工具都是基于 JavaScript 實現的,而 Esbuild 則選擇使用 Go 語言編寫,兩種語言各自有其擅長的場景,但是在資源打包這種 CPU 密集場景下,Go 更具性能優勢,差距有多大呢?比如計算 50 次斐波那契數列,JS 版本:

  1. function fibonacci(num) { 
  2.     if (num < 2) { 
  3.         return 1 
  4.     } 
  5.     return fibonacci(num - 1) + fibonacci(num - 2) 
  6.  
  7. (() => { 
  8.     let cursor = 0; 
  9.     while (cursor < 50) { 
  10.         fibonacci(cursor++) 
  11.     } 
  12. })() 

 

Go 版本:

  1. package main 
  2.  
  3. func fibonacci(num intint
  4.     if num<2{ 
  5.         return 1 
  6.     } 
  7.      
  8.     return fibonacci(num-1) + fibonacci(num-2) 
  9.  
  10. func main(){ 
  11.     for i := 0; i<50; i++{ 
  12.         fibonacci(i) 
  13.     } 

 

JavaScript 版本執行耗時大約為 「332.58s」,Go 版本執行耗時大約為 「147.08s」,兩者相差約 「1.25」 倍,這個簡單實驗并不能精確定量兩種語言的性能差別,但感官上還是能明顯感知 Go 語言在 CPU 密集場景下會有更好的性能表現。

歸根到底,雖然現代 JS 引擎與10年前相比有巨大的提升,但 JavaScript 本質上依然是一門解釋型語言,JavaScript 程序每次執行都需要先由解釋器一邊將源碼翻譯成機器語言,一邊調度執行;而 Go 是一種編譯型語言,在編譯階段就已經將源碼轉譯為機器碼,啟動時只需要直接執行這些機器碼即可。

這種語言層面的差異在打包場景下特別突出,說的夸張一點,JavaScript 運行時還在解釋代碼的時候,Esbuild 已經在解析用戶代碼;JavaScript 運行時解釋完代碼剛準備啟動的時候,Esbuild 可能已經打包完畢,退出進程了!

圖片

所以在編譯運行層面,Go 前置了源碼編譯過程,相對 JavaScript 邊解釋邊運行的方式有更高的執行性能。

多線程優勢

Go 天生具有多線程運行能力,而 JavaScript 本質上是一門單線程語言,直到引入 WebWorker 規范之后才有可能在瀏覽器、Node 中實現多線程操作。

我曾經研讀過 Rollup、Webpack 的代碼,就我熟知的范圍內兩者均未使用 WebWorker 提供的多線程能力。反觀 Esbuild,它最核心的賣點就是性能,它的實現算法經過非常精心的設計,盡可能飽和地使用各個 CPU 核,特別是打包過程的解析、代碼生成階段已經實現完全并行處理。

圖片
圖片

除了 CPU 指令運行層面的并行外,Go 語言多個線程之間還能共享相同的內存空間,而 JavaScript 的每個線程都有自己獨有的內存堆。這意味著 Go 中多個處理單元,例如解析資源 A 的線程,可以直接讀取資源 B 線程的運行結果,而在 JavaScript 中相同的操作需要調用通訊接口 woker.postMessage 在線程間復制數據。

所以在運行時層面,Go 擁有天然的多線程能力,更高效的內存使用率,也就意味著更高的運行性能。

節制

對,沒錯,節制!

Esbuild 并不是另一個 Webpack,它僅僅提供了構建一個現代 Web 應用所需的最小功能集合,未來也不會大規模加入我們業已熟悉的各類構建特性。最新版本 Esbuild 的主要功能特性有:

  • 支持 js、ts、jsx、css、json、文本、圖片等資源
  • 增量更新
  • Sourcemap
  • 開發服務器支持
  • 代碼壓縮
  • Code split
  • Tree shaking
  • 插件支持

可以看到,這份列表中支持的資源類型、工程化特性非常少,甚至并不足以支撐一個大型項目的開發需求。在這之外,官網明確聲明未來沒有計劃支持如下特性:

  • Elm, Svelte, Vue, Angular 等代碼文件格式
  • Ts 類型檢查
  • AST 相關操作 API
  • Hot Module Replace
  • Module Federation

而且,Esbuild 所設計的插件系統也無意覆蓋以上這些場景,這就意味著第三方開發者無法通過「插件」這種無侵入的方式實現上述功能,emmm,可以預見未來可能會出現很多魔改版本。

Esbuild 只解決一部分問題,所以它的架構復雜度相對較小,相對地編碼復雜度也會小很多,相對于 Webpack、Rollup 等大一統的工具,也自然更容易把性能做到極致。節制的功能設計還能帶來另外一個好處:完全為性能定制的各種附加工具。

定制

回顧一下,在 Webpack、Rollup 這類工具中,我們不得不使用很多額外的第三方插件來解決各種工程需求,比如:

  • 使用 babel 實現 ES 版本轉譯
  • 使用 eslint 實現代碼檢查
  • 使用 TSC 實現 ts 代碼轉譯與代碼檢查
  • 使用 less、stylus、sass 等 css 預處理工具

我們已經完全習慣了這種方式,甚至覺得事情就應該是這樣的,大多數人可能根本沒有意識到事情可以有另一種解決方案。Esbuild 起了個頭,選擇完全!完全重寫整套編譯流程所需要用到的所有工具!這意味著它需要重寫 js、ts、jsx、json 等資源文件的加載、解析、鏈接、代碼生成邏輯。

開發成本很高,而且可能被動陷入封閉的風險,但收益也是巨大的,它可以一路貫徹原則,以性能為最高優先級定制編譯的各個階段,比如說:

  • 重寫 ts 轉譯工具,完全拋棄 ts 類型檢查,只做代碼轉換
  • 大多數打包工具把詞法分析、語法分析、符號聲明等步驟拆解為多個高內聚低耦合的處理單元,各個模塊職責分明,可讀性、可維護性較高。而 Esbuild 則堅持性能第一原則,不惜采用反直覺的設計模式,將多個處理算法混合在一起降低編譯過程數據流轉所帶來的性能損耗
  • 一致的數據結構,以及衍生出的高效緩存策略,下一節細講

這種深度定制一方面降低了設計成本,能夠保持編譯鏈條的架構一致性;一方面能夠貫徹性能第一的原則,確保每個環節以及環節之間交互性能的最優。雖然伴隨著功能、可讀性、可維護性層面的的犧牲,但在編譯性能方面幾乎做到了極致。

結構一致性

上一節我們講到 Esbuild 選擇重寫包括 js、ts、jsx、css 等語言在內的轉譯工具,所以它更能保證源代碼在編譯步驟之間的結構一致性,比如在 Webpack 中使用 babel-loader 處理 JavaScript 代碼時,可能需要經過多次數據轉換:

  • Webpack 讀入源碼,此時為字符串形式
  • Babel 解析源碼,轉換為 AST 形式
  • Babel 將源碼 AST 轉換為低版本 AST
  • Babel 將低版本 AST generate 為低版本源碼,字符串形式
  • Webpack 解析低版本源碼
  • Webpack 將多個模塊打包成最終產物

源碼需要經歷 string => AST => AST => string => AST => string ,在字符串與 AST 之間反復橫跳。

而 Esbuild 重寫大多數轉譯工具之后,能夠在多個編譯階段共用相似的 AST 結構,盡可能減少字符串到 AST 的結構轉換,提升內存使用效率。

總結

單純從編譯性能的維度看,Esbuild 確實完勝世面上所有打包框架,差距甚至能在百倍之大:

但這是有代價的,刨除語言層面的天然優勢外,在功能層面它直接放棄對 less、stylus、sass、vue、angular 等資源的支持,放棄 MF、HMR、TS 類型檢查等功能,正如作者所說:

❝This will involve saying "no" to requests for adding major features to esbuild itself. I don't think esbuild should become an all-in-one solution for all frontend needs!❞

在我看來,Esbuild 當下與未來都不能替代 Webpack,它不適合直接用于生產環境,而更適合作為一種偏底層的模塊打包工具,需要在它的基礎上二次封裝,擴展出一套既兼顧性能又有完備工程化能力的工具鏈,例如 Snowpack, Vite, SvelteKit, Remix Run 等。

總的來說,Esbuild 提供了一種新的設計思路,值得學習了解,但對大多數業務場景還不適合直接投入生產使用。

 

責任編輯:姜華 來源: Tecvan
相關推薦

2021-05-27 20:56:51

esbuild 工具JavaScript

2023-06-08 18:25:40

Doris場景查詢

2023-10-15 12:23:10

單線程Redis

2020-07-29 08:06:30

Kafka MQ消息

2019-10-18 14:54:04

Kafka寫入磁盤

2019-05-10 09:47:33

2022-02-24 07:56:42

開發Viteesbuild

2024-02-26 21:15:20

Kafka緩存參數

2020-02-27 15:44:41

Nginx服務器反向代理

2020-02-27 21:03:30

調度器架構效率

2020-08-03 07:50:56

存儲對象存儲

2022-01-24 14:42:03

手機技術廠商

2024-04-03 09:23:31

ES索引分析器

2020-03-30 15:05:46

Kafka消息數據

2017-03-25 21:32:40

Python編碼

2019-10-18 09:40:19

程序員固態硬盤Linux

2015-06-05 14:15:13

程序員難升職

2022-02-21 10:06:14

自動駕駛汽車智能

2017-01-21 14:57:43

Linuxsystemd

2025-05-27 02:20:00

PG數據庫DBA
點贊
收藏

51CTO技術棧公眾號

91精品国产乱码久久久张津瑜| 一级做a爱视频| 久久精品蜜桃| 久久精品国产久精国产| 久久成人精品电影| 变态另类丨国产精品| 成人在线中文| 亚洲一区二区三区四区五区黄| 麻豆成人小视频| 国产精品自偷自拍| 午夜在线一区二区| 中文字幕自拍vr一区二区三区| 国产又粗又猛又爽又黄| 校园春色亚洲色图| 玉足女爽爽91| 五月天亚洲综合| 免费观看国产视频| 六月丁香综合在线视频| 91国产一区在线| 欧美大片xxxx| 国内精品视频在线观看| 欧美成人激情免费网| 午夜免费精品视频| 蜜桃视频在线观看免费视频| 亚洲男人天堂av| 四虎一区二区| 青青久在线视频| 成人一区二区三区视频在线观看| 国产美女精彩久久| 手机在线看片1024| 在线成人h网| 免费91麻豆精品国产自产在线观看| 亚洲综合网在线观看| 亚洲专区**| 91精品国产91久久久久久一区二区 | 国产精品女人久久久| 免费视频久久| 97色在线视频| 永久免费看mv网站入口| 国内精品伊人久久久| 亚洲精品一区二三区不卡| 日韩高清一二三区| 人人九九精品视频| 在线成人免费观看| 亚洲免费av一区| 欧美a一级片| 欧美三级电影在线看| 国产精品涩涩涩视频网站| 中文字幕资源网在线观看免费| 亚州成人在线电影| 国产中文字幕乱人伦在线观看| 日本高清在线观看| 亚洲一区自拍偷拍| 国产va亚洲va在线va| av免费不卡国产观看| 亚洲成人动漫av| 欧美二区在线视频| 三妻四妾完整版在线观看电视剧| 午夜精品爽啪视频| 日本三级免费网站| 欧美大胆性生话| 在线亚洲高清视频| 亚洲一级免费在线观看| 只有精品亚洲| 欧美va亚洲va香蕉在线| 欧美日韩人妻精品一区在线| 国内自拍欧美| 亚洲精品一二区| 中文天堂资源在线| 久久久久久美女精品| 久久影视电视剧免费网站| 欧美日韩精品亚洲精品| 亚洲精品影视| 国产大片精品免费永久看nba| 日韩精选在线观看| 极品少妇一区二区三区精品视频| 91高跟黑色丝袜呻吟在线观看| 亚洲精品国产精品乱码不卡| 91在线丨porny丨国产| 欧日韩一区二区三区| avav免费在线观看| 亚洲精品国产成人久久av盗摄 | 欧美黄色视屏| 精品美女永久免费视频| 在线免费视频a| 日本精品国产| 精品在线小视频| 亚洲激情图片网| 亚洲高清毛片| 国产美女91呻吟求| 人妻一区二区三区四区| 欧美韩国日本不卡| a级黄色片免费| 三上悠亚一区二区| 欧美一级欧美三级| 黑人巨大精品欧美| 亚洲区综合中文字幕日日| 午夜精品福利在线观看| 中文字幕 日韩有码| 成人小视频在线| 亚洲一区二区免费视频软件合集| 免费在线看电影| 欧美自拍丝袜亚洲| 日本性生活一级片| 欧美第一精品| 9.1国产丝袜在线观看| 97人妻一区二区精品免费视频| av电影在线观看完整版一区二区| 亚洲午夜精品久久| 一个人看的www视频在线免费观看| 欧美性感一区二区三区| 欧类av怡春院| 综合一区av| 国产精品影院在线观看| 日本在线丨区| 亚洲成人资源在线| 超碰在线免费av| 日韩精品久久| 青青久久aⅴ北条麻妃| 亚洲av综合色区无码一二三区| 亚洲国产岛国毛片在线| 1024av视频| 国产区精品视频在线观看豆花| 色偷偷av一区二区三区乱| 黄色片视频免费| 99re成人在线| www.国产在线播放| 欧美专区一区| 久久人人爽人人爽爽久久| 美女黄页在线观看| 久久夜色精品一区| av7777777| 国产精品sss在线观看av| 中文字幕视频一区二区在线有码| 国产剧情在线视频| 97精品久久久午夜一区二区三区| 99er在线视频| 亚洲视频精选| 欧美激情视频网站| 精品区在线观看| 亚洲激情在线激情| 无码国产精品一区二区高潮| 最新精品国产| 精品国产91| 91免费观看视频在线| 日韩电影免费观看在| 精品极品在线| 亚洲精品mp4| 中文字幕一区二区三区精品| 成人免费av资源| 人妻夜夜添夜夜无码av| 免费观看成人www动漫视频| 久久av.com| 亚洲第一页视频| 亚洲国产综合在线| 亚洲制服丝袜在线播放| 国产精品一二| 人偷久久久久久久偷女厕| 欧美亚洲韩国| 日韩在线观看你懂的| 国产精品国产精品国产专区| 曰韩精品一区二区| 久久久午夜精品福利内容| 亚洲一区二区三区高清不卡| 欧美精品七区| 欧美日韩伦理一区二区| 美日韩丰满少妇在线观看| 亚洲乱码国产乱码精品精软件| 亚洲国产美国国产综合一区二区| 7788色淫网站小说| 玖玖精品视频| 久久av喷吹av高潮av| 成人台湾亚洲精品一区二区| 欧美亚洲成人精品| porn视频在线观看| 日韩欧美一二三四区| 免费在线不卡视频| 国产欧美日韩视频在线观看| 黄色a级三级三级三级| 99视频精品| 亚洲一区不卡在线| 国产精品白丝一区二区三区| 国产精彩精品视频| 超鹏97在线| 精品视频久久久久久| 中文字幕在线观看1| 亚洲午夜日本在线观看| 国产小视频自拍| 国产美女精品人人做人人爽| 日韩小视频在线播放| 日韩情爱电影在线观看| 国产精品一区二区三区观看 | 97超级碰在线看视频免费在线看 | 精品国产导航| 国产精品久久久久久av福利| 天堂亚洲精品| 亚洲香蕉av在线一区二区三区| 国产欧美久久久| 欧美日韩一区二区在线| 欧美日韩午夜视频| 久久久影视传媒| 国内自拍偷拍视频| 96av在线| 久久精品人人做人人爽97| 91av在线免费播放| 欧美精选一区| 亚洲精品国产一区| 日韩高清在线免费观看| 91在线观看免费高清完整版在线观看| 成人bbav| 欧美乱妇40p| h网站在线免费观看| 亚洲第一级黄色片| 国产精品一区二区三区在线免费观看| 欧美日韩免费在线观看| 日韩成人毛片视频| 中文字幕免费不卡在线| 亚洲调教欧美在线| 国内精品视频666| 波多野结衣天堂| 国产精品日韩欧美一区| 久久天天东北熟女毛茸茸| 成人羞羞网站入口免费| 免费看成人片| 美国成人xxx| 99久久99久久精品国产片| 国产精品久久久久久久久免费高清 | 日本丰满少妇裸体自慰 | 国产高清一区二区三区| 永久免费观看精品视频| 国产乱肥老妇国产一区二 | 99视频在线| 国产精品**亚洲精品| 国产精品视频资源| 97欧美成人| 国产精品精品视频| 成人在线视频播放| 日本电影亚洲天堂| xx欧美xxx| 538国产精品视频一区二区| 丁香花在线观看完整版电影| 欧美大肥婆大肥bbbbb| 欧洲美女少妇精品| 日韩在线中文字幕| 男女啪啪在线观看| 久久精品国产欧美亚洲人人爽| 日韩伦理在线观看| 日韩中文字幕精品| 黄av在线播放| 久久中文字幕在线| 怡红院在线播放| 欧美激情一二三| 免费男女羞羞的视频网站在线观看| 欧美老少做受xxxx高潮| 欧美wwww| 欧美一区二区三区艳史| 亚洲少妇视频| 国产精品美女视频网站| 欧美韩国日本| 亚洲一区免费网站| 成人爽a毛片| 欧美一区二区三区成人久久片 | 一本色道久久88亚洲精品综合| 91精品国产视频| 黄色a级片免费看| 日韩午夜av在线| 成年人小视频网站| 另类成人小视频在线| 欧美国产在线一区| eeuss影院一区二区三区 | 成人免费在线观看入口| 91九色丨porny丨极品女神| 亚洲狠狠爱一区二区三区| 中文字幕视频网站| 欧美日韩中文字幕一区二区| 99riav国产| 亚洲精品国产综合久久| 北岛玲一区二区三区| 久久精品国亚洲| 精精国产xxxx视频在线播放| 国产成人欧美在线观看| 精品一区二区三区四区五区 | 艳母动漫在线看| 中文字幕日韩av| 国产探花在线观看| 国产精品99一区| 日韩中文字幕在线一区| 久久综合九色综合久99| 欧美激情欧美| 欧美 日本 亚洲| 久久99精品国产麻豆不卡| 中文字幕天堂av| 欧美激情综合网| 国产午夜视频在线播放| 欧美伊人久久久久久久久影院| www.国产.com| 深夜福利91大全| 黄色aa久久| 亚洲综合在线小说| 国产欧美日韩视频在线| www污在线观看| 久久精品国内一区二区三区| 熟妇人妻久久中文字幕| 亚洲欧美乱综合| 999视频在线| 亚洲第一福利网| 成人高清免费在线| 国产精品高潮呻吟久久av无限| ady日本映画久久精品一区二区| 日韩电影天堂视频一区二区| 亚洲国产二区| 一级片免费在线观看视频| 国产亚洲一区二区三区四区| 国产真实夫妇交换视频| 欧美精品久久一区| 免费动漫网站在线观看| 久久久久久中文字幕| 国产精品亚洲综合在线观看| 亚洲精品一区国产精品| 久久久噜噜噜| 日韩aaaaa| 亚洲二区在线观看| aaa国产视频| 俺去了亚洲欧美日韩| 91亚洲精品| 欧美日韩综合网| 亚洲欧美清纯在线制服| 最新日本中文字幕| 一区二区三区欧美亚洲| 国产男女裸体做爰爽爽| 日韩亚洲欧美成人| jizz欧美| 亚洲精品久久久久久一区二区| 麻豆精品网站| 欧美多人猛交狂配| 欧美日韩一区二区三区| 五月婷婷六月激情| 97色在线观看免费视频| 欧美一区二区三区红桃小说| www.日本在线播放| 成人免费视频网站在线观看| 国产亚洲精品码| 欧美变态凌虐bdsm| 国产丝袜精品丝袜| 福利视频一区二区三区| 欧美精品偷拍| 一级黄色免费视频| 性做久久久久久久久| 日韩中文字幕影院| 国产91精品黑色丝袜高跟鞋| 任你弄精品视频免费观看| 国产免费观看高清视频| 久久毛片高清国产| 久久精品视频2| 综合国产在线视频| 成人av在线播放| 日产精品久久久久久久蜜臀| av中文字幕在线不卡| 国产美女激情视频| 一区二区国产精品视频| 久久电影天堂| 看一级黄色录像| 成人亚洲一区二区一| 日韩免费视频一区二区视频在线观看| 亚洲精品在线视频| 成人免费黄色| 青青在线视频免费观看| 91在线小视频| 中文字幕人妻一区二区三区视频 | 亚洲精品一区国产精品| 国产一区二区在线看| 国产精品成人网站| 亚洲欧美精品伊人久久| 久久免费资源| 91网站在线观看免费| 久久久国产一区二区三区四区小说| 欧美三级网站在线观看| xxxxx91麻豆| 国产欧美自拍一区| 国产三级日本三级在线播放| 亚洲美女免费视频| 日韩成人黄色| 亚洲xxxxx性| 校园激情久久| 日韩三级在线观看视频| 亚洲国产精品美女| 国产精品99| 免费不卡av在线| 国产精品久久夜| 欧美性猛交 xxxx| 国产精品爽黄69天堂a| 亚洲人成免费| 99re6热在线精品视频| 亚洲国产成人久久综合| 美女视频一区| 人人妻人人添人人爽欧美一区| 国产精品电影院| 天堂资源中文在线| 91久久精品国产91久久| 久久久久国产精品午夜一区|