2024 年应该使用 Bun、Node.js 还是 Deno

news2024/11/26 0:49:05

2024 年应该使用 Bun、Node.js 还是 Deno

到 2024 年,构建基于 JavaScript 的现代 API 相对简单。我们可以使用Express.js等库并在几分钟内启动可用的 API。但是,现在最具挑战性的部分是选择正确的 JavaScript 引擎。

目前主流的三个运行时是:

  • Node.js
  • deno
  • bun

那么,我们应该为下一个大型 JavaScript 项目选择什么?重要的是要了解每个运行时都有优点和缺点。因此,本文通过比较 BunNode.jsDeno 的优点、缺陷等来探讨它们!

Node.js

在这里插入图片描述
Node.js 是用于服务器端开发的最广泛使用的 JavaScript 运行时。

它运行在 Google ChromeJavaScript V8 引擎之上,确保闪电般快速且高度可靠的性能。Node.js 最有益的方面之一是事件循环。

事件循环允许我们在单个线程上运行整个应用程序,而不会遇到任何阻塞。它能够智能地将异步阻塞操作转移到第三方库 — libuv上,该库执行所有异步 I/O 操作,并让 Node.js 主线程在调用堆栈空闲时处理回调。此外,通过引入工作线程,开发人员现在能够启动独立的 JavaScript 运行时并模拟多线程和并行处理。

Node.js 用于 API 开发的优点:

  • 高可扩展性和性能:Node.js 通过非阻塞 I/O 和可扩展性提供更高的性能,并由事件驱动架构支持,使其非常适合用户群不断增长的实时数据密集型应用程序。
  • 拥有众多库和框架的成熟生态系统:Node.js 拥有一个充满活力的生态系统,拥有丰富的库和框架,为开发人员提供了一个全面的工具包,可以跨 Web 开发和实时应用程序进行高效编码。
  • 大型且活跃的社区支持:Node.js 拥有一个充满活力且充满活力的社区,可以转化为定期更新和改进以及广泛发布的模块,开发人员可以轻松地将这些模块合并到他们的项目中。

Node.js 用于 API 开发的缺点:

  • 由于单线程性质而导致的性能限制:由于 Node.js 是单线程的,因此它不适合繁重的计算或需要 CPU 密集型的任务。不过通过引入worker线程后,Node.js 能够执行 CPU 密集型操作,而不会遇到性能问题。
  • 异步编程中的回调地狱:回调地狱是指 Node.js 中的异步函数彼此嵌套得如此之深,以至于代码变得复杂且混乱。不过可以通过使用 Promisesasync/await等解决方案来避免这种情况。

deno

在这里插入图片描述
Deno 是一种新兴的 JavaScriptTypeScript 运行时,致力于解决 Node.js 的某些缺点。

Deno 默认优先考虑安全性。

这可确保我们的代码在没有适当许可的情况下无法访问文件或网络。它运行在 JavaScript V8 引擎之上,并使用Rust进行设计,这意味着它的速度快如闪电!

此外,Deno 还通过合并内置实用程序(例如用于网络的 fetch)来采用当前的 Web 标准,与浏览器处理 JavaScript 的方式保持一致,并提供更具凝聚力的编码体验。

Deno 用于 API 开发的优点:

  • 内置安全性:Deno 在安全的沙箱环境中运行,需要明确的权限才能访问文件系统、网络和环境,从而降低漏洞风险。
  • 改进的开发人员体验:Deno 通过依赖项检查器和代码格式化等内置工具增强了开发人员工作流程,并提供原生 TypeScript 支持,使开发人员能够专注于编码而不是配置。
  • 使用 URL 简化模块管理:Deno 通过利用 URL 直接从 Web 获取依赖项(无需包管理器)来简化模块管理,从而简化代码库中的模块解析。

Deno 用于 API 开发的缺点:

  • 不如 Node.js 生态系统成熟:Deno 作为 Node.js 的更新替代品,正在开发其生态系统,预计通过社区贡献实现增长。与 Node 强大的生态系统相比,开发人员目前看到的现成解决方案可能更少。
  • 第三方库的可用性有限:虽然 Deno 正在不断发展,但其第三方库的选择并不像 Node.js 的宝库那么广泛。开发人员可能会发现自己处于前沿,有时需要利用可用资源发挥创意,甚至需要自己制作资源。

bun

在这里插入图片描述
Bun 是几个月前推出的一个新兴的运行时和工具包。

Bun 是一个快速、一体化的工具包,用于运行、构建、测试和调试 JavaScriptTypeScript,从单个文件到全栈应用程序。

而且,有了 Bun,我们所要做的就是立即开始使用。例如,我们不再需要安装诸如nodemondot-env之类的工具,因为 Bun 能够开箱即用地在开发人员模式下热重载,同时在默认情况下也会处理.env文件。

此外,它还提供内置的 websocket 服务器,并使用自己的包管理器 - bunx(比 NPM 快五倍)。但是,这还不是全部。Bun 不仅仅是一个 JavaScript 运行时。它是一个一体化工具包。这意味着它提供:

  • 打包
  • 包管理
  • 测试

因此,我们无需花费时间配置项目,也无需维护复杂的样板项目。相反,我们可以启动一个 Bun 项目并立即开始!

使用 Bun.js 进行 API 开发的优点:

  • 简单的学习曲线:Bun 是一个一体化工具包!这意味着我们不必花时间学习模块捆绑、配置测试框架。它默认执行此操作。这样我们就可以更快地开始!
  • 更高的性能: Bun 使用 JavaScriptCore 引擎,而 Node.jsDeno 等运行时则使用 JavaScript V8 引擎。JavaScriptCore 引擎已针对更快的启动时间进行了优化,并且通常比两个运行时的性能更高。

使用 Bun.js 或 Bun Router 进行 API 开发的缺点:

  • 社区支持较少:Bun 于几个月前推出。因此,它仍然没有一个成熟的问题社区。因此,如果我们严重依赖社区支持,则可能需要在继续之前检查是否有正确的支持。

Node.js、Deno 还是 Bun 哪个更好

性能对比

让我们来测试一下 BunDenoNodejs

我们将用 JavaScript 编写一些需要大量内存的数学代码来处理大数据集。

考虑复杂的计算和大量的计算。

一个典型的例子是矩阵运算。这是一个矩阵乘法函数的示例:

function generateRandomMatrix(rows, cols) {
  const matrix = [];
  for (let i = 0; i < rows; i++) {
    matrix[i] = [];
   for (let j = 0; j < cols; j++) {
    matrix[i][j] = Math.random();
   }
  }
  return matrix;
}

function matrixMultiplication(a, b) {
  const rowsA = a.length;
  const colsA = a[0].length;
  const rowsB = b.length;
  const colsB = b[0].length;
  if (colsA !== rowsB) {
    throw new Error("矩阵不匹配");
  }

  const result = new Array(rowsA);
  for (let i = 0; i < rowsA; i++) {
    result[i] = new Array(colsB).fill(0);
  }

  for (let i = 0; i < rowsA; i++) {
    for (let j = 0; j < colsB; j++) {
      for (let k = 0; k < colsA; k++) {
          result[i][j] += a[i][k] * b[k][j];
      }
    }
  }
 return result;
}


const matrixSize = 1000;
const matrixA = generateRandomMatrix(matrixSize, matrixSize);
const matrixB = generateRandomMatrix(matrixSize, matrixSize);

console.time("Matrix Multiplication");
const resultMatrix = matrixMultiplication(matrixA, matrixB);
console.timeEnd("Matrix Multiplication");

我们可以使用generateRandomMatrix创建任意大小的随机矩阵。然后使用matrixMultiplication将这些矩阵相乘。

随着矩阵大小(matrixSize )的增加,我们会注意到内存使用量也会随之增加。让我们看看 BunNodeJsDeno 如何使用此代码执行操作。

我们将使用名为hyperfine 的基准测试工具。

hyperfine "bun index.js" "node index.js" "deno run index.js" --warmup=100 -i

上述 shell 命令将在不同的运行时执行上述代码,并且需要几分钟的时间才能提供基准测试结果。

在这里插入图片描述
Bun 在管理内存和 CPU 密集型任务方面的熟练程度不仅仅是巧合。它专为速度和最佳性能而设计。如果我们的项目需要快速和高效,Bun 被证明是一个绝佳的选择。

如果我们想构建一个能够在不牺牲功能的情况下提供速度和效率的应用程序,那么考虑 Bun 是一个值得的选择。

社区比较

  • Node.jsNode.js 拥有一个繁忙的社区。这反映了它在 API 开发中的长期存在和广泛接受。
  • DenoDeno 正在迅速开拓自己的市场。它得到了一个充满活力、具有前瞻性思维、渴望突破界限和创新的社区的支持。
  • BunBun社区相比两者来说相对较小。这主要是因为它比两者更新。但是,根据 Bun 的发展方式,可以肯定地说,它很快就会拥有一个庞大的开发者社区!

尽管 BunDeno 正在快速发展,但 Node.js 社区仍然难以超越。

安全性

Node.jsDenoBun 都有独特的安全方法。下面简单介绍一下它们的区别:

  • Node.js:它默认对我们的系统开放,具体取决于可能引入风险的第三方包。像npm audit可以帮助捕获漏洞。例如:

    npm audit
    

    另外,使用以安全为中心的中间件helmet可以增强 Node.js 应用程序的防御:

    const helmet = require('helmet');
    const app = require('express')();
    app.use(helmet());
    
  • Deno:它就像一个保险库,脚本被紧紧锁定,除非我们明确授予它们权限。运行具有有限访问权限的 Deno 服务器,如下所示:

    deno run --allow-net=example.com server.js
    
  • Bun:这个新事物的目标是速度并提供内置的安全功能。然而,它是最近出现的,因此它可能没有像其他方案一样经过那么多安全场景的测试。

显然,Deno 采取了高度宽松的方法。它对应用程序拥有的权限持谨慎态度。它以安全性为首要任务构建,在安全沙箱环境中运行,除非明确授权,否则限制文件和网络访问。

虽然 Node.js Bun 合并了各自的安全措施,但 Deno 的附加内置安全层使其成为那些在 API 开发中优先考虑安全性的人的首选。

因此,如果安全性是我们的首要任务,请选择 Deno

应该使用Node.js、Bun 还是 Deno

没有绝对答案。这取决于我们的优先事项:

  • Node.js:如果我们喜欢经过多年尝试和测试的稳定可靠的生态系统,那么这是首选运行时。
  • Deno:如果我们优先考虑安全性和最新的编程环境功能,建议使用 Deno。它还支持开箱即用的 Typescript
  • Bun:如果我们需要高速,尤其是在使用 JavaScriptTypeScript 时,此运行时应该是我们的首选。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1260184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MidJourney笔记(4)-settings

前面已经大概介绍了MidJourney的基础知识,后面我主要是基于实操来分享自己的笔记。可能内容顺序会有点乱,请大家理解。 这次主要是想讲讲settings这个命令。我们只需在控制台输入/settings,然后回车,就可以执行这个命令。 (2023年11月26日版本界面) 可能有些朋友出来的界…

前端OFD文件预览(vue案例cafe-ofd)

0、提示 下面只有vue的使用示例demo &#xff0c;官文档参考 cafe-ofd - npm 其他平台可以参考 ofd - npm 官方线上demo: ofd 1、安装包 npm install cafe-ofd --save 2、引入 import cafeOfd from cafe-ofd import cafe-ofd/package/index.css Vue.use(cafeOfd) 3、使…

unity UGUI中获取点击位置处的URL链接

需求是&#xff0c;我们在一个text组件中像写网页那样写入链接&#xff0c;然后点击这个链接&#xff0c;就能访问配置的网页啥的。比如&#xff1a; <a href"hello">链接文本</a></summary> 最终的效果如下&#xff1a; 图中&#xff0c;image区…

血的教训------入侵redis之利用python来破解redis密码

血的教训------入侵redis之利用python来破解redis密码 利用强大的python来进行redis的密码破解&#xff0c;过程不亦乐乎&#xff0c;当然也可以用shell脚本 本篇文章只供学习交流&#xff0c;请勿他用&#xff0c;谢谢。 其他相关联的文章 [1]VMware安装部署kail镜像服务器【…

WPS Office JS宏实现批量处理Word中的表格样式

由于本职工作原因&#xff0c;经常会用到office办公软件&#xff0c;经常很多内容审批后&#xff0c;需要统一修改内容或样式&#xff0c;如果Word文档中有上百页或上千页&#xff0c;则一个一个修改太麻烦了。 在接触到WPSJS宏后&#xff0c;发现工作效率大大提升&#xff1b;…

Python字典合并

合并两个有部分key相同的字典&#xff0c;相同key保留两个字典中对应key的较大值。 (笔记模板由python脚本于2023年11月27日 18:12:15创建&#xff0c;本篇笔记适合熟悉Python字典的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Fr…

Rust内存布局

题图忘了来自哪里.. 整型,浮点型,struct,vec!,enum 本文是对 Rust内存布局 的学习与记录 struct A { a: i64, b: u64,}struct B { a: i32, b: u64,}struct C { a: i64, b: u64, c: i32,}struct D { a: i32, b: u64, c: i32, d: u64,}fn main(…

eclipse - jee 建立项目后没有 web.xml

eclipse -- jee 建立项目后没有 web.xml 处理它的方法是&#xff0c;点 File - New - Dynamic Web Project , 此时起一个项目名如M4 然后next 然后next 出现如此所示:

【办公类-18-03】(Python)教师研讨表批量制作(学校、姓名、回答1-3)

背景需求&#xff1a; 领导发给我一个word版本的“研讨表”&#xff1a; “随便你做成什么样子&#xff0c;最后能有个二维码给老师们填写反馈就可以了” 我看了看内容&#xff0c;这和我以前做的“闵行区教师信息技术2.0培训作业”完全相同 “OK&#xff0c;我用问卷星收集教…

第二节HarmonyOS DevEco Studio创建项目以及界面认识

一、创建项目 如果你是首次打开DevEco Studio&#xff0c;那么首先会进入欢迎页。 在欢迎页中单击Create Project&#xff0c;进入项目创建页面。 选择‘Application’&#xff0c;然后选择‘Empty Ability’&#xff0c;单击‘Next’进入工程配置页。 配置页中&#xff0c;详…

【Java并发】聊聊不安全的HashMap以及ConcurrentHashMap

在实际的开发中&#xff0c;hashmap是比较常用的数据结构&#xff0c;如果所开发的系统并发量不高&#xff0c;那么没有问题&#xff0c;但是一旦系统的并发量增加一倍&#xff0c;那么就可能出现不可控的系统问题&#xff0c;所以在平时的开发中&#xff0c;我们除了需要考虑正…

深度学习中小知识点系列(六) 解读SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC

SPP与SPPF 一、SPP的应用的背景 在卷积神经网络中我们经常看到固定输入的设计&#xff0c;但是如果我们输入的不能是固定尺寸的该怎么办呢&#xff1f; 通常来说&#xff0c;我们有以下几种方法&#xff1a; &#xff08;1&#xff09;对输入进行resize操作&#xff0c;让他…

跨标签页通信的8种方式(下)

跨标签页通信是指在浏览器中的不同标签页之间进行数据传递和通信的过程。在传统的Web开发中&#xff0c;每个标签页都是相互独立的&#xff0c;无法直接共享数据。然而&#xff0c;有时候我们需要在不同的标签页之间进行数据共享或者实现一些协同操作&#xff0c;这就需要使用跨…

算法刷题-动态规划3(未完待续---------

算法刷题-动态规划3&#xff09; 01背包问题最后一块石头的重量 01背包问题 一篇文章吃透背包问题 大佬讲解什么是背包问题 问题分析&#xff1a; 面对这么多的物品&#xff0c; 选择一个个地来装入背包&#xff0c;背包的承重量不断地增加&#xff0c;二维数组中&#xff0c;…

Linux系统编程:文件系统总结

目录和文件 获取文件属性 获取文件属性有如下的系统调用&#xff0c;下面逐个来分析。 stat:通过文件路径获取属性&#xff0c;面对符号链接文件时获取的是所指向的目标文件的属性 从上图中可以看到stat函数接收一个文件的路径字符串&#xff08;你要获取哪个文件的属性&a…

ubuntu 下载编译 opencv4.2.0并检验

如有帮助点赞收藏关注&#xff01; 如需转载&#xff0c;请注明出处&#xff01; ubuntu 的opencv4.2.0下载与编译 下载依赖开始编译安装配置OpenCV编译环境检验* 完成 下载 首先下载opencv源码网址&#xff1a; https://opencv.org/releases/page/3/ 下载成zip后&#xff0c;…

GPIO的使用--操作PF09 PF10 PF08实现呼吸灯、跑马灯、警报闪烁灯

先来个呼吸灯演示 呼吸灯 目录 一、GPIO的介绍 1.含义 2.控制原理 3.控制流程 二、LED控制 1.呼吸灯 操作代码 烧录结果 2.蜂鸣器红绿灯交替 操作代码 3.红绿灯交替闪烁 操作代码 一、GPIO的介绍 1.含义 GPIO(general porpose intput output),通用输入输出端口。…

Java游戏 王者荣耀

GameFrame类 所需图片&#xff1a; package 王者荣耀;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList…

分布式事务-两阶段提交2PC

2PC协议就是两阶段提交&#xff0c;用来解决分布式事务&#xff0c;分为两个阶段&#xff0c;分别为Prepare和Commit&#xff0c;也是PC由来。 第一阶段Prepare 提交事务请求 如图所示&#xff0c;主要流程有以下三个方面 询问&#xff1a;事务协调者(Manager)向所有的事务参与…

SpringBoot : ch06 整合 web(二)

前言 SpringBoot作为一款优秀的框架&#xff0c;不仅提供了快速开发的能力&#xff0c;同时也提供了丰富的文档和示例&#xff0c;让开发者更加容易上手。在本博客中&#xff0c;我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术&#xff0c;并通过实例代码来演示如何…