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

欧美在线你懂的| 成人激情综合网站| 日韩在线欧美在线国产在线| 99精品视频国产| 女人天堂av在线播放| 不卡免费追剧大全电视剧网站| 日韩av电影手机在线观看| 五月婷六月丁香| 9999在线精品视频| 午夜精品久久久久久| 青青草原成人| 性生活免费网站| 青青草原综合久久大伊人精品优势| 久久精品国产亚洲精品2020| 欧美熟妇精品黑人巨大一二三区| 色成人免费网站| 一区二区三区四区在线播放| 日本一区二区在线视频观看| 国产wwwxxx| 日本aⅴ免费视频一区二区三区 | 一本久久精品一区二区| 2025韩国大尺度电影| 日韩精品福利| 国产成人午夜高潮毛片| 国产精欧美一区二区三区| 欧美日韩成人免费观看| 成人vr资源| 日韩av在线免费| 五月六月丁香婷婷| 成人国产精品| 色综合天天综合狠狠| 国产 欧美 日韩 一区| 免费黄色在线观看| 久久色成人在线| 亚洲xxx自由成熟| 中国一级片黄色一级片黄| 国产日韩欧美三级| 久久久久久久久网站| www.av免费| 99视频精品视频高清免费| 亚洲精品一区中文字幕乱码| 亚洲啪av永久无码精品放毛片 | 日韩制服丝袜av| 欧美孕妇性xx| www..com国产| 国产一区二区三区四区老人| 久久中文字幕视频| 中文字幕美女视频| 色777狠狠狠综合伊人| 亚洲午夜av电影| 国产精品天天干| 欧美美女一区| 在线激情影院一区| 亚洲精品国产精品国自| 国产精品国产精品| 亚洲黄色一级大片| 成人综合婷婷国产精品久久蜜臀 | 亚洲av无码乱码国产精品| 精品在线观看免费| 成人欧美一区二区三区黑人孕妇| 中文字幕视频在线播放| 免费观看成人av| 国产伦精品一区二区三区精品视频| 久久久久久无码精品大片| 三级不卡在线观看| 国产精品久久久久久久久久免费| 夜夜躁日日躁狠狠久久av| 日韩精品一级二级| 国产精品午夜一区二区欲梦| 91av国产精品| 国产精品18久久久久久久久久久久 | 国产一二三四五| av片在线观看| 亚洲国产一区在线观看| 免费观看美女裸体网站| 国产美女高潮在线观看| 一本大道久久a久久综合婷婷| 人妻丰满熟妇av无码区app| av成人在线看| 在线综合亚洲欧美在线视频| 国产女主播在线播放| 日本午夜精品| 中文字幕日韩精品在线| 日韩高清dvd碟片| 亚洲精选91| 国产99久久久欧美黑人 | 亚洲电影观看| 欧美色图免费看| 中文字幕乱码在线人视频| 久久精品色综合| 综合av色偷偷网| 久久久久久天堂| 欧美专区在线| 亚洲自拍偷拍福利| 色鬼7777久久| 综合久久国产九一剧情麻豆| 亚洲熟妇无码一区二区三区| av成人亚洲| 亚洲国内精品视频| 网爆门在线观看| 一区二区三区高清视频在线观看| 国产精品私拍pans大尺度在线| 丰满熟妇乱又伦| 国产精品天天看| 免费观看国产精品视频| 涩涩涩久久久成人精品| 日韩高清av在线| 日韩一级片大全| 丝瓜av网站精品一区二区| 国产精品视频xxx| 亚洲色图21p| 亚洲欧美精品午睡沙发| 毛片一区二区三区四区| 91成人在线精品视频| 色小说视频一区| √资源天堂中文在线| 国产一区二区看久久| 日韩电影大全在线观看| 91美女主播在线视频| 欧美精品色一区二区三区| 一区二区不卡免费视频| 亚洲视频福利| 成人激情视频在线播放| 精品电影在线| 欧美午夜宅男影院在线观看| 大桥未久恸哭の女教师| 66久久国产| 国产免费一区二区三区香蕉精| 你懂的视频在线| 亚洲成a天堂v人片| 日本wwwwwww| 欧美99在线视频观看| 国产精品一区二区在线| 男男激情在线| 欧美日韩性视频| av黄色一级片| 国产综合网站| 99久久99久久| 亚洲卡一卡二| 欧美成人激情免费网| 日本在线一级片| 国产真实乱对白精彩久久| 亚洲一区二区三区涩| 日韩经典一区| 伊人伊成久久人综合网小说| 亚洲欧美偷拍视频| 久久蜜桃av一区精品变态类天堂 | 国产成人免费高清| 精品伊人久久大线蕉色首页| 精品一性一色一乱农村| 日韩精品一区二区三区老鸭窝| 看免费黄色录像| 久久99精品久久久| 2025韩国大尺度电影| 亚洲色图综合| 久久艳片www.17c.com| 国产精品久久久久久久久毛片| 成人欧美一区二区三区小说| 亚洲一级片网站| 久久伦理在线| 91综合免费在线| 4438x成人网全国最大| 精品久久久久久综合日本欧美| 欧美日韩免费做爰视频| 成人性生交大片免费看中文| 欧美 日韩 国产在线观看| 欧美人与动xxxxz0oz| 人人澡人人澡人人看欧美| 欧美日韩影视| 欧美日韩一区高清| 日本天堂中文字幕| 99久久综合精品| 波多野结衣家庭教师视频| 精品视频亚洲| 91亚洲va在线va天堂va国| 人交獸av完整版在线观看| 亚洲国产精品小视频| 日本天堂在线视频| 欧美经典一区二区三区| www.日本久久| 国产精品久久久免费| 日韩欧美在线电影| 日韩精品一区二区三区免费视频| 午夜精品99久久免费| 国产无套粉嫩白浆在线2022年 | 欧美在线视频一区| jyzzz在线观看视频| 欧美一级午夜免费电影| 日韩欧美a级片| 国产精品三级av| 亚洲精品激情视频| 日韩电影在线观看网站| 日本黄xxxxxxxxx100| 久久97久久97精品免视看秋霞| 国产福利精品在线| 日本理论片午伦夜理片在线观看| 日韩黄色av网站| 国产精品福利电影| 欧美日韩一二三四五区| 天天色影综合网| 91丨porny丨首页| 欧美激情第一区| 久久午夜精品| 日韩成人三级视频| 日韩在线视屏| 久久99精品久久久久久久青青日本 | 欧美体内谢she精2性欧美| 久久99久久99精品免费看小说| 99re在线视频这里只有精品| 亚洲精品成人在线播放| 久久综合伊人| 奇米影视亚洲色图| 国产精品不卡| 亚欧洲精品在线视频免费观看| 国产精品久av福利在线观看| 成人国产精品久久久| 欧美私密网站| 久久理论片午夜琪琪电影网| 蜜桃视频在线观看www社区 | 精品176二区| 亚洲人午夜精品免费| 六月婷婷中文字幕| 欧美一区二区三区在线视频| 中文字幕 国产| 日韩欧美aⅴ综合网站发布| 精国产品一区二区三区a片| 国产精品国产a级| 国产jk精品白丝av在线观看| 99久久精品免费看国产| 国产精品99久久久精品无码| 狠狠色丁香久久婷婷综合_中| 黄色av免费在线播放| 亚洲资源av| 欧美亚洲一二三区| 亚洲高清久久| 欧美中文字幕在线观看视频| 最新国产精品| 女女同性女同一区二区三区按摩| 日本不卡电影| 亚洲成人蜜桃| 欧美日韩有码| 亚洲综合欧美日韩| 波多野结衣一区| 亚洲v国产v在线观看| 国内精品久久久久久99蜜桃| 欧美精品亚洲精品| 蜜桃精品噜噜噜成人av| 欧美日韩喷水| 欧美精品第一区| 日本一区视频在线观看免费| 精品美女久久| 亚洲精品国产系列| 天天影视天天精品| 潘金莲一级淫片aaaaa免费看| 欧美aa国产视频| 97超碰在线人人| 国产欧美激情| 久久久久久久久久久久久久国产| 久久精品30| www亚洲成人| 国产美女一区二区三区| 视频区 图片区 小说区| 成人国产免费视频| 熟妇高潮精品一区二区三区| 久久久美女艺术照精彩视频福利播放| 最近中文字幕在线mv视频在线 | 国产精品一区在线观看你懂的| 日本中文字幕精品| 97久久精品人人做人人爽50路| 波多野结衣 在线| 国产精品人妖ts系列视频| 国产大片免费看| 亚洲精品乱码久久久久久久久 | 91久久国产综合久久| 伊人22222| 欧美tk丨vk视频| 撸视在线观看免费视频| 久久精品国产成人精品| 国产嫩草在线视频| 国产成人短视频| 国产精品va视频| 九色综合日本| 亚欧美无遮挡hd高清在线视频| 日本福利视频网站| 久久久久久久高潮| 搡的我好爽在线观看免费视频| 不卡高清视频专区| 亚洲不卡的av| 天天色图综合网| 一级做a爰片久久毛片16| 精品国产髙清在线看国产毛片| 你懂得在线网址| 欧美xxxx做受欧美.88| 欧亚av在线| 亚洲一区二区三区xxx视频| 美国一区二区| a级黄色片网站| 欧美亚洲一区| 制服.丝袜.亚洲.中文.综合懂| 久久久不卡网国产精品二区 | 伊人免费在线| 性色av一区二区三区| 99只有精品| 精品伊人久久大线蕉色首页| 中文字幕亚洲精品乱码| 免费日韩视频在线观看| 风间由美性色一区二区三区| 91麻豆制片厂| 欧美天天综合色影久久精品| av免费在线不卡| 一区二区欧美激情| 亚洲风情在线资源| 国产精品久久精品国产| 婷婷综合伊人| 成人性生生活性生交12| 91在线国产观看| 久久综合综合久久| 56国语精品自产拍在线观看| 国产大学生校花援交在线播放 | 亚洲色图av在线| 高清视频在线观看三级| 96久久精品| 99久久这里只有精品| 亚洲三级视频网站| 久久综合资源网| 中文在线观看免费网站| 日韩一区二区中文字幕| 亚洲视频tv| 国产精品678| 亚洲视频分类| 男女超爽视频免费播放| 成人一区二区三区视频在线观看 | 色香蕉成人二区免费| 天天干天天干天天干| 久久久伊人日本| 成人av动漫| 免费网站永久免费观看| 国产成人精品免费一区二区| 永久免费看黄网站| 欧美一区二区女人| 成人欧美在线| 亚洲一区美女视频在线观看免费| 久久影视一区| 激情五月婷婷基地| 亚洲精品免费在线观看| 国产黄色一区二区| 欧美成人小视频| 日韩在线观看一区二区三区| 日本三级中文字幕在线观看| 国产剧情一区二区三区| 老女人性淫交视频| 精品少妇一区二区三区 | 婷婷久久一区| 亚洲五月激情网| 一区二区国产视频| 亚洲乱码精品久久久久..| 久久久久久久久久av| 欧美日韩麻豆| 老熟妇仑乱视频一区二区| 日本一区二区视频在线观看| 亚洲视频在线观看一区二区 | 久久久精品少妇| 欧美一区二区视频观看视频| 青草在线视频在线观看| 国产尤物99| 丝瓜av网站精品一区二区 | 午夜视频在线观看一区| 日韩a在线观看| 国产精品亚洲自拍| 中文在线日韩| 青青草成人免费视频| 欧美午夜精品久久久| 4438x成人网全国最大| 久久久99爱| 捆绑紧缚一区二区三区视频| 欧美xxxx黑人xyx性爽| 亚洲精品国产成人| 国产成人精品一区二区三区视频| 一级黄色录像免费看| 成人高清视频在线| 蜜臀尤物一区二区三区直播| 久久视频在线播放| 欧美一区二区三区红桃小说| 国产wwwxx| 有码一区二区三区| 国产黄色片在线观看| 亚洲伊人第一页| 亚洲在线黄色| 日本黄色片免费观看| 亚洲国产精品va在看黑人| 欧美亚洲人成在线| 少妇人妻在线视频| 亚洲天堂2014| 色综合成人av| 电影午夜精品一区二区三区| 天堂久久久久va久久久久| 亚洲色图综合区| 国产一区二区三区网站| 成人性生交大片免费看中文视频| 国产又大又黄又粗又爽|