Deno

✍ dations ◷ 2024-12-23 00:30:42 #运行时系统,软件包管理系统,自由软件

Deno是基于V8引擎和Rust语言所创建的JavaScript、TypeScript运行环境,由Node.js的原始开发者Ryan Dahl所创造。 Dahl在2018年的演讲“我为Node.js感到后悔的十件事”中宣布了Deno。 Deno在单个可执行档中扮演运行环境和包管理系统的角色,不需要将其分开。

Deno于2018年Ryan Dahl的演讲“我为Node.js感到后悔的十件事”中宣布。在这场演讲中,Ryan提到他后悔Node.js的设计,例如没有在API中使用JavaScript的Promise、GYP建构系统、省略文件的扩展名、node_modules与package.json、使用index.js进行模块解析、V8的沙盒环境等等。他在演讲的最后提出了Deno的原型,Deno旨在透过如Protocol Buffers之类的序列化工具传递消息来实现绑定系统的调用,并提供命令行接口来访问控制。


Deno初始版本是使用Go语言编写,并使用Protocol Buffers来实现特权(Go)与非特权(V8)之间的序列化。然而因顾虑到双重运行与垃圾搜集,Go在不久后就被Rust取代。

为了让Deno拥有异步的事件触发环境,Tokio也被引进来取代原本的libuv。

Deno原本采用Flatbuffers以进行更快的零复制序列化与反序列化,在2019年4月发布序列化的标准之后,2019年8月被移除。

2018年11月创建了一个以Go标准库为基底的标准库,并提供了广泛的工具,解决部分Node.js的dependency问题。

Deno于2020年5月13日正式发布。

Deno目标是成为对目前的工程师来说最具有生产力的的脚本环境。Deno强调事件触发架构,并提供一套non-blocking IO与blocking IO。

Deno可用于创建网页服务器、运行数学的运算等等。

Deno与Node.js的相同之处:

Deno与Node.js的不同之处:

最基本的Deno脚本,没有任何读写网络的权限:

deno run main.ts

若要获取权限,需要相对应的flag:

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

若要查看代码的dependency tree,使用info子命令:

deno info main.ts

Hello World代码(与Node.js相同):

console.log("Hello world");

Deno为浏览器中大多数不可用的Deno特定API提供了全局的名字空间。下列是Unix中的cat程序的实现:

/* cat.ts */// Deno API透過`Deno`命名空間來公開const { stdout, open, copy, args } = Deno;// 支援Top-level awaitfor (let i = 0; i < args.length; i++) {    const filename = args; // CLI的參數.    const file = await open(filename); // 開啓相對應的檔案讀取.    await copy(file, stdout); // 執行從`file`到`stdout`的非同步零複製}

上面的Deno.copy函数的运行方式与Go的io.Copy相像。Writer的输出的目标是stdout,file是Reader的输入来源。

若要运行本程序,我们需要提供读的权限:

deno run --allow-read cat.ts myfile

下面的Deno代码实现了最基本的网页服务器:

// 使用URL從遠端的Deno標準函式庫引入`serve`import { serve } from "https://deno.land/std@0.55.0/http/server.ts";// `serve`函式回傳非同步的iterator, 產生請求的streamfor await (const req of serve({ port: 8000 })) {    req.respond({ body: "Hello World\n" });}

当运行这个程序时,Deno会自动下载远程的标准库并编译,相似地,我们也可以借由提供URL当作参数(-A 获取所有权限)来运行标准库里的代码(像是文件服务器)而不需要另外下载

$ deno run -A https://deno.land/std/http/file_server.tsDownload https://deno.land/std/http/file_server.tsCompile ttps://deno.land/std/http/file_server.ts...HTTP server listening on <nowiki>http://0.0.0.0:4500/

参考资料

  1. ^ Contributors, denoland/deno, Github. . 
  2. ^ Releases · denoland/deno. . 
  3. ^ Deno 1.0.0-rc3. –通过GitHub. 
  4. ^ deno/LICENSE at master. GitHub. . 
  5. ^ The MIT License. Open Source Initiative. 17 September 2018 . 
  6. ^ Deno: Secure V8 TypeScript Runtime from Original Node.js Creator. InfoQ. . 
  7. ^ 7.0 7.1 JSConf, 10 Things I Regret About Node.js - Ryan Dahl - JSConf EU 2018, 2018-06-06  
  8. ^ 8.0 8.1 8.2 Deno Manual. deno.land. . 
  9. ^ Paul Krill. Ryan Dahl’s Node.js regrets lead to Deno. InfoWorld. 2018-06-21. 
  10. ^ Dahl, Ryan. Design mistakes in Node (PDF). Github. 2018-06-06. 
  11. ^ denoland/deno, branch "golang". Github. 
  12. ^ Suggestion: Look into porting to Rust and using Tokio. GitHub. 
  13. ^ Tokio - The asynchronous run-time for the Rust programming language.. Tokio.rs. 
  14. ^ Protobuf seems like a lot of overhead for this use case?. Github. 
  15. ^ Replace flatbuffers. GitHub. 
  16. ^ Remove flatbuffers. GitHub. 
  17. ^ denoland/deno_std: deno standard modules. Github. 
  18. ^ Deno 1.0. deno.land. . 

外部链接

官方网站

相关