Deno 技术专题简介-编程知识网

简介

Deno原作者瑞安·达尔开发者Various首次发布2018年5月13日,​4年前​(2018-05-13)当前版本1.32.1 (2023年3月23日) 源代码库github.com/denoland/deno 编程语言Rust, JavaScript, TypeScript, C++(V8绑定)操作系统Linux, macOS, Microsoft Windows类型执行环境许可协议MIT许可证 网站deno.land Deno是基于V8引擎和Rust语言所创建的JavaScript、TypeScript执行环境,由Node.js的原始开发者瑞安·达尔所创造。 达尔在2018年的演讲“我为Node.js感到后悔的十件事”中宣布了Deno。 Deno在单个可执行档中扮演执行环境和包管理系统的角色,不需要将其分开。

历史

Deno于2018年瑞安·达尔的演讲“我为Node.js感到后悔的十件事”中宣布。在这场演讲中,达尔提到他后悔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强调事件触发架构,并提供一套非阻塞IO与阻塞IO。

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

与Node.js的比较

Deno与Node.js的相同之处:

皆运行于V8上。

拥有相同的事件循环。

提供CLI让用户可以执行脚本语言。

庞大的实用程序。

Deno与Node.js的不同之处:

默认模块系统是使用ES Module,而不是CommonJS。

使用URL加载本地端或远程的dependencies。

使用内置的包管理器来抓取资源,因此不需要NPM。

使用具有缓存机制的快照TypeScript编译器,因此Typescript也能开箱即用。

兼容具有广泛Web API的浏览器。

允许控制文件系统与网络访问,以执行沙盒内的代码。

重新利用Promise、ES6、Typescript来设计API。

最小化核心API的大小,同时提供许多的标准库,因此不需要再使用外部的dependencies。

使用消息传递通道来调用特权系统API。

示例

Hello World

在这个JavaScript例子中,Hello 的信息被打印到控制台,代码确保所提供的名字是大写的。

命令: deno run hello-world.js

/** * hello-world.js */function capitalize(word) {  return word.charAt(0).toUpperCase() + word.slice(1);}function hello(name) {  return "Hello " + capitalize(name);}console.log(hello("john"));console.log(hello("Sarah"));console.log(hello("kai"));/** * Output: * * Hello John * Hello Sarah * Hello Kai */

Unix cat程序

在这个程序中,每个命令行参数都被假定为一个文件名,文件被打开,并打印到stdout(例如控制台)。

/** * cat.ts */import { copy } from "https://deno.land/std@0.167.0/streams/conversion.ts";for (const filename of Deno.args) {  const file = await Deno.open(filename);  await copy(file, Deno.stdout);  file.close();}

运行该程序:

deno run --allow-read https://deno.land/std@0.167.0/examples/cat.ts /etc/passwd

HTTP网络服务器

webserver.ts:

import { serve } from "https://deno.land/std@0.167.0/http/server.ts";const port = 8080;const handler = (request: Request): Response => {  const body = `Your user-agent is:\n\n${    request.headers.get("user-agent") ?? "Unknown"  }`;  return new Response(body, { status: 200 });};console.log(`HTTP webserver running. Access it at: http://localhost:8080/`);await serve(handler, { port });

然后用以下方式运行这个:

deno run --allow-net webserver.ts