「译」deno 简介

256 阅读3分钟

本文译自 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, jsDelivresm.sh

为了更方便的消费第三方模块,Deno 提供了一些内置工具,比如 deno infodeno 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 的模块/文件应当是不可变,并且可以缓存的。