Deno
和 Bun
是两个想颠覆 Node.js
的新的 JavaScript 运行时。这两个替代方案凭借其对 JavaScript 服务器开发的创新设计在社区里也收获了不少的人气。但真正的问题是:相比于 Node.js
,它们究竟能带来些什么呢?
JavaScript 引擎是一种负责解析 JavaScript,并且将其转换为可执行代码并运行的技术,也是每个浏览器的核心。
在以前,社区主流的有三个 JavaScript 引擎:
V8
:由 Google 开发,用于支持 Chrome 和 Chromium。SpiderMonkey
:由 Mozilla Foundation 维护,用于 Firefox。JavaScriptCore
:由 Apple 创建,用于 WebKit 实现,例如 Safari。在 2009 年,Ryan Dahl 开始研发一个能够使 JavaScript 在浏览器以外运行的 JavaScript 运行时,这个特定的运行时就是 Node.js
,它是基于 V8
构建的。
从那时起,Node.js
就成为了前端和后端开发的首选技术。同时,最初的技术也有一些限制。另外,许多现代的 JavaScript 标准,如 Fetch API 和 ES 模块都还没有得到支持。
然后,Ryan Dahl 决定开始研发一个基于 Rust 的 Node.js 替代方案。在 2018 年,他发布了 Deno
,一个专注于速度、安全性和 TypeScript
支持的 JavaScript 运行时。
Deno
是一个安全、现代且符合标准的 JavaScript 和 TypeScript 运行时,它基于 Rust 构建。
?? Deno
主要特性和特点
? 优点
Deno
是安全的,这要归功于其权限模型。Deno
采用现代 JavaScript 特性和标准,目标提供与浏览器相同的 API。? 缺点
Node.js
项目迁移到 Deno
可能需要做出相当大的改造。在 2022 年,Jarred Sumner 公开了一款用 Zig 开发的 JavaScript 运行时 Bun
。Bun
非常快,而且它能够保障与 Node.js
API 的兼容性,代码迁移的成本很低。
?? Bun
主要特性和特点
JavaScriptCore
:与之倾向于使用 Google 的 V8 JavaScript 和 Web Assembly 引擎不同,Bun
更依赖于更快更高效的 JavaScriptCore
。Zig
是一种低级语言,它为代码执行提供了很好的控制能力。npm install
,Bun
安装 npm 包的速度快 20 倍到 100 倍。? 优点
Node.js
:Bun
被设计成可以直接适用于现有的 Node.js
代码库。Node.js
更快,提升高达4倍。Bun
实现了最广泛采用的 Web 标准 API,例如 Fetch API 和 WebSocket API。? 缺点
Zig
知名度:Zig
并不像 JavaScript 或 Rust 那样知名,这可能会影响社区的贡献和支持。Deno
和 Bun
的主要目的都是允许在浏览器之外执行 JavaScript,尤其是在后端。
实际上,Node.js
并不是第一个支持在服务器端运行 JS 的 JavaScript 运行时。但它是首个在全球范围内被广泛采用的。
Node.js
带有一些众所周知的缺陷。这些问题也间接促成了像 Deno
和 Bun
这样的替代 JavaScript 运行时的发展。
Node.js
是单线程的,这意味着它一次只能使用一个 CPU 核心。虽然它被设计用来处理异步 I/O
操作,但在 CPU 密集型任务中可能会导致性能瓶颈。
由于 Deno
基于相同的 JavaScript 引擎,所以性能其实相差不错。主要的区别在于 Rust 的高效率和资源利用能力。这使得 Deno
的速度稍快些,具有比 Node.js
更好的 CPU 和内存利用率。
然而,Bun
把性能放在了它的目标清单的首位。这得益于 Bun
的 JavaScriptCore
引擎和 Zig
编程语言,它的性能显著优于 Deno
和 Node.js
。
Node.js
并不提供原生的 TypeScript
支持。在 Node.js
中使用 TypeScript
,你需要设置编译和执行工具。这个额外的设置步骤也是需要时间的,并且有一定的成本,而且可能产生许多问题。
Deno
和 Bun
都提供了一流的 TypeScript
和 JSX
集成支持。开发者可以无缝地编写和运行 TypeScript
代码。这样,就不需要额外的工具,提供了更好的开发体验。
Node.js
自身是非常安全的,没有已知的重大漏洞。但是,这不能说适用于数以百万计的开源的 npm
库。主要的问题是,到撰写这篇文章之前,它的权限模型仍然是实验性的。
Deno
优先考虑了安全性,通过其强大的权限系统进行严格的访问控制。例如,必须明确授予脚本访问特定资源的权限。默认情况下,Deno
脚本无法访问文件、网络或环境,这大大降低了未经授权访问的可能性。
相比之下,由于 Bun
提供对 Node.js
的向后兼容性,因此它也继承了所有其安全问题。Bun
对性能的强调可能会导致社区把速度优先于安全性,背后的团队还没有关注到这个缺点。
Node.js
最初是为服务器端 JavaScript 设计的,所以忽略了大多数浏览器标准。近年来,社区已经在非常努力的解决这个问题,但你在 Node.js
和浏览器上运行相同的 JS 代码时,仍然会遇到兼容性的问题。
Deno
和 Bun
诞生在 Node.js
几年之后,那时 Web 标准已经开始流行。因此,他们从一开始就优先考虑了这些标准的实现。这使得用 Deno
和 Bun
编写的代码更容易被浏览器理解。
出于下面原因,我认为 Deno
和 Bun
并不会完全取代 Node.js
:
npm
生态系统使 Node.js
在 Web
开发领域占据了一席之地。Node.js
上的投入。Deno
和 Bun
开发者比找 Node.js
开发者困难得多。Node.js
团队不会坐视 Deno
和 Bun
肆无忌惮的侵占市场。他们肯定会从这些竞争对手提供的一些关键特性中汲取灵感,并且持续进行改进。Deno
和 Bun
的目标不应该是与 Node.js
直接展开竞争,而应该是成为特定用例和要求的可行替代方案。例如,Deno
对于安全性至关重要的项目而言具有吸引力。另一方面,Bun 更适合对性能有极高要求的应用。
Deno
和 Bun
应被视为 Node.js
的补充解决方案,可以在更广泛的 JavaScript
生态系统中并存。
对此,你怎么看?
参考