杀死 Node.js!全新 JS 运行时“快到飞起”!
正式开始前,我们先简要解释一下什么是 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 应用程序强大而高效。”
版权声明: 本文为 InfoQ 作者【高端章鱼哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/16a1d9b9e2e2876fc94ca4a74】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论