本文译自 deno 官网首页。本文编写时,Deno 的最新版本是 v1.18.2 。
Deno 是一个面向 JavaScript 和 TypeScript 的运行时,其特点是简单、现代化和安全。它以 V8 引擎为基础,使用 Rust 语言和 Tokio 异步运行时构建。
- 尽可能遵循网络标准,比如使用 ES 模块,支持
fetch等。 - 默认安全。除非明确开启,默认无法访问文件,不能联网,也获取不到环境变量。
- 开箱支持 TypeScript。
- 只有一个可执行文件(
deno)。 - 自带实用工具,比如测试工具(
deno test)、代码风格检查工具(deno lint)和代码格式化工具(deno fmt)。 - 有一套经过审核的标准库模块,保证兼容 Deno:deno.land/std
- 可以将脚本打包成一个 JS 文件。
安装
Deno 只有一个可执行文件,没有依赖。可以使用如下方法安装,也可以从发行页面下载二进制文件。
Shell(Mac, Linux):
$ curl -fsSL https://deno.land/install.sh | sh
PowerShell (Windows):
$ iwr https://deno.land/install.ps1 -useb | iex
Homebrew (Mac):
$ brew install deno
Chocolatey (Windows):
$ choco install deno
Scoop (Windows):
$ scoop install deno
使用 Cargo 从源码构建:
$ cargo install deno --locked
查看 deno_install 获取更多安装选项。
起步
试着运行一个简单程序:
$ deno run https://deno.land/std/examples/welcome.ts
或者编写一个更复杂的:
import { serve } from "https://deno.land/std@0.125.0/http/server.ts";
console.log("http://localhost:8000/");
serve((req) => new Response("Hello World\n"), { port: 8000 });
可以打开教程查阅更深入的解释、例子和环境设置指南。
运行时文档
Deno 的基本运行时文档可以在 doc.deno.land 找到。
Deno 还有一些教程,涵盖了运行时复杂函数的深入解释,设计理念的介绍,内部机制的细节,如何把 Deno 嵌入自己的程序,以及如何使用 Rust 插件扩展 Deno。
教程还包括 Deno 自带的内置工具的用法。
标准模块
除了运行时,Deno 还提供了一套经维护者审核的标准模块,这些模块确保可以在特定版本正常运行。他们位于 denoland/deno_std 仓库。
这些标准模块在 deno.land/std 托管,通过 URL 分发,用法就像其他的 ES 模块一样。
第三方模块
Deno 可以从网络的任意地址导入模块,比如 GitHub、个人服务器或 CDN 服务商,比如 Skypack, jspm.io, jsDelivr 或 esm.sh。
为了更方便的消费第三方模块,Deno 提供了一些内置工具,比如 deno info 和 deno doc。deno.land 也提供了一个查看模块信息的 web 界面,地址是 doc.deno.land 。
deno.land 也提供了一个简单的公共托管服务,可以托管兼容 Deno 的 ES 模块。地址是 deno.land/x 。
与 Node.js 的对比
- Deno 不使用
npm- 它使用 URL 或文件路径引用模块
- Deno 在模块解析算法中不用
package.json。 - 所有的 Deno 异步操作返回 promise。因此,Deno 的 API 接口与 Node.js 不同。
- Deno 需要明确的权限才能读取文件、网络和环境变量。
- Deno 遇到未捕获错误时直接退出。
- Deno 使用 ES 模块,不支持
require()调用。第三方模块通过 URL 引用:
import * as log from 'https://deno.land/std@0.125.0/log/mod.ts';
其他关键行为
- 第一次执行时,会获取并缓存远程代码,后续执行就不会更新代码。除非使用
--reload标识位运行代码(因此,在飞机上也可以正常工作哦)。 - 远程 URL 的模块/文件应当是不可变,并且可以缓存的。