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

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

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

相关文章

Android 单元测试初体验(二)-断言

[TOC](Android 单元测试初体验(二)-断言) 前言 当初在学校学安卓的时候&#xff0c;老师敢教学进度&#xff0c;翻到单元测试这一章节的时候提了两句&#xff0c;没有把单元测试当重点讲&#xff0c;只是说我们工作中几乎不会用到&#xff0c;果真在之前的几年工作当中我真的没…

95.STL-遍历算法 for_each

算法概述: 算法主要是由头文件 <algorithm> <functional> <numeric> 组成。 <algorithm> 是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric> 体积很小&#xff0c;只包括几个在序列上面…

第1章 爬虫基础

目录 1. HTTP 基本原理1.1 URI 和 URL1.2 HTTP 和 HTTPS1.3 请求1.3.1 请求方法1.3.2 请求的网址1.3.3 请求头1.3.4 请求体 1.4 响应1.4.1 响应状态码1.4.2 响应头1.4.3 响应体 2. Web 网页基础2.1 网页的组成2.1.1 HTML2.1.2 CSS2.1.3 JavaScript 2.2 网页的结构2.3 节点树及节…

人工智能 -- 技术概览

1、我们身处人工智能的时代 人们从早期做web开发&#xff0c;到移动端的开发&#xff1b;之后随着数据量的增大&#xff0c;人们开始研究高并发的问题&#xff1b;当数据量不断的增大&#xff0c;而人们希望数据不被浪费时&#xff0c;产生了大数据的技术&#xff0c;包括&…

正则表达式 通配符 awk文本处理工具

目录 什么是正则表达式 概念 正则表达式的结构 正则表达式的组成 元字符 元字符点&#xff08;.&#xff09; 代表字符. 点值表示点需要转义 \ r..t 代表r到t之间任意两个字符 过滤出小写 过滤出非小写 space空格 [[:space:]] 表示次数 位置锚定 例&#xff1a…

第三节HarmonyOS DevEco Studio了解基本工程目录

一、工程级目录 工程的目录结构如下。 目录详情如下&#xff1a; AppScope&#xff1a;存放应用全局所需要的资源文件。Entry&#xff1a;应用的主模块&#xff0c;存放HarmonyOS应用的代码、资源等。oh_modules&#xff1a;工程的依赖包&#xff0c;存放工程依赖的源文件。b…

Umi-OCR图片批量识别文字工具

OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/粘贴/批量导入图片&#xff0c;段落排版/排除水印&#xff0c;扫描/生成二维码。内置多国语言库。 项目地址&#xff1a;https://github.com/hiroi-sora/Umi-OCR

深度学习之图像分类(十四)CAT: Cross Attention in Vision Transformer详解

IPSA和CPSA的处理流程、维度变换细节 FLOPs的计算方法、以及flops和划分的patch数目以及patch的维度计算关系 IPSA如何进行local attention、CPSA如何进行globe attention CAT的代码详细注释---需要学习完Transformer TNT、swin transformer、crossViT CAT: Cross Atten…

C语言——打印出所有的“水仙花数”

所谓水仙花数,是指一个3位数,其各位数字立方和等于该数本身。水仙花数是指一个三位数&#xff0c;它的每个位上的数字的立方和等于它本身。例如&#xff0c;153是一个水仙花数&#xff0c;因为1^3 5^3 3^3 153。 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>…

Scrapy爬虫异步框架(一篇文章齐全)

1、Scrapy框架初识 2、Scrapy框架持久化存储&#xff08;点击前往查阅&#xff09; 3、Scrapy框架内置管道&#xff08;点击前往查阅&#xff09; 4、Scrapy框架中间件&#xff08;点击前往查阅&#xff09; Scrapy 是一个开源的、基于Python的爬虫框架&#xff0c;它提供了…

第71讲:MySQL锁机制详解:表级锁、元数据锁和意向锁的全面解析与实践指南

MySQL中的表级锁 文章目录 MySQL中的表级锁1.MySQL中表级锁的概念2.表锁的概念以及基本使用2.1.表锁的分类以及概念2.2.表锁的使用语法2.3.表共享读锁的基本使用2.4.表独占写锁的基本使用 3.元数据锁的概念以及基本使用3.1.元数据锁的概念3.2.常见的SQL操作所对应的元数据锁3.3…

npm中的npx命令

1.概念 npx是一个执行npm软件包的二进制文件&#xff0c;通俗的讲&#xff0c;他可以执行npm的一些指令。 2.示例 用babel将ES6语法转为ES5语法 npx babel src/js -d dist/js会执行babel的相关功能&#xff0c;如果没有安装&#xff0c;也会自动安装。 当在执行npx <co…

sqli-labs靶场详解less-24(二次注入)

less-24 对于一个像我一样的小白来说这关就像php代码审计 一开始进行判断注入点的时候怎么都找不到一点思路都没有 只能搜教程 说是二次注入 从来没遇见的题型 于是从代码审计开始 先说一下什么叫二次注入 二次注入 二次注入是指通过SQL语句存储到数据库的用户输入被读取后再次…

linux 安装 mvn

mvn 下载地址&#xff1a;https://maven.apache.org/download.cgi 选择一个合适的版本 cd /opt && curl -o apache-maven-3.8.6-bin.tar.gz https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz tar -xzf apache-maven-3.8.6-bin.…

随手写了个博客多平台发布脚本:Python自动发布文章到Wordpress

​ 引言 作为一名技术博主&#xff0c;提高博客发布效率是我们始终追求的目标。在这篇文章中&#xff0c;我将分享一个基于Python的脚本&#xff0c;能够实现博客多平台发布&#xff0c;具体来说&#xff0c;是自动发布文章到WordPress。通过这个简单而高效的脚本&#xff0c…

uni-app x生成的安卓包,安装时,提示不兼容。解决方案

找到 manifest.json 进入&#xff1a;源码视图 代码 {"name" : "xxx康养","appid" : "__xxx6","description" : "xxx康养","versionName" : "1.0.12","versionCode" : 100012,&…

sqli-labs靶场详解(less17-less22)

目录 less-17 less-18 less-19 less-20 less-21 less-22 less-17 修改密码关卡 服务器后端 账号密码都存在数据库中 使用UPDATE进行修改密码 尝试username处 尝试好久尝试不出来应该是对用户名进行了过滤 于是对password进行注入 判断注入点 passwdadmin 报错&#xff1a…

有手就会的产品宣传册制作步骤,一定要收藏!

产品宣传册制作就是为了扩大宣传企业产品&#xff0c;让大众了解和认识产品&#xff0c;从而对产品产生信任。但是&#xff0c;制作一本让人满意的产品宣传册并不容易&#xff0c;很多人都觉得很难&#xff0c;尤其是新手小白。 其实&#xff0c;这些都不是问题&#xff0c;只…

滑块验证码之图片距离计算

滑块验证码之图片距离计算 1.使用工具 vscodepython3.8 2.安装opencv-python python -m pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com查看安装的版本&#xff1a; C:\Users\wenhz>pip list|findstr opencv opencv-pyt…

初次尝试http OAuth2验证的请求

第一次对接OAuth2验证的接口&#xff0c; 莫不着门道&#xff0c;后面获取token成功后&#xff0c;发现其实不难&#xff0c; 用postman举例&#xff1a; 其实挺简单。用客户端id秘钥 获取token---》后面的请求带上token 1,在head中增加 Authorization头 内容格式如上图&…