Node.js的劲敌来了:Deno是用于在Web浏览器之外执行JavaScript和TypeScript的运行环境


 Deno是一个新的javascript非浏览器的运行环境,用于在Web浏览器之外执行JavaScript和TypeScript。这点非常类似Node.js。
Deno试图提供一个独立的工具来快速编写复杂功能的脚本。Deno是(并将始终是)单个可执行文件。就像网络浏览器一样,它知道如何获取外部代码。在Deno中,单个文件可以定义任意复杂的行为,而无需任何其他工具。

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

在这里,将完整的HTTP服务器模块作为依赖项添加到一行中。没有其他配置文件,没有预先安装deno run example.js。
与浏览器一样,默认情况下,代码在安全的沙箱中执行。未经允许,脚本无法访问硬盘驱动器,打开网络连接或进行任何其他潜在的恶意操作。浏览器提供了用于访问相机和麦克风的API,但用户必须首先授予权限。Deno在终端中提供类似的行为。除非--allow-net提供命令行标志,否则上面的示例将失败。

与Node区别
Node是在JavaScript具有Promises或async / await概念之前设计的。Node所承诺的对手是EventEmitter,它基于重要的API,即套接字和HTTP。除了异步/等待的人体工程学优势外,EventEmitter模式还存在背压问题。以TCP套接字为例。套接字在收到传入数据包时将发出“数据”事件。这些“数据”回调将以不受限制的方式发出,从而使事件充满整个过程。由于Node继续接收新的数据事件,因此基础TCP套接字没有适当的背压,因此远程发送方不知道服务器已超负荷并继续发送数据。为了减轻这个问题,pause()方法已添加。这可以解决问题,但是需要额外的代码;而且由于泛洪问题仅在进程非常繁忙时才会出现,因此许多Node程序都可能被数据泛洪。结果是系统的尾部延迟时间很长。
在Deno中,套接字仍然是异步的,但是接收新数据需要用户显式地进行read()。正确构造接收套接字不需要额外的暂停语义。这不是TCP套接字独有的。系统的最低绑定层从根本上与承诺相关联-我们称这些绑定为“ ops”。Deno中以某种形式出现的所有回调均来自promise。
Rust有其自己的类似于承诺的抽象,称为Futures。通过“ op”抽象,Deno使将Rust未来的API绑定到JavaScript promise中变得容易。
重要的是:要了解Deno不是Node的分支-它是一个全新的实现。Deno的开发仅两年时间,而Node的开发已超过十年。考虑到对Deno的兴趣,我们希望它会继续发展和成熟。
我们不断跟踪Deno的HTTP服务器的性能。HelloWorld的Deno HTTP服务器每秒处理约25,000个请求,最大延迟为1.3毫秒。一个可比的Node程序每秒处理34,000个请求,最大延迟介于2到300毫秒之间。
Deno的HTTP服务器是在本机TCP套接字顶部的TypeScript中实现的。Node的HTTP服务器使用C语言编写,并作为对JavaScript的高级绑定公开。我们一直拒绝将本地HTTP服务器绑定添加到Deno的冲动,因为我们要优化TCP套接字层,更常见的是优化op接口。