简介
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