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

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 时,此运行时应该是我们的首选。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis缓存】RedisTemplate如何获取符合要求的key,批量获取key

RedisTemplate如何获取符合要求的key,批量获取key 一、方法/命令二、数据使用 一、方法/命令 如果使用命令的形式&#xff0c;输入以下命令即可 keys *如果使用RedisTemplate&#xff0c;则方法为 redisTemplate.keys()获取所有符合条件的key。 二、数据使用 redis中缓存了…

西南科技大学数字电子技术实验一(数字信号基本参数与逻辑门电路功能测试及FPGA 实现 )预习报告

手写报告稍微认真点写&#xff0c;80随便有 目录 一、计算/设计过程 1、通过虚拟示波器观察和测量信号 2、通过实际电路&#xff08;电阻、开关、发光二极管&#xff09;模拟逻辑门电路 二、画出并填写实验指导书上的预表 三、画出并填写实验指导书上的虚表 四、粘贴原理…

Kafka 保证消息消费全局顺序性

当有消息被生产出来的时候&#xff0c;如果没有指定分区或者指定 key &#xff0c;那么消费会按照【轮询】的方式均匀地分配到所有可用分区中&#xff0c;但不一定按照分区顺序来分配 我们知道&#xff0c;在 Kafka 中消费者可以订阅一个或多个主题&#xff0c;并被分配一个或多…

前端页面带值跳转

前端页面带值跳转 querry>url searchParamers,url后附加参数&#xff0c;传递的值长度与有限vuex&#xff08;全局状态管理&#xff09;&#xff0c;搜索页面将关键词塞到状态中&#xff0c;所搜结果页从状态取值。 使用axios整合前后端 axios官网&#xff1a;axios 在前…

SpringCloud--分布式事务实现

一、分布式事务 首先要明白事务是指数据库中的一组操作&#xff0c;这些操作要么全部成功执行&#xff0c;要么全部不执行&#xff0c;以保持数据的一致性和完整性。在本地事务中&#xff0c;也就是传统的单机事务&#xff0c;必须要满足原子性(Atomicity)、一致性(Consistenc…

计算机组成原理——存储器(主存容量扩展)

对于字扩展与位扩展的解释&#xff1a; 计算机原理中的字&#xff0c;位扩展&#xff0c;都给老子进来学&#xff0c;看不懂算我输&#xff01; 如果主存的容量无法满足 CPU 的需求&#xff0c;可以通过存储器扩展来解决&#xff0c;扩展的方式有两种&#xff1a; 主存的位数…

“职场中的‘特色人物’:与‘个性’领导和同事的碰撞与成长“

文章目录 每日一句正能量前言程序员是怎么和产品经理battle的&#xff1f;科班程序员非科班程序员 程序员的团队合作密码&#xff1a;协作与领导的艺术职场人际关系的技巧后记 每日一句正能量 乌云的背后是阳光&#xff0c;阳光的背后是彩虹。 前言 在职场中&#xff0c;我们都…

训练 CNN 对 CIFAR-10 数据中的图像进行分类

1. 加载 CIFAR-10 数据库 import keras from keras.datasets import cifar10# 加载预先处理的训练数据和测试数据 (x_train, y_train), (x_test, y_test) cifar10.load_data() 2. 可视化前 24 个训练图像 import numpy as np import matplotlib.pyplot as plt %matplotlib …

Python网络爬虫练习

爬取历年中国大学排名(前20名)&#xff0c;并随机选取一所高校画图展示其历年总分变化,并计算平均分&#xff0c;在图上展示该平均分直线&#xff1a; 代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pd import requests import randomdef main(yea…

蓝桥杯day01——根据给定数字划分数组

题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 pivot 。请你将 nums 重新排列&#xff0c;使得以下条件均成立&#xff1a; 所有小于 pivot 的元素都出现在所有大于 pivot 的元素 之前 。所有等于 pivot 的元素都出现在小于和大于 pivot 的元素 中间 。小于 piv…

代码随想录算法训练营 ---第四十八天

第一题&#xff1a; 简介&#xff1a; 注&#xff1a;本题简介是我的思路&#xff0c;题解思路看下方。 动态规划五部曲&#xff1a; 1.确定dp数组的含义 //dp[i]表示 偷到第i家能偷到的最大金额 for(int i2;i<nums.size();i){if(i-3>0)dp[i] max(dp[i-2],dp[i-3])nu…

智慧城市交通大屏|助力解决城市交通问题

2017年起&#xff0c;数字孪生连续三年被Gartner列入“未来科技十大趋势”&#xff0c;由此可见数字孪生技术正屹立在数字化发展的风口之中。 数字孪生作为物理世界的数字映射&#xff0c;将流程、物体的信息利用数字技术实时映射到系统中&#xff0c;可以对某个设备、某个企业…

【挑战业余一周拿证】二、在云中计算 - 第 3 节 - Amazon EC2 定价

目录 第 3 节 - Amazon EC2 定价 一、按需 适用场景 二、Savings Plans 适用场景 三、预留实例 三种付款模式 四、Spot 实例 适用场景 五、专用主机 适用场景 关注订阅号 首页&#xff1a;【挑战业余一周拿证】AWS 认证云从业者 - 基础 课程目录&#xff1a;【挑…

网站纪念哀悼主题风格

前言 在许多情况下&#xff0c;为了表达对逝者的怀念和哀悼&#xff0c;网站会将其风格调整为黑白色。这种做法在一些网站中非常常见&#xff0c;包括一些社交媒体平台和新闻网站等。 当一个网站将其风格调整为黑白色时&#xff0c;这通常意味着它正在为一些悲伤的事件或纪念日…

leetCode 77.组合 + 回溯算法 (bactracking) + 剪枝 + 图解 + 笔记

77. 组合 - 力扣&#xff08;LeetCode&#xff09; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] …

消失的数字,旋转数组(leetcode 一题多解)

目录 一、消失的数字 思路一&#xff08;暴力求解&#xff09;代码实现&#xff1a; 思路二&#xff08;数列的思想&#xff09;代码实现&#xff1a; 思路三&#xff08;异或的运用&#xff09;代码实现&#xff1a; 二、轮转数组 思路一&#xff08;暴力求解&#xff09…

线上异步任务突然不能回写100%

项目场景&#xff1a; 需求是一个作业&#xff0c;需要运行一组sql&#xff0c;所有sql运行完成&#xff0c;更新作业进度为100%&#xff0c;状态为完成。sql需要是在大数据平台&#xff0c;通过yarn调度&#xff0c;异步执行。 kafka监听每个sql的执行状态&#xff0c;所有sql…

KaiwuDB 亮相中国 5G + 工业互联网大会,助力新型工业化

11月19-21日&#xff0c;由各相关政府部门共同主办的“2023 中国 5G工业互联网大会”在湖北武汉盛大举行。作为我国“5G工业互联网”领域的国家级顶会&#xff0c;本届大会以“数实融合&#xff0c;大力推进新型工业化”为主题&#xff0c;聚焦新型基础设施、产业转型升级、技术…

树莓派 cpolar实现内网穿透

树莓派 cpolar实现内网穿透 cpolar官网介绍 cpolar官网 树莓派安装cpolar 使用ssh连接树莓派终端&#xff0c;输入以下命令&#xff0c;即可安装cpolar curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash安装完成后可输入cpolar v…

idea 旧项目替换成新项目(项目名称,模块,代码)

文章目录 修改项目名替换模块、文件前缀全局替换包名局部替换xml、yml等其他文件 修改项目名 右击项目名称->Refactor->Rename(shiftF6) ctrlaltshifts 替换模块、文件前缀 git bash执行如下脚本 #/bin/bash # 单目录替换 for f in old-prefix*; do mv "$f…