比较node.js和Deno

前言

如果你一直关注 Web 开发领域,那么最近可能已经听到了很多关于 Deno 的信息——一种新的JavaScript运行时,它可能也会被认为是 Node.js的继承者。但是这意味着什么,我们需要“下一个 Node.js” 吗?

什么是 Deno?

要了解发生了什么,我们首先需要看一下 Deno 到底是什么。就像我前面说过的那样,这是一个新的JavaScript运行时,也就是要执行 JS代码的环境。它最初是由Ryan Dahl创造的,他在之前曾经为我们把 Deno 与Node.js进行了比较。

Ryan在JSConf EU 2018 演讲上宣布了 Deno,标题为“Node.js 的十大遗憾”。仅从那条信息中,你就可以知道进展情况。 Deno 是从头开始创建的,是当前对 Node.js 的更好的实现。

但是 Node.js 有什么不好的地方?Deno 如何与它更成熟的表兄抗衡?

与 Node.js 的比较

尽管 Deno 和 Node.js 是执行相似操作的类似工具,但它们之间的差异远远不只是名称的颠倒。

体系结构

让我们先来了解一下 Deno 的内部原理。就像 Node.js 一样,它基于 Chromium 的V8JavaScript 引擎,并使用事件驱动,非阻塞架构。但是两者的主要编写语言有所不同。Node.js 主要使用C ++编写,libuv作为其异步 I/O 库,而 Deno 用的是Rust,同样其使用的异步库Tokio也是用 Rust 编写。

对于这些差异如何转化为实际性能,我们必须拭目以待。就目前而言,根据Deno 的基准,两者之间的区别是无法区分的,或者说至少是非常微妙的。

ES模块

你可能知道,Node.js 当前的模块系统是所谓的CommonJS(带有require()的那个),尽管ESM( ECMAScript 模块(带有import和export的模块)成为 JS 的官方标准已有相当长的一段时间了,可以追溯到2015 年推出的ES6。当然,Node.js 确实支持 ESM,但是此功能目前([ v14.xx) 被标记为实验性的,从而迫使 JS 社区仍然使用 CommonJS 模块系统 或其他打包器。

这就是 Deno 要推出的东西,它仅支持 ESM 模块 —— 一个真正的模块系统!

依赖管理

但是,除了 ESM 之外,Deno 还为 Node.js 带来的依赖性管理带来了更多变化。

基于从有着上百万个包的npmregistry和类似黑洞的node_modules目录中汲取的经验,Deno 采用了一种完全不同的依赖关系方法。 Deno 不需要类似npm的 registry 和包管理器,而是直接从 URL 导入并使用依赖项:

import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
    req.respond({ body: "Hello World\n" });
}

然后将下载的模块不可见地存储在计算机上的某个位置。是的,这意味着不会再有node_modules!

可是等等!还有更多...或者我应该少说,因为 Deno 还摆脱了现在制作的万能的package.json文件。除了deps.ts文件之外没有其他的替代选择,它的作用更像是所有外部模块的重定向排序文件:

export { assert } from "https://deno.land/std@v0.39.0/testing/asserts.ts";
export { green, bold } from "https://deno.land/std@v0.39.0/fmt/colors.ts";

至于 NPM registry,因为 Deno 现在可以从 URL 加载依赖项,所以这与 Node.js 的要求不一样。但是如果你对这个选项感兴趣,Deno 会提供自己的包托管。

TypeScript 和其他功能

是的,你已经看到了 ——JavaScript 是使用 Deno 的主要语言,另外还支持TypeScript,。该支持是内置的,不需要类似custom registers的东西或复杂的设置。

但是,除了 TS 支持之外,Deno 还内置了许多其他有用的工具。它们当中的大多数以命令形式出现,例如fmt、bundle或doc,分别提供代码格式化,打包和文档生成等功能。

API

至于 API,Deno 肯定是自己的东西。一切都是用 TypeScript 编写的,异步 API 仅基于Promise。核心功能被限制在最低限度,而其他所有功能都可以在标准库中找到。

所以从表面上看,这一切看起来都很好,而且非常有前途,但是当你意识到更改所有的 API 意味着将 Node.js 代码库转换为 Deno 更加困难时,这种愉悦的心情立即消失了。可悲的是,所有新的和更好的东西都必须付出代价,对吗?

安全

最后,安全性是 Deno 最重要的方面之一。与 Node.js 相比,它用沙盒执行的代码,仅允许访问系统的选定部分。这意味着通过传递适当的标志,可以轻松地限制对磁盘、网络和子进程等内容的访问。

那么,这意味着什么?

因此,我刚刚以非常简短的方式向你介绍了 Deno 的一些功能,以便你能够掌握所有内容的要点。你可以根据需要进行更深入的研究(我将在本文结尾放一些不错的文章链接)。

让我们回过头来讨论这个博客文章的主要问题——这意味着什么?好吧,主要是因为Deno v1已经在2020 年 5 月 13 日发布(正好是其首次发布的第二年)。现在每个人都在问这是否将会成为“下一个大事件”,或者它是否将会完全取代 Node.js。

就个人而言,我认为现在讨论这些还为时过早。考虑到项目的规模和社区的期望,该项目尽管已经是 v1 版了,但要成为可行的 Node.js 替代者还有很长的路要走。请记住,这些技术(即使存在所有差异)仍然要做同样的事情,同时必须相互竞争。而且 Node.js 的开发也不会过时(例如基于 Promise 的 FS API变体或 ESM 实验性支持),这意味着我们很可能会在这个存在两个 JavaScript 运行时的世界中生活很长时间(说的好像对 JS 开发人员来说是个新鲜事一样)。并且请记住,我甚至没有提到庞大的 NPM registry 和生态系统,尽管它们无论如何都不是完美的,但仍然为 Node.js 增添了很多价值——这是 Deno 目前还不具备的优势。

底线

总而言之,Node.js 不会出现在任何地方,并且,如果你要启动一个用于生产的严肃项目,那么至少就目前而言,最好还是坚持使用 Node.js。话虽如此,但是没有什么人(当然不是我)或事情能够阻止你去使用 Deno,甚至把 Deno 用于严肃的项目。看起来它确实像是未来,但是我们根本还没有到达。

以上就是比较node.js和Deno的详细内容,更多关于node.js和Deno的资料请关注我们其它相关文章!

(0)

相关推荐

  • 搞懂什么是Node.js原来这么简单

    Node.js 的官方介绍 在 Node.js 的官方网站的首页中,有这样一句话来描述 Node.js: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. 翻译过来的意思就是: Node.js 是基于 Chrome

  • nodejs的错误处理过程记录

    本文以连接错误ECONNREFUSED为例,看看nodejs对错误处理的过程. 假设我们有以下代码 1. const net = require('net'); 2. net.connect({port: 9999}) 如果本机上没有监听9999端口,那么我们会得到以下输出. 1. events.js:170 2. throw er; // Unhandled 'error' event 3. ^ 4. 5. Error: connect ECONNREFUSED 127.0.0.1:9999

  • node中使用shell脚本的方法步骤

    背景 在开发中我们在特定的场合下可能需要一些脚本来批量处理我们的业务逻辑,在nodejs如何调用shell脚本呢? 新建 项目下新建脚本文件 touch newFile.sh 修改文件权限 chmod 777 newFile.sh 修改文件为可读可写可执行 nodejs调用 文件读取 //使用nodejs的子进程里面的文件读取方法 const { execFile } = require('child_process'); 示例 DocsService.publishAllDocs = (req

  • Node.js之http模块的用法

    前言 Node.js开发的目的就是为了用JavaScript编写Web服务器程序.因为JavaScript实际上已经统治了浏览器端的脚本,其优势就是有世界上数量最多的前端开发人员.如果已经掌握了JavaScript前端开发,再学习一下如何将JavaScript应用在后端开发,就是名副其实的全栈了. HTTP协议 要理解Web服务器程序的工作原理,首先,我们要对HTTP协议有基本的了解.如果你对HTTP协议不太熟悉,先看一看HTTP协议简介. HTTP服务器 要开发HTTP服务器程序,从头处理TC

  • node.js利用express自动搭建项目的全过程

    一.安装express库和生成器 打开cmd输入命令:  yarn global add express express-generator 解释: 上面里两个模块分别表示库和生成器,在express3时,安装express会自动的给你安装生成器express-generator ,但是在express4时,他们就被分开了,所以需要分别安装. 安装好后可以通过命令:express --version 检查是否安装成功. 出现版本号即为安装成功(如下图所示). 二.express生成器自动创建ex

  • node.js 全局变量的具体使用

    全局对象 所有模块都可以调用 global:表示Node所在的全局环境,类似于浏览器中的window对象. process:指向Node内置的process模块,允许开发者与当前进程互动. 例如你在DOS或终端窗口直接输入node,就会进入NODE的命令行方式(REPL环境).退出要退出的话,可以输入 process.exit(); console:指向Node内置的console模块,提供命令行环境中的标准输入.标准输出功能. 全局函数 定时器函数:共有4个,分别是setTimeout(),

  • Node8中AsyncHooks异步生命周期

    Async Hooks 是 Node8 新出来的特性,提供了一些 API 用于跟踪 NodeJs 中的异步资源的生命周期,属于 NodeJs 内置模块,可以直接引用. const async_hooks = require('async_hooks'); 这是一个很少使用的模块,为什么会有这个模块呢? 我们都知道,JavaScript在设计之初就是一门单线程语言,这和他的设计初衷有关,最初的JavaScript仅仅是用来进行页面的表单校验,在低网速时代降低用户等待服务器响应的时间成本.随着Web

  • Nodejs 数组的队列以及forEach的应用详解

    本文主要记录了在Nodejs开发过程中遇到过的由数组特性引起的问题及解决方式,以及对数组的灵活应用. 本文代码测试结果均基于node v6.9.5 数组与队列 利用数组对象方法push/shift可实现队列先进先出特性,例如: >a=[] [] >a.push(2.3.4) 3 >a.push(2) 3 >a [2.3.4.2] >a.shift() 2 >a >[3.4.2] 数组与forEach 对数组的删除操作有两种常见方式:delete和使用splice方

  • Nodejs探秘之深入理解单线程实现高并发原理

    前言 从Node.js进入我们的视野时,我们所知道的它就由这些关键字组成 事件驱动.非阻塞I/O.高效.轻量,它在官网中也是这么描述自己的. Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. 于是在我们刚接触Node

  • nodejs处理tcp连接的核心流程

    前几天和一个小伙伴交流了一下nodejs中epoll和处理请求的一些知识,今天简单来聊一下nodejs处理请求的逻辑.我们从listen函数开始. int uv_tcp_listen(uv_tcp_t* tcp, int backlog, uv_connection_cb cb) { // 设置处理的请求的策略,见下面的分析 if (single_accept == -1) { const char* val = getenv("UV_TCP_SINGLE_ACCEPT"); sing

随机推荐