跳到主要内容
Deno 2.4 发布,带来 deno bundle、字节/文本导入、OTel 稳定版等更多功能
了解更多

Deno 1.14 发布说明

Deno 1.14 已标记并发布,包含以下特性和更改

如果您已经安装了 Deno,可以通过运行以下命令升级到 1.14

deno upgrade

如果您是第一次安装 Deno,可以使用以下方法之一

# Using Shell (macOS and Linux):
curl -fsSL https://deno.land/x/install/install.sh | sh

# Using PowerShell (Windows):
iwr https://deno.land/x/install/install.ps1 -useb | iex

# Using Homebrew (macOS):
brew install deno

# Using Scoop (Windows):
scoop install deno

# Using Chocolatey (Windows):
choco install deno

新特性

Web Crypto API 增补

此版本引入了许多新的 Web Crypto API

  • crypto.subtle.exportKey():
    • HMAC 密钥现在可以以 JWK 和“raw”格式导出。
    • RSA 密钥现在可以以 pkcs#8 格式导出。
  • crypto.subtle.importKey():
    • HMAC 密钥现在可以以 JWK 和“raw”格式导入。
    • RSA 密钥现在可以以 pkcs#8 格式导入。
    • PBKDF2 密钥现在可以以“raw”格式导入。
  • crypto.subtle.generateKey():
    • 现在支持生成 RSA-OAEP 密钥。
    • 现在支持生成 ECDH 密钥。
    • 现在支持生成 AES 密钥。
  • crypto.subtle.deriveBits():
    • 现在支持 PBKDF2 派生。
    • 现在支持 HKDF 派生。
  • crypto.subtle.verify():
    • 现在支持 ECDSA 签名验证。
  • crypto.subtle.encrypt():
    • 现在支持 RSA-OAEP 加密。
  • crypto.subtle.decrypt():
    • 现在支持 RSA-OAEP 解密。

我们正持续努力改进 Web Crypto API。我们希望能在今年年底前完成所有 API。您可以订阅此跟踪问题以获取进度通知。

感谢 Divy Srivastava 在 Deno 中 Web Crypto 实现方面所做的重要工作。

deno lintdeno fmt 的自定义选项

Deno 过去曾拒绝 deno lintdeno fmt 的可配置性。我们相信生态系统受益于规范的代码样式和 linting 规则。在过去一年中,我们收到了许多用户的请求,希望能调整 deno lintdeno fmt 使用的选项,以满足特定、合理的需求。此版本允许配置 deno lintdeno fmt

我们仍然建议大多数用户使用默认选项。这些选项适用于大多数团队和项目。默认情况下,deno lint 将启用所有推荐的 lint 规则运行。

现在可以使用 --rules-exclude--rules-include--rules-tags 来排除规则,或者包含不在推荐集中的特定规则(例如 ban-untagged-todo)。

deno fmt 的样式规则基于 prettier。只有五个选项可以用于调整样式规则

  • --options-indent-width(默认值:2)- 用于缩进的空格数。
  • --options-line-width(默认值:80)- 最大行宽。
  • --options-prose-wrap(默认值:always)- 散文换行设置。
  • --options-single-quote(默认值:false)- 是否使用单引号。
  • --options-use-tabs(默认值:false)- 是否使用制表符代替空格进行缩进。

这些选项现在也可以在 --config 指定的文件中配置。我们设计这个标志的目的是让同一个文件可以与 deno run --configdeno fmt --configdeno lint --config 一起使用。也就是说,我们正在扩展 tsconfig.json 文件。

之前

{
  "compilerOptions": {
    "allowJs": true,
    "lib": ["deno.window"],
    "strict": true
  }
}

之后

{
  "compilerOptions": {
    "allowJs": true,
    "lib": ["deno.window"],
    "strict": true
  },
  "lint": {
    "files": {
      "include": ["src/"],
      "exclude": ["src/testdata/"]
    },
    "rules": {
      "tags": ["recommended"],
      "include": ["ban-untagged-todo"],
      "exclude": ["no-unused-vars"]
    }
  },
  "fmt": {
    "files": {
      "include": ["src/"],
      "exclude": ["src/testdata/"]
    },
    "options": {
      "useTabs": true,
      "lineWidth": 80,
      "indentWidth": 4,
      "singleQuote": true,
      "proseWrap": "preserve"
    }
  }
}

我们计划在未来的版本中,允许在配置文件中指定更多现有标志,并提供配置文件的自动发现,从而进一步改善使用 Deno 的体验。在 1.14 版本中,您必须手动指定配置文件,没有自动检测功能。

请注意,现在使用配置文件不是必需的,将来也不会是必需的。Deno 仍然在默认选项和没有配置文件的情况下表现最佳。配置文件中指定的所有选项也可以通过命令行标志设置(例如 deno fmt--options-use-tabs)。使用配置文件应被视为“按需”功能,而不是用户在设置项目时首先要做的。

有关配置文件中允许选项的详细说明,请参阅手册页JSON Schema 文件

VSCode 扩展通过 deno.config 设置内置支持此文件。

URLPattern

此版本引入了一个新的不稳定的 Web 平台 API,用于将 URL 与模式进行匹配。URLPattern 是流行库 path-to-regexp 的内置替代方案。

模式语法与 path-to-regexp 非常相似。URLPattern 的独特之处在于它不仅能匹配路径,还能单独匹配 URL 的每个部分(协议、主机名、路径名、查询字符串、哈希等)。

const pattern = new URLPattern({ pathname: "/books/:id" });

console.log(pattern.test("https://example.com/books/123")); // true
console.log(pattern.test("https://example.com/books/123/456")); // false
console.log(pattern.test("https://example.com/books")); // false

console.log(pattern.exec("https://example.com/books/123").pathname); // { input: "/books/123", groups: { id: "123" } }

此 API 不稳定(需要 --unstable 才能使用),但在稳定化之前不太可能发生重大变化。除非出现新的阻碍,否则我们将在 Deno 1.15 中稳定此 API,与 Chrome 95 中的稳定化同步。

详细文档将在几天内于 MDN 上提供。您可以在此处查看 MDN 文档的预览

感谢 Jake Archibald 提出了最初的 API 提案,感谢 Ben Kelly 负责规范工作,以及感谢 @crowlKats 在 Deno 中的实现。

原生服务端 WebSocket API 的稳定化

原生服务端 WebSocket 支持已在 Deno 1.12 中添加,但当时只在 --unstable 标志后可用。

在实际测试 API 并获得用户反馈后,Deno.upgradeWebSocket() API 已在 1.14 中稳定化,不再需要 --unstable 标志。

Worker 之间零拷贝 ArrayBuffer 传输

此版本引入了在 worker 之间传输 ArrayBuffer 的能力,而无需复制。这可以显著加快大型缓冲区的传输速度。

要传输缓冲区而不是复制它,请在调用 postMessage() 时在 transfer 选项中指定缓冲区。

文件锁定 API

此版本引入了四个新的不稳定 API,可用于文件锁定

  • Deno.flock
  • Deno.flockSync
  • Deno.funlock
  • Deno.funlockSync

这些 API 对于像 sqlite 这样的项目至关重要,以提供正确的数据库同步。

感谢 Tilman Roeder 实现了此功能。

操作系统信号 API 的更改

1.14 版本彻底修改了不稳定的操作系统信号 API。Deno.Signal 枚举已更改为信号字符串标识符的联合类型,允许信号 API 也使用字符串标识符,而不再需要传递 Deno.Signal 成员。

之前

for await (const _ of Deno.signal(Deno.Signal.SIGTERM)) {
  console.log("got SIGTERM!");
}

之后

for await (const _ of Deno.signal("SIGTERM")) {
  console.log("got SIGTERM!");
}

此外,包含用于创建不同信号流的辅助方法的 Deno.signals 命名空间已完全移除。进行这些更改是为了使信号 API 稳定化,我们预计这很快就会实现。

fetch 中的双向 TLS 支持

此版本在 fetch() 中引入了对双向 TLS 的支持。双向 TLS(有时称为客户端认证)是一种对客户端进行服务器认证的方式。一些常见用例包括

  • 对 Kubernetes API 服务器进行客户端认证
  • 对 Cloudflare Access 等零信任平台进行客户端认证

现在可以通过自定义 Deno.HttpClient 来为 fetch 指定客户端证书和私钥。

const client = Deno.createHttpClient({
  certChain: Deno.readTextFileSync("./cert.pem"),
  privateKey: Deno.readTextFileSync("./key.pem"),
});
const resp = await fetch("https://example.com/", { client });

感谢 Sean Michael WykesEric Lindvall 实现了此功能。

DENO_AUTH_TOKENS 中的基本认证支持

Deno 允许从需要认证的私有仓库和服务器获取代码,方法是在 DENO_AUTH_TOKENS 环境变量中提供 Bearer 令牌。

从 1.14 版本开始,DENO_AUTH_TOKENS 也接受基本认证,从而可以从更多服务器获取代码。

要指定基本认证数据,请使用 username:password@host 语法,例如

DENO_AUTH_TOKENS=testuser123:testpassabc@127.0.0.1:4554

基本认证数据和 Bearer 令牌可以像这样混合在环境变量中

DENO_AUTH_TOKENS=a1b2c3d4e5f6@deno.land;testuser123:testpassabc@127.0.0.1:4554

感谢 @BasiqueEvangelist 实现了此功能。

URL 解析速度现在提升了 3 倍

几周前,我们收到了一些报告,称我们的 URL 解析速度比 Chrome 等其他引擎慢得多。这是一个影响相对较大的性能问题,因为 URL 解析在 Web 服务器应用程序中是一个非常常见的操作。

我们很高兴地报告,我们的 URL 解析速度现在比 1.13 版本快了 3 倍。这是一个显著的改进,但我们仍在研究未来进一步优化这个热点路径的方法。

现在可以为子进程指定 giduid

子进程 API 获得了一个备受期待的功能,它允许为派生的进程指定用户 ID 和组 ID。

Deno.run({
  cmd: [
    "echo",
    "Hello from root user",
  ],
  uid: 0,
});
Deno.run({
  cmd: [
    "echo",
    "Hello from root group",
  ],
  gid: 0,
});

此功能不稳定,因此需要 --unstable 标志。目前它仅在 Unix 系统上受支持,在 Windows 上会被忽略。

感谢 @crowlKats 实现了此功能。

更快的 std/http 模块

标准库的 0.107.0 版本对 http 模块进行了重大改进。

v1.13 中原生 HTTP 绑定稳定化后,http/server.ts 模块被重写以使用新稳定的 API。结果,性能得到了显著提升,并且提供了一个更友好的 API,可以处理创建可靠 HTTP 服务器的繁琐部分;例如错误处理和连接多路复用。

感谢 Craig Morten 实现了这些更改。

VSCode 扩展更新

官方的 Deno VSCode 扩展获得了一系列更新,包括

  • 使用测试代码透镜时更好的配置支持
  • 捆绑的扩展减少了安装大小并提高了启动时间
  • 调试配置的改进
  • 支持 deno.json/deno.jsonc 配置文件

TypeScript 4.4

Deno 1.14 附带最新的稳定版 TypeScript。有关 TypeScript 新功能的更多信息,请参阅TypeScript 4.4 博客文章

V8 9.4

此版本包含一个新版本的 V8,其中包括许多错误修复,以及一个重要的新功能:类静态初始化块。类可以通过静态初始化块来组织每个类评估时应运行一次的代码。

class C {
  // This block will run when the class itself is evaluated
  static {
    console.log("Why is it always raining in Deno land?");
  }
}

有关静态初始化块的解释器可在 V8 博客上找到。另请参阅 V8 9.4 发布说明