首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Rust编写的Deno框架会取代NodeJS吗?

用Rust编写的Deno框架会取代NodeJS吗?

目录

【引言】

【概述】

【最新版本】

【官方网站】

【历史】

【Deno的目标】

【与NodeJS的对比】

【运行示例】

下面是运行Deno脚本的命令:

指定相应的权限:

要检查脚本的依赖树,可使用info子命令:

在Deno中,一个基本的hello-world程序看起来是这样子的:

一个Unix cat命令程序可以这样实现:

HTTP服务器

运行效果:

测试:

直接运行标准库脚本

【小结】

【引言】

这篇文章我们来了解一下Deno。

【概述】

Deno是一个基于V8 JavaScript引擎和Rust编程语言的JavaScript和TypeScript的运行时框架。

它是由NodeJS的原创者RyanDahl创建的,这个框架的初衷是专注于开发效率的提高。

最初它是Dahl在2018年的 "我对NodeJS的10件事感到遗憾 "的演讲中宣布的。

Deno作为一个框架,生成的单个可执行程序中可以同时承担运行时环境和包管理器的角色,而不再需要单独的包管理程序。

【最新版本】

1.0.0.rc3 于 2020年5月12日

【官方网站】

https://deno.land/

【历史】

Deno是由Ryan Dahl在JSConf EU 2018上发表的演讲中宣布的,那次演讲的题目是"关于NodeJS的10件我遗憾的事"。

在演讲中,Ryan提到了他对NodeJS最初设计决策的遗憾,重点是:

他在API设计中没有使用Promises、

使用老旧的GYP构建系统、

node_modules和package.json,

舍弃了文件扩展名,

用index.js实现模块解析,

这打破了V8的沙盒环境。

他最终提出了Deno的原型,旨在通过协议缓冲区等序列化工具的消息传递机制来实现系统调用绑定,并提供命令行标志的访问控制。

Deno最初是用Go编写的,使用Protocol Buffers来实现特权方(Go,具有系统调用权限)和非特权方(V8)之间的序列化。

不过,由于担心重复运行时间和垃圾收集压力,Go语言很快就被Rust取代了

Tokio作为异步事件驱动平台被引入,取代libuv,并采用Flatbuffers来实现更快的 "零拷贝 "序列化和反序列化。

但后来在2019年4月发布的基准测试结果显示,FlatBuffers在序列化方面的开销很大,所以2019年8月FlatBuffers最终被移除。

2018年11月,Deno仿照Go的标准库创建了一个标准库,提供了大量的工具和实用程序,部分解决了NodeJS的依赖树爆炸的问题。

【Deno的目标】

Deno的目标是为现代程序员提供一个高开发效率的脚本环境。

与NodeJS类似,Deno使用的是事件驱动的架构,提供了一组无阻塞的核心IO机制,以及它们的阻塞版本。

Deno可以用来创建Web服务器,执行科学计算等。

【与NodeJS的对比】

Deno和NodeJS都是基于Google的V8 JavaScript引擎构建的运行时环境。它们都采用事件驱动架构,并为脚本运行和各种系统实用程序提供命令行接口。

Deno主要在以下几个方面与NodeJS有所不同:

1.使用ESModule作为默认的模块系统,而不是CommonJS。

2.使用URLs加载本地或远程依赖关系,类似于浏览器那样。

3.包含一个内置的包管理器,用于资源的获取,因此不需要NPM。

4.支持TypeScript开箱即用,使用带有缓存机制的快照TypeScript编译器。

5.目标是更好的兼容各种Web API的浏览器。

6.允许控制文件系统和网络访问,来运行沙盒代码。

7.重新设计了API使用Promises、ES6和TypeScript。

8.最小化了核心API的大小,同时提供了一个没有外部依赖的大型标准库。

9.使用消息传递通道来调用特权系统API和使用绑定。

【运行示例】

下面是运行Deno脚本的命令:

deno run hello.ts

指定相应的权限:

deno run --allow-read --allow-net hello.ts

要检查脚本的依赖树,可使用info子命令:

deno info hello.ts

在Deno中,一个基本的hello-world程序看起来是这样子的:

console.log("Hello world");

Deno为大多数Deno特有的API提供了全局命名空间,这些API在浏览器中是不可用的。

一个Unix cat命令程序可以这样实现:

/* cat.ts */

/* Deno API通过`Deno`命名空间访问。*/

const{stdout,open,copy,args} =Deno;

//支持顶层await

for(leti=;i

constfilename=args[i];//获取命令行参数。

constfile=awaitopen(filename);//打开相应的文件进行读取。

awaitcopy(stdout,file);//执行一个从`file`到`stdout`的异步拷贝。

}

上述Deno.copy函数的工作原理与Go的io.Copy类似,其中stdout(标准输出)是目标Writer,file是源Reader。要运行这个程序,我们需要提供文件系统的读取权限:

deno run --allow-read cat.ts myfile

HTTP服务器

下面的Deno脚本实现了一个基本的HTTP服务器:

//从远程Deno标准库中使用URL导入`serve`。

import{serve}from"https://deno.land/std/http/server.ts";

// `serve`函数返回一个异步迭代器,产生一个请求流。

forawait(constreqofserve({port:8000})) {

req.respond({body:"Hello World\n"});

}

运行效果:

测试:

当运行这个程序时,Deno会自动下载并缓存远程标准库文件,并进行编译。

直接运行标准库脚本

我们也可以直接运行标准库脚本(如文件服务器),而不需要显式的下载,只需提供URL作为输入文件名(-A打开所有权限):

deno run -A https://deno.land/std/http/file_server.ts

【小结】

在上面我们大体的研究和学习了一下Deno的概述,历史,目标,以及相比于NodeJS的不同之处,我们也演示了一下Deno的一些运行示例。

不难看出,Deno作为了一个崭新的服务框架,对NodeJS形成了强大的威胁。除了大量现已存在的NodeJS项目代码之外,NodeJS在Deno面前显得弱了些。

当然,由于这两种框架的编程语言都是JavaScript和TypeScript,所以NodeJS的程序员也没什么好担心的。

本文对Deno框架进行了探讨,希望对大家有所裨益。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200514A041EZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券