JS三大运行时全面对比:Node.js vs Bun vs Deno

这篇具有很好参考价值的文章主要介绍了JS三大运行时全面对比:Node.js vs Bun vs Deno。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

全文约 5100 字,预计阅读需要 15 分钟。

JavaScript 运行时是指执行 JavaScript 代码的环境。目前,JavaScript 生态中有三大运行时:Node.js、Bun、Deno。老牌运行时 Node.js 的霸主地位正受到 Deno 和 Bun 的挑战,下面就来看看这三个 JS 运行时有什么区别!

JS 运行时概述

Node.js

Node.js 在 2023 年被 Stack Overflow 开发者评为最受欢迎的 Web 技术。Node.js 于 2009 年推出,允许开发人员在浏览器之外使用 JavaScript,彻底改变了服务端编程。它拥有强大的生态系统、庞大的社区,并且经过验证且稳定。为大型应用程序提供 LTS 构建。基于 V8 JavaScript 引擎构建。

多年来,Node.js 一直是服务端 JavaScript 开发的支柱,通过第三方工具支持了无数功能。其提供了巨大的功能和灵活性。丰富的文档、教程和社区支持使开发者可以更轻松地克服挑战。如果考虑内置工具和与 Web API 的兼容性,它是落后于其他两个运行时的。

从历史上看,Node.js 因其安全方法(尤其是在包方面)而受到批评。然而,社区和维护者已经显着改善了这一方面。权限模型已经在 Node.js v20 中实现,这使 Node.js 更加安全。

Deno

Deno 最初由 Node.js 的原始创建者 Ryan Dahl 于 2018 年创建,旨在解决他认为 Node.js 中存在的一些问题,比如性能、安全性。它专注于安全性、现代 JavaScript 实践和开发人员体验。基于 V8 JavaScript 引擎构建并用 Rust 编写。

与 Node.js 相比,Deno 具有更全面的功能。它对 Web API 和现代标准有很好的支持,并且还支持大多数 NPM 包。Deno 还提供了出色的开发体验,特别是如果使用 TypeScript,它是开箱即用的。Deno 还具有内置 linting、代码格式化程序等优势,节省一些配置和引导时间。如果你倾向于开箱即用的设置,只需启动编辑器,创建一个main.ts文件,然后就可以开始快乐编码了!

Bun

Bun 是 2021 年发布的 JavaScript 运行时,它被设计为 Node.js 的更快、更精简、更现代的替代品。它构建在 JavaScript Core 和 Zig 之上。旨在成为一个全功能的运行时环境和工具包,重点关注速度、打包、测试和与 Node.js 包的兼容性。最大的优势之一是它的性能。事实证明,Bun 比 Node.js 和 Deno 都要快。如果 Bun 能够完成这些目标,那么它将成为一个非常有吸引力的选择。

Bun 的核心卖点是它的性能,其提供了许多基准测试,显示出令人惊叹的速度。使用 Bun 作为包管理器比使用标准 NPM 命令要快得多。在现实应用中,尤其是 Web 应用,性能差异可能不像基准测试中那么显着。

Bun 优先考虑简单性和速度。凭借其内置的包管理器,以及与 Node.js 相比改进的开发体验,开发人员可以快速入门,而无需遇到其他运行时可能带来的初始设置障碍。

功能对比

首先来看看这三个运行时的功能对比,图示如下:

  • ✅:内置,指本身提供的功能或特性,无需额外安装或引入其他库或框架。

  • 📦:通过第三方提供的库、框架或工具支持。

  • ❌:不可用。

  • 💡:实验特性。

运行时特性

特性 Deno Bun Node.js
升级工具
单个可执行文件安装
LSP
REPL 📦
编译器
持久存储驱动程序
  • 升级工具:更新和管理项目所依赖的软件包和库。

  • 单个可执行文件安装:将所有程序文件和依赖项打包成一个单独的可执行文件,以便用户可以简单地通过运行该文件进行安装和部署。

  • LSP(Language Server Protocol,语言服务器协议):一种用于提供代码编辑器功能的通信协议。它使得编辑器可以与语言服务器进行交互,从而获得代码补全、跳转到定义、重构等功能。

  • REPL(Read-Eval-Print Loop,读取-求值-输出循环):一种交互式编程环境,在其中可以逐行输入代码,并立即执行并输出结果。REPL 通常用于快速测试和验证代码,无需编译和构建过程。

  • 编译器:是一种将高级编程语言源代码转换为低级机器代码或字节码的工具。编译器将代码进行词法分析、语法分析和转换等处理,最终生成可执行文件或中间代码,以供计算机执行。

  • 持久存储驱动程序:一种软件组件或接口,用于与持久化存储介质进行交互和管理数据的读取和写入操作。它提供了对持久化数据的访问和操作的接口。

测试

特性 Deno Bun Node.js
基准测试运行器 💡 💡
测试运行器
  • 基准测试运行器:用于运行基准测试的工具或框架。基准测试用于评估代码的性能和效率,通常通过执行一系列测试用例并测量其执行时间来进行。

  • 测试运行器:用于管理和运行测试套件的工具或框架。它可以自动化执行单元测试、集成测试或端到端测试,并提供结果报告和日志记录等功能。

操作系统/平台支持

特性 Deno Bun Node.js
Linux
Mac OS
Windows 💡
ARM64 💡 💡

包管理器

特性 Deno Bun Node.js
package.json 兼容性
NPM 取消选择
内置包管理器 📦 📦
URL 引入
  • package.json 兼容性:指项目中的 package.json 文件与特定工具、平台或环境的兼容性。package.json 是用于描述和管理项目依赖和配置的文件。

  • NPM 取消选择:在使用 NPM 作为包管理器时,选择不使用某个特定的功能或设置。这可能是根据项目需求或个人偏好,有意选择不采用某种功能或行为。

  • 内置包管理器:集成在特定开发环境或平台中的默认包管理器。这个包管理器通常提供了一套工具和命令,用于下载、安装、更新和管理项目的依赖项。

  • URL 引入:通过提供远程资源的 URL 地址来导入模块或库的功能。使用 URL Imports 可以从远程位置直接引入代码或资源,而无需事先下载和安装。

Web API 兼容性

特性 Deno Bun Node.js
Fetch
Web Crypto
Web Storage
WebSocket 📦
Web Workers
Import Maps
  • Fetch(Fetch):一种用于发起网络请求的现代 JavaScript API。它提供了一种更简洁和强大的方式来进行数据请求和响应处理,取代了传统的 XMLHttpRequest 方法。

  • Web Crypto(Web 加密):一组用于在 Web 浏览器中执行加密操作的 API。它提供了一种安全的方式来处理密码学操作,例如生成随机数、进行加密和解密等。

  • Web Storage(Web 存储):用于在客户端浏览器中存储和检索数据的 API。它提供了本地存储和会话存储两种机制,分别用于长期保持数据和临时存储数据。

  • WebSocket:一种在客户端和服务器之间实现双向通信的协议。通过 WebSocket,可以建立持久性的连接,并实现实时数据传输和交互。

  • Web Workers:一种在浏览器中使用多线程进行并行计算的机制。Web Workers 允许在后台运行脚本,以避免主线程的阻塞,并提高 Web 应用的响应性能。

  • Import Maps(导入映射):一种在 JavaScript 模块加载器中配置模块路径和别名的功能。导入映射可以简化模块导入的过程,并提供更灵活的方式来管理模块依赖。

安全性

特性 Deno Bun Node.js
权限模型
可信赖的依赖项
  • 权限模型:应用中用于管理用户或应用对资源和功能的访问权限的系统。权限模型定义了不同级别的权限和许可规则,并确保只有被授权的实体才能执行特定操作。

  • 可信赖的依赖项:开发中使用的第三方库或模块,已经得到验证和认可,可以放心地被项目所使用。可信赖的依赖项通常具有良好的安全性、稳定性和质量保证。

开发工具

特性 Deno Bun Node.js
代码格式化工具 📦 📦
静态代码分析工具 📦 📦
类型检查工具 📦 📦
代码压缩工具 📦 📦
代码打包工具 📦
依赖项查看器 📦 📦
  • 代码格式化工具:用于自动调整代码的格式,例如缩进、空格和换行符等。通过使用代码格式化工具,可以统一代码样式,提高代码的可读性和一致性。

  • 静态代码分析工具:用于检查源代码中的潜在问题、错误或不良实践。静态代码分析器会对代码进行扫描,并给出相应的提示或警告,帮助开发人员发现并修复问题。

  • 类型检查工具:用于静态检查编程语言中的类型错误。通过类型检查工具,可以在编译或运行前捕获到类型相关的错误,从而提高代码质量和可靠性。

  • 代码压缩工具:用于减小源代码文件的大小。代码压缩工具通常会移除源代码中的空白字符、注释和不必要的字符,从而降低文件大小,并提高加载速度。

  • 代码打包工具:用于将多个模块或文件打包成一个或多个最终部署的文件。通过使用代码打包工具,可以减少网络请求次数,提高前端应用的性能和加载速度。

  • 依赖项查看器:用于查看项目或应用中的各个依赖项之间的关系和依赖情况。依赖项查看器可以帮助开发人员了解项目的依赖结构,以便更好地管理和维护依赖关系。

语言支持

特性 Deno Bun Node.js
TypeScript / TSX 📦

性能对比

接下来看看这三个运行时的网络性能比较。重点关注:静态文件传递、JSON 响应和计算密集型任务(素数计算)。

  • 静态文件传递:提供静态资源服务,将服务器上指定目录中的静态文件传递给客户端。

  • JSON 响应:接收客户端请求,生成包含 JSON 数据的响应并返回给客户端。

  • 计算密集型任务:接收客户端传来的数值,执行大量的 CPU 计算操作来判断该数是否为质数,并将结果返回给客户端。

为了进行准确的比较,构建了一个自定义的基准测试工具,并使用 Express.js 作为服务端平台。Express.js 是一个很好的选择,因为可以在所有三种运行时中使用完全相同的服务端脚本。源代码可以在 GitHub 上找到:jsrbench。为了对服务端添加负载,这里使用了 Siege,这是一个经过试验和测试的网络服务器基准测试实用工具。

下面是用于基准测试的服务端脚本:

import express from "express";



const app = express();



// 使用 BigInt 进行修改,并移除 NaN/Infinity 检查

const checkPrime = function (n) {

  if (n % 1n || n < 2n) return 0;

  if (n == leastFactor(n)) return 1;

  return 0;

};



const leastFactor = function (n) {

  if (n == 0n) return 0;

  if (n % 1n || n * n < 2n) return 1;

  if (n % 2n == 0) return 2;

  if (n % 3n == 0) return 3;

  if (n % 5n == 0) return 5;

  for (let i = 7n; i * i <= n; i += 30n) {

    if (n % i == 0n) return i;

    if (n % (i + 4n) == 0) return i + 4n;

    if (n % (i + 6n) == 0) return i + 6n;

    if (n % (i + 10n) == 0) return i + 10n;

    if (n % (i + 12n) == 0) return i + 12n;

    if (n % (i + 16n) == 0) return i + 16n;

    if (n % (i + 22n) == 0) return i + 22n;

    if (n % (i + 24n) == 0) return i + 24n;

  }

  return n;

};



// 静态资源中间件

app.use("/static", express.static("public"));



// JSON 响应

app.get("/json", (req, res) => {

  res.json({

    message: "Hello, World!",

    number: 5,

    literal: `(${4}+${4})*${21.2}/${2}=${84.8}`,

  });

});



// 模拟 CPU 密集型操作

app.get("/compute-prime", (_req, res) => {

  const toCheck = 263n;

  if (checkPrime(263n)) {

    res.send(`Prime number ${toCheck} is a prime!`);

  } else {

    res.send(`Prime number ${toCheck} is not a prime!`);

  }

});



// 将端点收集到数组中

const endpoints = ["/static/index.html", "/json", "/compute-prime"];



// 通过提供 '0' 自动分配端口

const server = app.listen(0, () => {

  const fullEndpoints = endpoints.map(

    (endpoint) => `http://127.0.0.1:${server.address().port}${endpoint}`,

  );

  console.log(JSON.stringify({

    BENCHMARKABLE_ENDPOINTS: fullEndpoints,

  }));

});

10 个并发用户(每秒请求数)

路径 Node.js Deno Bun
静态文件传递 1712.37 1761.87 2559.35
JSON 响应 2223.57 2772.39 4138.38
计算密集型任务 2377.44 3480.13 4321.48

100 个并发用户(每秒请求数)

路径 Node.js Deno Bun
静态文件传递 2153.87 2571.72 3468.01
JSON 响应 2344.44 3468.01 4555.89
计算密集型任务 2286.53 3609.09 4341.41

根据给定的条件和具体的基准测试运行结果:

  • Deno 比 Node.js 快大约 33%。

  • Bun 比 Node.js 快大约 73%。

Bun 官方也给出了一个基准测试的数据:

  • React 服务端渲染(每秒 HTTP 请求数 (Linux x64)):
  • WebSocket 聊天服务器(每秒发送的消息数(Linux x64,32 个客户端)):
  • 加载一个巨大的表(每秒平均查询次数)

可以看到, Bun 是 Deno 的速度两倍,是 Node.js 速度的四倍。

支持和社区

这三个运行时都是开源的,但并非所有项目都完全得到社区的支持。Node.js 由 OpenJS 基金会支持,并且严格以社区和志愿者为基础。Deno 和 Bun 得到了营利性组织和风险投资支持的项目的支持。

Node.js 有一个成熟的生态系统和庞大的社区。相比之下,Deno 和 Bun 则较为新颖,遇到问题时可能解决难度更大,但仍然有很多热情的开发者愿意分享相关知识。此外,Deno 1.28 引入了更好的与 npm 包兼容性,使得从 Node.js 迁移过来的开发者更容易接受。

下面是 Stack Overflow 上每个运行时标记的问题的数量(截至 2023 年 9 月):

运行时 问题数量
Node.js 466762
Deno 917
Bun 52

如你所见,Node.js 相关的问题最多,这也意味着当遇到问题时,更容易得到解决方案。

在 2022 年 State of JavaScript 调查中,有一个问题是关于参与者经常使用哪种运行时,有将近 30000 名受访者回答了这个问题。调查结果显示, Node.js 遥遥领先,Deno 得票数约为 5300,Bun 得票数约为 1200。也许我们会在 2023 年看到 Deno 和 Bun 出现一些新的趋势。

官方的 Node.js 文档包括各种指南、大量的 API 参考和入门信息。还提供了有关其依赖关系的信息。

Deno 的网站包括一个非常详细的手册,帮助你熟悉运行时并在项目中开始使用它。第三方模块页面很方便,可以了解生态系统中可用的内容。截至 2023 年 8 月,它包含了超过 6000 个模块,并提供一些示例代码。

Bun 的主页链接到了其 Discord、文档和 GitHub 页面。自从它发布以来,文档已经显著改善。现在官方文档中包含了各种主题的信息,例如入门指南、使用打包器和测试运行器以及 API 参考,甚至还有指南展示如何使用 Bun 完成常见任务。

从 Node.js 迁移到 Deno 或 Bun

用纯 JavaScript 或 TypeScript 编写的代码应该可以在任何运行时无缝运行。但是,如果使用过 Node.js 的特定功能,那么迁移到其他运行时可能会比较困难。

从 Node.js 迁移到 Deno

过去,Node.js 模块的兼容性是 Deno 迁移中的一个主要问题。不过,现在只需在导入语句前加上node:前缀即可。至于 npm 包,可以在它们前面加上npm:前缀,或者创建一个deno.js文件,描述 import maps[1] 以供 Deno 解析它们。

如果正在构建软件包/库,可以查看 Denoify[2]。这是一个旨在在迁移时自动更改某些文件,并使项目维护更加容易,适用于 npm 和 deno.land/x[3] 的项目。

从 Node.js 迁移到 Bun

Bun 实现了大多数 Node-API 函数。如果项目较小或仅使用常见函数,可能可以直接将其放入 Bun 中并开始使用。对于大型项目,可能需要重写代码来解决挑战。

Bun 还具有自己的 API。例如,Bun 使用自己的 API 来提供 Web 文件服务。

Bun.serve({

  fetch(req) {

    return new Response("Hello!!!");

  },

  tls: {

    key: Bun.file("./key.pem"),

    cert: Bun.file("./cert.pem"),

  }

});

可以看到,在迁移到 Deno 或 Bun 时,使用它们的原生 API 就意味着代码与在 Node.j s 中使用的代码有所不同。这是在转换现有项目时需要牢记的重要事项,同时在开始新项目时也要考虑到,因为如果遇到在 Node.js 中不存在的且难以解决的问题,可能会难以回退到 Node.js。

总结

Bun 显然是速度上的赢家,并且在功能上带来了很多创新。但由于它仍然很新,所以使用它存在风险。

Node.js 的一大优势在于其成熟度和生态系统的规模。其仍然是目前最安全的选择,并久经考验。

与 Node.js 相比, Deno 还具有很多优势,其强大的功能使开发更加顺畅,并且可以轻松构建高质量的复杂项目。它很安全,虽然比 Node.js 更快,但与 Bun 相比,它还是有点慢的。

总的来说,Node.js 仍然是目前最好的选择,Deno 具有很多现代化的功能,值得尝试。如果最关心速度或只是想了解新技术的前沿,那么 Bun 就是你的首选工具。

[1]import maps: https://deno.land/manual@v1.36.1/basics/import_maps

[2]Denoify: https://github.com/garronej/denoify

[3]deno.land/x: https://deno.land/x

往期推荐

VS Code 中使用Git实践,学会了效率翻倍!

微软最热门的10款前端开源项目!

JavaScript 终于原生支持数组分组了!

Next.js 13.5 正式发布,速度大幅提升!

多图预警,前端应该掌握的浏览器调试技巧大揭秘!

竟然可以在一个项目中混用 Vue 和 React?

图解 60 个 CSS 选择器,一网打尽!
JS三大运行时全面对比:Node.js vs Bun vs Deno文章来源地址https://www.toymoban.com/news/detail-710191.html

到了这里,关于JS三大运行时全面对比:Node.js vs Bun vs Deno的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Bun1.0】使用 Bun.js 构建快速、可靠和安全的 JavaScript 应用程序

    Bun 是一个现代的JavaScript运行环境,如Node, Deno。主要特性如下: 启动速度快。更高的性能。完整的工具(打包器、转码器、包管理)。 https://bun.sh 与传统的 Node.js 不同,Bun.js 提供了一些新的特性和功能,例如: 更快的启动速度、更小的内存占用、更好的异常处理机制等等。

    2024年02月09日
    浏览(40)
  • 「NodeJs进阶」超全面的 Node.js 性能优化相关知识梳理

    相信对于前端同学而言,我们去开发一个自己的简单后端程序可以借助很多的nodeJs的框架去进行快速搭建,但是从前端面向后端之后,我们会在很多方面会稍显的有些陌生,比如「性能分析」,「性能测试」,「内存管理」,「内存查看」,「使用C++插件」,「子进程」,「

    2024年02月01日
    浏览(54)
  • 【笔记】Pycharm配置Node.js运行js代码

    最近在学习关于 Js逆向 的知识,需要在PyCharm中运行Js程序,记录一下配置过程。 Node.js中文网 选择自己电脑对应的安装包下载暗转即可 安装好软件后,配置node.js环境变量。 完成安装和环境配置后,打开cmd测试是否安装成功。 开发环境 Win 10(64位) PyCharm专业版(已汉化)

    2024年02月13日
    浏览(49)
  • 在pycharm中运行js文件,附加node.js下载步骤

    当我在运行pycharm中运行js文件时突然发现我还没有安装node.js 所以需要进行两步操作 安装本地node.js 在pycharm安装node.js插件 点击进入node.js官网进行下载 https://nodejs.cn/download/ 根据自己的电脑配置选择适合自己电脑的即可~ 双击安装包,点击next 同意条款,点击next 自定义安装位

    2024年02月07日
    浏览(48)
  • Node.js概述与安装和运行

    一、介绍 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它使开发者能够在服务器端运行 JavaScript 代码。Node.js 的出现使得 JavaScript 不再仅限于浏览器端的脚本语言,而是能够成为一种通用的编程语言,可以用于开发各种类型的应用程序,包括Web 服务器、命令行工具、桌面

    2024年03月09日
    浏览(36)
  • Node.js -- JavaScript的运行环境

    HTML : 骨架 CSS :外观 JS : 灵魂 JavaScript可以在浏览器中被执行的原因是浏览器里面都有一个JavaScript的解析引擎 浏览器 解析引擎 Chrome V8 Firefox OdinMonkey (奥丁猴) Safri JSCore IE Chakra(查克拉) 每个浏览器都内置了DOM、BOM这样的API函数。 V8引擎负责解析和执行JavaScript代码 内置

    2023年04月10日
    浏览(38)
  • PM2 vs Kubernetes:在部署 Node.js 服务时使用哪个?

    Node.js 已成为 Web 开发中的热门技术之一,但如果我们想成功地将 Node.js 应用程序交付给用户,我们需要考虑部署和管理这些应用程序。两个常见的选项是 PM2 和 Kubernetes。PM2 是一个用于运行和管理 Node.js 应用程序的进程管理器,它能够创建不间断运行的 Node.js 应用程序,并确

    2024年02月06日
    浏览(43)
  • 运行 Node.js 与浏览器 JavaScript

    浏览器和 Node.js 都使用 JavaScript 软件语言 - 但字面上的 运行时环境 是不同的。 Node.js(又名服务器端 JavaScript)与客户端 JavaScript 有许多相似之处。它也有很多差异。 尽管两者都使用 JavaScript 作为软件语言,但我们可以重点关注一些关键差异,这些差异使两者之间的软件开发

    2024年02月09日
    浏览(54)
  • 前后端交互系统:在Node.js中运行JavaScript

    在Node.js中运行JavaScript,您需要编写适用于服务器端的代码,而不是浏览器端的代码。以下是一些示例代码,用于在Node.js中创建一个简单的HTTP服务器并在浏览器中访问它: 将上述代码保存到一个名为main.js的文件中,然后在命令行中运行 node .main.js。这将创建一个简单的HTT

    2024年02月08日
    浏览(45)
  • 即将发布的 Kibana 版本可运行 Node.js 18

    作者:Thomas Watson Kibana 构建在 Node.js 框架之上。 为了确保每个 Kibana 版本的稳定性和使用寿命,我们始终将捆绑的 Node.js 二进制文件保持为最新的最新长期支持 (LTS) 版本。 当 Node.js 版本 18 升级到 LTS 时,我们开始将 Kibana 升级到这个主要版本的工作。   我们很快发现 Node.j

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包