跳至主要内容
Deno 2 终于来了 🎉️
了解更多

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 和“原始”格式导出。
    • RSA 密钥现在可以以 pkcs#8 格式导出。
  • crypto.subtle.importKey():
    • HMAC 密钥现在可以以 JWK 和“原始”格式导入。
    • RSA 密钥现在可以以 pkcs#8 格式导入。
    • PBKDF2 密钥现在可以以“原始”格式导入。
  • 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 将在启用所有 recommended lint 规则的情况下运行。

现在,可以使用 --rules-exclude--rules-include--rules-tags 来排除规则,或包含不在 recommended 集合中的特定规则(如 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 架构文件

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 标志。

工作线程之间零拷贝 ArrayBuffer 传输

此版本引入了在工作线程之间传输 ArrayBuffer 的功能,而无需进行复制。这可以显著加快大型缓冲区的传输速度。

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

文件锁定 API

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

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

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

感谢 Tilman Roeder 实现此功能。

对 OS 信号 API 的更改

1.14 彻底改造了不稳定的 OS 信号 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:[email protected]:4554

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

[email protected];testuser123:[email protected]: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 发行说明