相比于 Node.js,Deno 和 Bun 到底能带来什么?
Deno
和 Bun
是两个想颠覆 Node.js
的新的 JavaScript 运行时。这两个替代方案凭借其对 JavaScript 服务器开发的创新设计在社区里也收获了不少的人气。但真正的问题是:相比于 Node.js
,它们究竟能带来些什么呢?
JavaScript 引擎
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
Deno
是一个安全、现代且符合标准的 JavaScript 和 TypeScript 运行时,它基于 Rust 构建。
⚙️ Deno
主要特性和特点
-
原生 TypeScript 支持:开发者可以无缝地编写和运行 TypeScript 代码。 -
权限模型:内置系统用于执行细粒度权限,以控制允许脚本执行的操作。 -
Rust:运行时核心用 Rust 编写,这是一种以其可靠性和性能闻名的语言。
👍 优点
-
安全性:默认情况下, Deno
是安全的,这要归功于其权限模型。 -
TypeScript 集成:原生支持 TypeScript,无需额外设置或工具。 -
遵守 Web 标准: Deno
采用现代 JavaScript 特性和标准,目标提供与浏览器相同的 API。
👎 缺点
-
生态系统小:只有几千个第三方 Deno 模块可供使用。 -
迁移困难:由于这两个项目之间的显著差异,将现有的 Node.js
项目迁移到Deno
可能需要做出相当大的改造。
Bun
在 2022 年,Jarred Sumner 公开了一款用 Zig 开发的 JavaScript 运行时 Bun
。Bun
非常快,而且它能够保障与 Node.js
API 的兼容性,代码迁移的成本很低。
⚙️ Bun
主要特性和特点
-
基于 JavaScriptCore
:与之倾向于使用 Google 的 V8 JavaScript 和 Web Assembly 引擎不同,Bun
更依赖于更快更高效的JavaScriptCore
。 -
更多的控制: Zig
是一种低级语言,它为代码执行提供了很好的控制能力。 -
兼容 npm 的包管理器:相比于 npm install
,Bun
安装 npm 包的速度快 20 倍到 100 倍。
👍 优点
-
兼容 Node.js
:Bun
被设计成可以直接适用于现有的Node.js
代码库。 -
性能:执行 JavaScript 比 Node.js
更快,提升高达4倍。 -
Web 标准: Bun
实现了最广泛采用的 Web 标准 API,例如 Fetch API 和 WebSocket API。
👎 缺点
-
使用范围有限:这项技术相对较新,Road Map 里还涉及许多关键特性,而且该工具还没有大的用户群体或生态系统。 -
Zig
知名度:Zig
并不像 JavaScript 或 Rust 那样知名,这可能会影响社区的贡献和支持。
Deno
和 Bun
的主要目的都是允许在浏览器之外执行 JavaScript,尤其是在后端。
实际上,Node.js
并不是第一个支持在服务器端运行 JS 的 JavaScript 运行时。但它是首个在全球范围内被广泛采用的。
Node.js
带有一些众所周知的缺陷。这些问题也间接促成了像 Deno
和 Bun
这样的替代 JavaScript 运行时的发展。
Node.js 的缺陷
性能
Node.js
是单线程的,这意味着它一次只能使用一个 CPU 核心。虽然它被设计用来处理异步 I/O
操作,但在 CPU 密集型任务中可能会导致性能瓶颈。
由于 Deno
基于相同的 JavaScript 引擎,所以性能其实相差不错。主要的区别在于 Rust 的高效率和资源利用能力。这使得 Deno
的速度稍快些,具有比 Node.js
更好的 CPU 和内存利用率。
然而,Bun
把性能放在了它的目标清单的首位。这得益于 Bun
的 JavaScriptCore
引擎和 Zig
编程语言,它的性能显著优于 Deno
和 Node.js
。
TypeScript 支持
Node.js
并不提供原生的 TypeScript
支持。在 Node.js
中使用 TypeScript
,你需要设置编译和执行工具。这个额外的设置步骤也是需要时间的,并且有一定的成本,而且可能产生许多问题。
Deno
和 Bun
都提供了一流的 TypeScript
和 JSX
集成支持。开发者可以无缝地编写和运行 TypeScript
代码。这样,就不需要额外的工具,提供了更好的开发体验。
安全性
Node.js
自身是非常安全的,没有已知的重大漏洞。但是,这不能说适用于数以百万计的开源的 npm
库。主要的问题是,到撰写这篇文章之前,它的权限模型仍然是实验性的。
Deno
优先考虑了安全性,通过其强大的权限系统进行严格的访问控制。例如,必须明确授予脚本访问特定资源的权限。默认情况下,Deno
脚本无法访问文件、网络或环境,这大大降低了未经授权访问的可能性。
相比之下,由于 Bun
提供对 Node.js
的向后兼容性,因此它也继承了所有其安全问题。Bun
对性能的强调可能会导致社区把速度优先于安全性,背后的团队还没有关注到这个缺点。
遵守 Web 标准
Node.js
最初是为服务器端 JavaScript 设计的,所以忽略了大多数浏览器标准。近年来,社区已经在非常努力的解决这个问题,但你在 Node.js
和浏览器上运行相同的 JS 代码时,仍然会遇到兼容性的问题。
Deno
和 Bun
诞生在 Node.js
几年之后,那时 Web 标准已经开始流行。因此,他们从一开始就优先考虑了这些标准的实现。这使得用 Deno
和 Bun
编写的代码更容易被浏览器理解。
Deno 或 Bun 会完全替代 Node.js 吗?
出于下面原因,我认为 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
生态系统中并存。
对此,你怎么看?
最后
参考
-
https://blog.appsignal.com/2023/11/01/what-do-deno-and-bun-bring-to-the-table.html -
https://en.wikipedia.org/wiki/JavaScript_engine -
https://v8.dev/ -
https://developer.apple.com/documentation/javascriptcore -
https://en.wikipedia.org/wiki/Ryan_Dahl -
https://deno.com/ -
https://bun.sh/
往期推荐
最后
欢迎加我微信,拉你进技术群,长期交流学习...
欢迎关注「前端Q」,认真学前端,做个专业的技术人...