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


2011-09-09 14:23:13




