相比于 Node.js,Deno 和 Bun 到底能带来什么?

前端Q

共 6124字,需浏览 13分钟

 · 2024-04-11

DenoBun 是两个想颠覆 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 运行时 BunBun 非常快,而且它能够保障与 Node.js API 的兼容性,代码迁移的成本很低。

⚙️ Bun主要特性和特点

  • 基于 JavaScriptCore:与之倾向于使用 Google 的 V8 JavaScript 和 Web Assembly 引擎不同,Bun 更依赖于更快更高效的 JavaScriptCore
  • 更多的控制:Zig 是一种低级语言,它为代码执行提供了很好的控制能力。
  • 兼容 npm 的包管理器:相比于 npm installBun 安装 npm 包的速度快 20 倍到 100 倍。

👍 优点

  • 兼容Node.jsBun 被设计成可以直接适用于现有的 Node.js 代码库。
  • 性能:执行 JavaScript 比Node.js 更快,提升高达4倍。
  • Web 标准:Bun 实现了最广泛采用的 Web 标准 API,例如 Fetch API 和 WebSocket API。

👎 缺点

  • 使用范围有限:这项技术相对较新,Road Map 里还涉及许多关键特性,而且该工具还没有大的用户群体或生态系统。
  • Zig 知名度:Zig 并不像 JavaScript 或 Rust 那样知名,这可能会影响社区的贡献和支持。

DenoBun 的主要目的都是允许在浏览器之外执行 JavaScript,尤其是在后端。

实际上,Node.js 并不是第一个支持在服务器端运行 JS 的 JavaScript 运行时。但它是首个在全球范围内被广泛采用的。

Node.js 带有一些众所周知的缺陷。这些问题也间接促成了像 DenoBun 这样的替代 JavaScript 运行时的发展。

Node.js 的缺陷

性能

Node.js 是单线程的,这意味着它一次只能使用一个 CPU 核心。虽然它被设计用来处理异步 I/O 操作,但在 CPU 密集型任务中可能会导致性能瓶颈。

由于 Deno 基于相同的 JavaScript 引擎,所以性能其实相差不错。主要的区别在于 Rust 的高效率和资源利用能力。这使得 Deno 的速度稍快些,具有比 Node.js 更好的 CPU 和内存利用率。

然而,Bun 把性能放在了它的目标清单的首位。这得益于 BunJavaScriptCore 引擎和 Zig 编程语言,它的性能显著优于 DenoNode.js

TypeScript 支持

Node.js 并不提供原生的 TypeScript 支持。在 Node.js 中使用 TypeScript,你需要设置编译和执行工具。这个额外的设置步骤也是需要时间的,并且有一定的成本,而且可能产生许多问题。

DenoBun 都提供了一流的 TypeScriptJSX 集成支持。开发者可以无缝地编写和运行 TypeScript 代码。这样,就不需要额外的工具,提供了更好的开发体验。

安全性

Node.js 自身是非常安全的,没有已知的重大漏洞。但是,这不能说适用于数以百万计的开源的 npm 库。主要的问题是,到撰写这篇文章之前,它的权限模型仍然是实验性的。

Deno 优先考虑了安全性,通过其强大的权限系统进行严格的访问控制。例如,必须明确授予脚本访问特定资源的权限。默认情况下,Deno 脚本无法访问文件、网络或环境,这大大降低了未经授权访问的可能性。

相比之下,由于 Bun 提供对 Node.js 的向后兼容性,因此它也继承了所有其安全问题。Bun 对性能的强调可能会导致社区把速度优先于安全性,背后的团队还没有关注到这个缺点。

遵守 Web 标准

Node.js 最初是为服务器端 JavaScript 设计的,所以忽略了大多数浏览器标准。近年来,社区已经在非常努力的解决这个问题,但你在 Node.js 和浏览器上运行相同的 JS 代码时,仍然会遇到兼容性的问题。

DenoBun 诞生在 Node.js 几年之后,那时 Web 标准已经开始流行。因此,他们从一开始就优先考虑了这些标准的实现。这使得用 DenoBun 编写的代码更容易被浏览器理解。

Deno 或 Bun 会完全替代 Node.js 吗?

出于下面原因,我认为 DenoBun 并不会完全取代 Node.js

  • 庞大的 npm 生态系统使 Node.jsWeb 开发领域占据了一席之地。
  • 过渡到新技术总是会带来一些迁移挑战。
  • 企业不太可能为了不太成熟的技术而放弃他们在 Node.js 上的投入。
  • 性能和安全性的改进还不足以证明一定需要进行切换。
  • 找到 DenoBun 开发者比找 Node.js 开发者困难得多。
  • 可以肯定的是,Node.js 团队不会坐视 DenoBun 肆无忌惮的侵占市场。他们肯定会从这些竞争对手提供的一些关键特性中汲取灵感,并且持续进行改进。

DenoBun 的目标不应该是与 Node.js 直接展开竞争,而应该是成为特定用例和要求的可行替代方案。例如,Deno 对于安全性至关重要的项目而言具有吸引力。另一方面,Bun 更适合对性能有极高要求的应用。

DenoBun 应被视为 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/

往期推荐


突破项目瓶颈:2024 年 Monorepo 工具选择和实践
SessionStorage 90%的前端都未知的小秘密!
rust 正在全面入侵前端

最后


  • 欢迎加我微信,拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

点个在看支持我吧

浏览 9
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报