node.js vs. deno vs. bun:javascript运行时比较
#javascript #engineering

JavaScript Runtimes可帮助您构建不依赖用户浏览器运行的高级,服务器驱动的JavaScript项目。

有几种可用的跑步选择,而旧的坚定的Node.js的至高无上受到DenoBun的挑战。 DENO是2009年最初创建Node.js,Ryan Dahl的同一开发人员生产的最新项目。DENO旨在通过细粒度的访问控件来提高其安全性,并提供更多的现代功能,例如本机打字稿支持和更好的Web兼容性。

与此同时,BUN是最新的新贵,提供了起泡的速度,并且表现明显优于其竞争对手。但是,它仍然处于测试版中,并且有一些差距需要填补以准备完全生产(目前计划于2023年9月7日)。

让我们正确地查看不同的运行时。

为什么选择合适的JavaScript运行时很重要

JavaScript Runtimes让您在浏览器之外运行应用程序代码。这意味着您可以作为托管应用程序提供站点。或者,您可以选择使用JavaScript Runtimes进行通用脚本。

您选择的运行时将对您的应用程序的性能产生重大影响,并且请求处理和数据库访问速度差异很大。这也影响了开发和可扩展性的易度性。

除了可用的不同功能以及它们如何影响性能之外,开发人员体验也很重要。您的团队的偏好,例如他们在运行时的经验以及他们的实验意愿,都将考虑到哪个运行时间适合您。您喜欢稳定性还是速度?您是否需要使用更丰富的运行时或更自定义的环境的本地打字稿支持?这些只是您在决定运行时可能会问自己的一些示例。了解每个运行时提供的东西可以帮助您做出最受过良好教育的决定。

介绍JavaScript Runtimes

根据它们的性能,稳定性和安全性比较这些运行时间之前,让我们对每个运行时间进行基本概述:

node.js

Node.js是JavaScript Runtimes的统治冠军,并被评为#1 most popular web technology in 2023 by Stack Overflow developers。它是由瑞安·达尔(Ryan Dahl)创建的,并于2009年推出。可以说,它彻底改变了您在进入市场时可以用JavaScript做的事情。有了它,开发人员可以使用JavaScript创建高级后端驱动的应用程序。

今天,有一个庞大的生态系统以node.js为中心,与resources and libraries galore。但是,与任何运行时或技术一样,总有改进的余地。这是Deno和Bun进来在JavaScript运行时景观中添加选项的地方。

不是

Deno是一个基于锈的JavaScript运行时。像node.js一样,它是由瑞安·达尔(Ryan Dahl)创建和推出的,希望改进node.js中提供的内容。您可以在this recorded talk from JSConf EU中看到并听到有关Ryan的动机的更多信息。

其主要重点之一是改进node.js安全。在DENO中,必须明确启用文件,网络和环境访问权限,以便通常从这些领域引起的安全问题较小。它还旨在更好地支持JSX和打字稿,并更加面向Web标准。为了简化部署,它将应用程序作为单一的可执行文件运输。

deno还围绕它具有一个工具生态系统,以使开发人员能够开始他们的项目。 Fresh是为Deno构建的网络框架,Lume是其静态站点生成器。

包子

Bun是最新的运行时,竞争您的注意力。由Zig驱动,其目的是成为一个多合一的运行时间和工具包,专注于速度,捆绑,测试和与Node.js软件包的兼容性。它最大的吸引力之一是其性能明显比Node.js和Deno都要快。如果它可以实现所有这些,这使它成为一个非常有吸引力的命题。

关于其性能,BUN维护者提供了一个示例基准运行HTTP处理程序,该操作器呈现带有React的服务器端页面。这导致了大约68,000 requests per second的Bun处理,而DeNo和Node.js分别为29,000和14,000。这是一个很大的区别。 Jarred Sumner定期将provides updates on the development of Bun以及Twitter上最近的基准测试,因此请务必跟随他保持最新状态。

BUN还包括基于JavaScript和基于打字稿的项目的捆绑和任务运行功能。与Deno类似,它运送了单个二进制文件,并且内置了Web API支持。它还支持一些NPM兼容性的Node.js库。

比较JavaScript Runtimes

现在,让我们更详细地研究差异,重点是绩效,支持和社区,稳定性,安全性和其他功能。

表现

让我们正确地说,bun赢了。我们早些时候了解到它的性能功能,内容涉及每秒可以处理多少个请求,这令人印象深刻。在数据库操作方面,这是一个类似的故事。使用Bun’s benchmark sample加载Northwind database for SQLite时每秒的平均查询如下:

运行时 平均查询/秒
node.js 21.29
deno 43.50
bun 81.37

在node.js,deno和bun之间的another comparison中,bun是处理并发连接最快的。它的每秒要求也很高。例如,有10个并发连接,BUN每秒达到110,000个请求,而Node.js为Deno实现60,000和67,000。这种趋势继续以增加的并发连接以及每个运行时的性能。

虽然有一些用于性能测试的场景中有一些contention on the effectiveness,但BUN仍然是赢家。 Node.js在所有比较中都是最后一次,在数据库速度方面的表现特别差。 deno和node.js通常不太相距太远,而bun远超过了两个。尽管Node.js在这方面落后,但Yagiz Nizipli正在领导努力,以提高Node.js中几个方面的性能。例如improving URL parsing speeds by ~80-90%

fixme未知标签 - contentembedwidget
您还可以在自己的环境中运行BUN性能测试,以查看它们在以下方案中的性能:

bun的速度一直是其开发人员的主要重点,并使用了Safari中发现的JavascriptCore。而deno和node.js使用Chrome中发现的相同的V8 JavaScript引擎。有计划在编译的二进制文件中removing dead code进一步改善面包(这是partially implemented so far)。

以及快速运行,BUN还旨在快速开始 - 目的是在您旋转多个实例时保持表现。这使其成为动态扩展应用程序的理想选择。如果您突然出现流量峰值并需要快速创建实例,则考虑到BUN以使您的服务尽可能快地提供。

支持和社区

这三个项目都是开源的,但并非全部完全得到社区的支持。 Node.js得到了OpenJS基金会的支持,并且严格基于社区和志愿者。 Deno和Bun得到营利性组织和VC支持的项目的支持。

node.js拥有一个已建立的生态系统和庞大的社区,可为您想到的每种用例提供​​在线指导。相比之下,Deno和Bun更为新,因此您找不到太多的支持材料。不过,不乏热情的开发人员愿意分享他们的知识。另外,Deno 1.28 introduced better compatibility with npm packages使得更容易为从Node.js迁移的开发人员采用。

这是一张表格,显示了堆栈溢出上的每个运行时间的标记数量(截至2023年9月):

运行时 标记的问题
node.js 466,762
deno 917
bun 52

您可以看到,node.js具有更多的命中,使您更有可能找到与您有一个问题或您会收到相关答案的现有问题。


每年都有一项开发人员调查称为State of JavaScript。在其中,参与者定期使用的一个问题围绕其中,有近3万名受访者。 2022年最新调查的结果也将Node.js绘制为明确的领导者,Deno的落后方式约为5.3k票,BUN获得了约1.2k票。目前可以预料到这一点,有趣的是,在即将到来的2023年调查结果中,这些数字如何变化。也许我们会看到Deno和Bun的一些新趋势。

official Node.js docs包括各种指南,大量API参考以及有关入门的信息。还有有关其依赖关系的信息。

deno的网站包括一个非常detailed manual,可帮助您熟悉运行时并开始在项目中使用它。它的主页将安装和文档的访问权限放在最前沿,因此新移民不必四处寻找帮助。在标准库中还有一些信息,开发人员可以使用这些信息。第三方模块页面很方便,可以知道生态系统中可用的内容。它包含超过6,000个模块(截至2023年8月),其中包含一些示例代码。

bun的主页链接到其不和谐,文档和github页面。这些文档自首次提供以来,已有显着改善。他们现在拥有一个全面的专用网站,其中包含涵盖各种主题的信息,例如使用Bundler和Test Runner以及API参考。即使现在,它也有guides,它显示了如何用bun完成常见任务。

稳定

作为已建立的播放器,Node.js提供了验证的性能,powering 2.1 percent是世界网站的。这是许多项目依赖的已知数量和产品。如果您确实遇到了问题,那么很可能有人知道如何修复它。

DeNo的1.0版在2020年5月发布,被认为是first stable release。但是,adoption has been slow,也许是因为没有用户认为赢得开发人员而不是集体的区别因素。自从其1.0发行以来,它在改善开发人员的体验的同时,在整个版本中保持稳定性方面取得了长足的进步,因此开发人员可以升级几乎没有影响。”

bun仍处于beta版本0.7.3时,在撰写本文时,但接近其1.0版本,预计将于2023年9月。结果,它的稳定性和node.js core core apis的稳定性和覆盖率增加了自从在Beta上发布以来,很可能会继续继续进行社区中的越来越多的人来在他们的项目中采用它。

安全

在使用NPM的依赖关系管理方面,安全性可能是一个弱点,并且在Node.js上建立更安全的运行时,将扩展到一般的应用程序安全陷阱。围绕着敏感API的细粒度访问控件,例如网络请求,文件系统操作和其他核心功能。 Node.js在这方面不远。 Node.js 20 introduced a permissions model允许与Deno相似的安全方面。

有很多资源可帮助您学习安全实践,例如[Snyk’s Node.js security best practices文章和此OWASP cheat sheet。使开发人员意识到常见错误可以帮助您构建安全的node.js应用程序。

deNo通过要求在运行应用程序中的某些操作中明确权限来关闭Node.js固有的一些安全问题。例如,为了使您的应用程序能够从文件系统访问读取,必须在启动时使用--allow-read标志启动它。您可以在它们的permissions documentation中看到其中的完整列表。您还可以在运行时与此permission system进行交互,这可以使您可以通过编程方式请求和撤销权限。使用--allow-run标志时要小心其子处理,因为产卵子过程没有与DENO流程相同的安全限制,并且可以使DeNo的安全沙盒无效,从而导致特权升级。

bun仍然很新,很难获得有关其安全性的信息。它的相对不成熟意味着您应该谨慎使用它,并密切关注安全补丁的更新和公告。有plans to introduce security audits一旦变得更稳定。

说到跟上安全更新,Snyk可以简化从其依赖于您自己编写的代码的开源依赖项中管理项目的安全性。 Snyk Open Source (SCA)可帮助您在开源依赖项中找到,优先级和修复安全漏洞和许可问题,而Snyk Code (SAST)可以帮助您在几分钟内扫描源代码 - 无需构建并立即解决问题。

附加功能

node.js最近引入了一些功能,以使其更符合Deno和Bun的功能。它现在有一个内置的测试跑者和内置的TypeScript support is under active discussion

deno包括依赖性检查员和代码格式。它将部署到单个可执行文件的能力也是一个加号。使用DENO设置服务器时,文档中描述的基本方法涉及从其他地方提取代码。该代码看起来并不比Node.js复杂得多,但是由于通过URL加载依赖项。

,它会有些不同。

这是the code的剪裁示例:

import { serve } from "https://deno.land/std@0.198.0/http/server.ts";

const handler = async (_request: Request): Promise => {
 const resp = await fetch("https://api.github.com/users/denoland", {
 // The init object here has an headers object containing a
 // header that indicates what type of response we accept.
 // We're not specifying the method field since by default
 // fetch makes a GET request.
 headers: {
 accept: "application/json",
 },
 });

 return new Response(resp.body, {
 status: resp.status,
 headers: {
 "content-type": "application/json",
 },
 });
};

serve(handler);

BUN的其他功能包括转板器和软件包管理器。正如名称所暗示的那样,IT also includes bundling features,为您提供了其他需要其他工具的功能,例如Snowpackrollup.js。它还通过其JavaScript minifier具有删除代码的功能。

如果使用BUN作为任务跑步者,则其速度可能是一个很大的优势。它声称服用~5 milliseconds to start vs. ~25 milliseconds for Node.js。这似乎不是一个重要的差异,但是当您将其与多个任务结合在一起时,您需要随着时间的推移运行,这可能会影响您的开发工作流程。

从node.js迁移到deno或bun

用纯JavaScript或打字稿编写的代码应在任何运行时无缝工作。但是,如果您使用了node.js的特定功能,则可能很难迁移到其他运行时。让我们简要调查

从node.js迁移到deno

过去,Node.js模块兼容性是DENO迁移的主要问题。但是,现在就像将您的导入语句与node:相结合一样简单。至于NPM软件包,您可以将npm:前缀前缀,也可以创建一个描述import mapsdeno.js文件以解决它们。

如果您建立了供社区使用的软件包/库,则可以查看Denoify。这是一个旨在在迁移时自动更改某些文件的项目,并使NPM和deno.land/x的项目更容易。

从node.js迁移到bun

BUN实现了大多数节点API函数。如果您的项目很小或仅使用常见功能,则可以将其直接放入BUN并开始。随着较大的项目,陷入问题的机会更高。这意味着大项目可能会遇到必须重写代码的挑战。

它也有自己的API。例如,BUN使用自己的API服务Web文件。创建安全的Web服务器就像应用以下代码,该代码适用于Bun's documentation

Bun.serve({
  fetch(req) {
    return new Response("Hello!!!");
  },
  tls: {
    key: Bun.file("./key.pem"),
    cert: Bun.file("./cert.pem"),
  }
});

您可以看到迁移到deno或bun时,使用其本机API表示您的代码与node.js中使用的代码会有所不同。在转换现有项目时,也值得牢记的是,如果您遇到node.js中不存在的示例挑战,这可能会导致难以退缩。

哪个项目适合您?

决定使用哪个项目时,应考虑所有较早的功能。您的优先级会根据您的用例和项目需求而有所不同。

面包显然是速度的赢家,但由于它仍然非常新,因此有使用它的风险。它会发展其他两个的稳定性吗?也许。无论哪种方式,如果您是一个不满意通过超越速度竞争来引起波浪的不满,BUN提供了这个机会(在大多数情况下)。

node.js的最大优势是其成熟度和其生态系统的大小。您会发现很多了解它的开发人员。但是,Deno和Bun具有更新的吸引力,这总是引起开发人员的兴奋。

deno 也比Node.js具有很多优势,其功能设置使得开发更加顺畅,并使其易于易于建立高质量的复杂项目。它是安全的,但虽然比Node.js快,但与BUN相比,它的速度较慢。

通常,Node.js仍然是最安全的选择,并具有成功的成功记录。 Deno有很多值得推荐的东西,其现代功能使其成为希望建造新事物的开发人员的理想选择。如果您最关心速度或只想骑新技术的出血边缘,则面包是首选工具。