編譯丨千山
正式開始前,我們先簡要解釋一下什么是JavaScript運行時,以及為什么我們應該關心它的速度。
想象一下,你用JavaScript寫了一個故事,你需要有人大聲讀出來。JavaScript運行時就像一個友好的“敘述者”,讓你的故事生動起來!它是JavaScript故事被讀取和執行的特殊環境。從技術上講,這個“敘述者”由JavaScript引擎等組件組成,它是運行時的核心,負責理解和運行代碼。
Bun就是一個全新的JavaScript運行時。9月8日,Bun1.0正式發布,標志著其已經達到了穩定的生產就緒狀態。
Bun的開發人員說,它被定位為Node.js的直接替代品,旨在消除復雜性和緩慢性,通過消除“層層疊疊的工具層”來簡化JavaScript開發。
1、挑戰Node.js:集運行時、打包工具、測試框架于一體
“Bun是一個用于構建、運行測試和調試JavaScript和TypeScript的完整工具包,從一個小腳本到一個完整的服務器端渲染應用程序,”創建者Jarred Sumner在視頻演示中如是說。
與Node.js不同,Bun使用蘋果的JavaScriptCore引擎,并使用Zig構建。其設計目的是使應用程序更快,而不需要增加代碼的額外復雜性。據Bun團隊介紹,其主要優點在于:
- 當使用Bun時,你不需要node,它有內置的監視模式。Bun使Node.js工具(包括node、npx、nodemon、dotenv或cross-env)變得不必要。
- Bun可以運行不同的文件,如 .js,.ts,.cjs,.mjs,.jsx和 .tsx文件,這些文件可以取代tsc和babel等轉譯器。
- Bun是一個與jest兼容的測試運行器,支持快照測試、代碼覆蓋和模擬。因此你可以編寫單元測試,而無需安裝額外的依賴項。
- Bun也是一個JavaScript打包器,具有“一流”的性能和與esbuild兼容的插件API。
- Bun也是一個與npm兼容的包管理器,擁有yarna和npm所擁有的所有熟悉的命令。
- 既支持EcmaScript模塊,也支持CommonJS模塊系統。
雖然它聲稱的“替代品”一說也受到了開發者質疑,但從上述優點可以看到,Bun的確試圖將運行時、打包工具、測試框架等功能融合在一個工具中,從而解決工具碎片化導致的開發效率低等問題。
不過,Bun正式發布的1.0版本和之前的測試版還是有所不同。開發者Jarred Sumner在Twitter上分享說,發布Bun 1.0版本最困難的事情之一是刪除了作為測試版一部分的前端服務器。
Sumner在上周四發布后的Twitter問答中表示:“我希望我們能有更多的時間讓Bun更適合前端開發。”“這對它來說并不壞——你可以使用你已經使用的工具。但我仍然認為將運行時與前端構建工具直接集成在一起是一個巨大的機遇。”
他指出,用戶的反饋表明,刪除前端服務器沒有問題,社交媒體上對這一消息的大多數反應都是積極的。發布一天后,關于Bun的熱議都是關于它的速度和易用性。
2、為速度而生,但也不僅是速度
Bun最令人稱道的是它的速度。它之所以敢于挑戰Node.js,最大的底氣也來自于這里。
根據發布直播中Bun團隊的介紹,Bun的寫入速度是Node.js的三倍,讀取文件的速度是Node.js的三倍。Bun安裝包的速度比 npm快29倍;在JavaScript測試中,它比Jest快13倍;打包速度比 esbuild 快1.75倍。
Bun所屬的開發公司Oven的產品經理Ashcon Partovi特別提到,Bun可以用Bun run代替任何npm run命令,npm大約需要150毫秒才能在MacBook Pro上開始運行腳本,這與Bun的30毫秒形成了鮮明對比。“Npm感覺明顯滯后。而Bun給人的感覺是瞬間的。”
Bun的競爭對手是Node.js和基于Rust的Deno。軟件工程師詹姆斯·科尼克特意比較了Bun、Node.js和Deno這三種運行時,結果顯示Bun的性能優于后兩者。
“在Zig的支持下,Bun的目標是成為一個一體化的運行時和工具包,重點是速度、打包、測試和與Node.js包的兼容性,”科尼克寫道:“它最大的吸引力之一是它的性能,它明顯比Node.js和Deno都快。”
他指出,Bun維護者提供了一個運行HTTP處理程序的示例基準,該處理程序使用React呈現服務器端頁面。Bun每秒處理大約68000個請求,而Deno和Node.js則分別處理29000和14000個請求。
在他自己對Bun早期版本的測試中,科尼克發現Node.js平均每秒處理21.29次查詢,而Deno的平均每秒處理43.50次。Bun平均每秒處理81.37個查詢。
同時,科尼克還發現,在Node.js, Deno和Bun之間的另一個比較中,Bun是處理并發連接最快的,每秒的請求量也相當高,例如,在10個并發連接的情況下,Bun每秒可以實現11萬個請求,而Node.js每秒可以實現6萬個請求,Deno每秒可以實現6.7萬個請求。
當然,速度并不是運行時要考慮的唯一因素。
開發人員markthree也指出每個運行時都有其優勢:“Bun更關注性能,所以就目前的性能而言,它比其他兩個運行時要好得多。Deno是安全的代名詞,就我來說,我可以安全地使用來自社區的軟件包,而不用擔心它們對我的系統做我不知道的事情。Node現在也開始大力推進性能和安全性。總而言之,競爭是好事,有利于推進JS運行時的進化。”
3、Linux和macOS版本已就緒,Windows版本尚屬“實驗性”
總體來說,很多人對于初出茅廬的Bun還是表示了歡迎。
因為基于Node的開發環境往往涉及不同工具的集合,因此很難管理,而Bun和Deno都簡化了這一點。與Deno相比,Bun更傾向于與Node.js和CommonJS的兼容性,這對許多開發人員來說是一個加分項。
不過,Bun仍有很大的提升空間。比如Bun團隊為macOS和Linux提供了生產就緒的本地版本,但團隊還在努力讓Windows版本正常工作。此次發布會上,Bun面向Windows的版本,被稱為“高度實驗性”。到目前為止,Bun只在Mac、Linux和Windows Subsystem for Linux (WSL)中工作。
根據文檔,Windows版本目前只支持Bun運行時,“包管理器、測試運行器和打包器已經被禁用,直到它們變得更穩定為止”。
4、應該切換到Bun而不是Node.js嗎
JavaScript世界中,Bun作為新生代展現出了有趣的一面:有一些Node.js沒有的整潔的內置功能,而且速度上也的確很快。如果你正在考慮在你的下一個項目中使用什么,試一下Bun也未嘗不可。
至于如何在幾種JS運行時中取舍,開發人員Shalini Tewari的看法頗具代表性。
“Node.js、Bun和Deno都是服務器端js運行時,但它們的目標完全不同。在Bun和Node.js之間的選擇取決于你的項目需求。”
“如果你需要速度和簡單、輕量級的體驗,那就選擇Bun。如果你想要一個更廣泛的生態系統和社區支持,那么Node.js是一個可靠的選擇。你甚至可以使用這兩種方法使你的JavaScript應用程序強大而高效。”
參考鏈接:
https://thenewstack.io/bun-1-0-ships-as-node-js-and-deno-alternative/
https://www.infoworld.com/article/3706293/bun-10-is-out-of-the-oven.html