A secure runtime for JavaScript and TypeScript.
Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.
- Secure by default. No file, network, or environment access, unless explicitly enabled.
- Supports TypeScript out of the box.
- Ships only a single executable file.
- Has built-in utilities like a dependency inspector (deno info) and a code formatter (deno fmt).
- Has a set of reviewed (audited) standard modules that are guaranteed to work with Deno: deno.land/std
GitHub:https://github.com/denoland/deno
Release:https://github.com/denoland/deno/releases
认识Deno
Deno 1.0 现已发布(目前1.2.0 / 2020.07.13)
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与Nodejs区别
Deno和NodeJS都是基于Google的V8 JavaScript引擎构建的运行时环境。它们都采用事件驱动架构,并为脚本运行和各种系统实用程序提供命令行接口。
Deno主要在以下几个方面与NodeJS有所不同:
| Node | Deno |
---|---|---|
API 引用方式 | 模块导入 | 全局对象 |
模块系统 | CommonJS & 新版 node 实验性 ES Module | ES Module 浏览器实现 |
安全 | 无安全限制 | 默认安全 |
Typescript | 第三方,如通过 ts-node 支持 | 原生支持 |
包管理 | npm + node_modules | 原生支持 |
异步操作 | 回调 | Promise |
包分发 | 中心化 npmjs.com | 去中心化 import url |
入口 | package.json 配置 | import url 直接引入 |
打包、测试、格式化 | 第三方如 eslint、gulp、webpack、babel 等 | 原生支持 |
快速上手
参考官方文档deno 稳定版Api:https://doc.deno.land/https/github.com/denoland/deno/releases/latest/download/lib.deno.d.ts
安装deno
Shell(Mac,Linux):
|
PowerShell(Windows):
|
更多其他方式:https://github.com/denoland/deno_install
deno支持的命令:
deno bundle
:将脚本和依赖打包deno eval
:执行代码deno fetch
:将依赖抓取到本地deno fmt
:代码的格式美化deno help
:等同于-h
参数deno info
:显示本地的依赖缓存deno install
:将脚本安装为可执行文件deno repl
:进入 REPL 环境deno run
:运行脚本deno test
:运行测试
编写一个hello world
最快速运行一个简单程序:
|
Deno 具有安全控制,默认情况下脚本不具有读写权限。如果脚本未授权,就读写文件系统或网络,会报错。
必须使用参数,显式打开权限才可以。
--allow-read
:打开读权限,可以指定可读的目录,比如--allow-read=/temp
。--allow-write
:打开写权限。--allow-net=google.com
:允许网络通信,可以指定可请求的域,比如--allow-net=google.com
。--allow-env
:允许读取环境变量。
自己写一个hello world
|