查看原文
其他

杀死Node.js!全新JS运行时“快到飞起”!

51CTO技术栈 2023-09-22
编译丨千山
         
正式开始前,我们先简要解释一下什么是JavaScript运行时,以及为什么我们应该关心它的速度。
         
想象一下,你用JavaScript写了一个故事,你需要有人大声读出来。JavaScript运行时就像一个友好的“叙述者”,让你的故事生动起来!它是JavaScript故事被读取和执行的特殊环境。从技术上讲,这个“叙述者”由JavaScript引擎等组件组成,它是运行时的核心,负责理解和运行代码。
         
Bun就是一个全新的JavaScript运行时。9月8日,Bun1.0正式发布,标志着其已经达到了稳定的生产就绪状态。
         
Bun的开发人员说,它被定位为Node.js的直接替代品,旨在消除复杂性和缓慢性,通过消除“层层叠叠的工具层”来简化JavaScript开发。

挑战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的热议都是关于它的速度和易用性

为速度而生,但也不仅是速度

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运行时的进化。”

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运行时,“包管理器、测试运行器和打包器已经被禁用,直到它们变得更稳定为止”。

应该切换到Bun而不是Node.js吗

JavaScript世界中,Bun作为新生代展现出了有趣的一面:有一些Node.js没有的整洁的内置功能,而且速度上也的确很快。如果你正在考虑在你的下一个项目中使用什么,试一下Bun也未尝不可。
         
至于如何在几种JS运行时中取舍,开发人员Shalini Tewari的看法颇具代表性。
         
“Node.js、Bun和Deno都是服务器端js运行时,但它们的目标完全不同。在Bun和Node.js之间的选择取决于你的项目需求。”
         
“如果你需要速度和简单、轻量级的体验,那就选择Bun。如果你想要一个更广泛的生态系统和社区支持,那么Node.js是一个可靠的选择。你甚至可以使用这两种方法使你的JavaScript应用程序强大而高效。”
         
参考链接:
https://medium.com/javascript-in-plain-english/node-js-is-dying-bun-1-0-is-changing-the-javascript-game-2892d4ff6921
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
https://devclass.com/2023/09/11/bun-1-0-javascript-runtime-released-complete-with-experimental-windows-version/

——好文推荐——

TypeScript被放弃!又一知名前端利器决意转回JS,社区不满:这在开倒车!
腾讯交卷了!很争气

         

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存