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

Deno 1.26 已经发布,并包含以下新功能和更改

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

deno upgrade

如果您是第一次安装 Deno

# MacOS and Linux
curl -fsSL https://deno.land/x/install/install.sh | sh

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

点击这里 查看更多安装选项。

Cache Web API

在此版本中,我们添加了对 Cache API 的支持。

该 API 允许您缓存 Request/Response 对象。当您动态生成响应时,这很有用。它允许您缓存 GET 请求的响应,并从缓存中为类似的请求提供响应。

以下是一个根据 name 查询生成响应的小示例

import { serve } from "https://deno.land/[email protected]/http/server.ts";

// Open a cache named v1.
const CACHE = await caches.open("v1");

serve(async (req: Request) => {
  // Requests after first request are served from cache.
  const res = await CACHE.match(req);
  if (res) {
    res.headers.set("x-cache-hit", "true");
    return res;
  }

  const { searchParams } = new URL(req.url);
  const name = searchParams.get("name");
  const response = new Response(`Hello ${name}!`);
  // Put response in cache.
  await CACHE.put(req, response.clone());
  return response;
});

缓存会持久化到文件系统中。因此,重启 Deno 不会清除缓存。

以下 API 已实现

与浏览器相比,有以下几点不同

  1. 您不能将相对路径传递给 API。请求可以是 Request 或 URL 的实例,也可以是 url 字符串。
  2. match() & delete() 还不支持 查询选项

WebCrypto 安全曲线

WebCrypto 安全曲线 规范为 WebCrypto API 添加了对 Curve25519 和 Curve448 的支持。

Deno v1.26 实现了 CFRG 曲线 Ed25519 和 X25519。

const key = await crypto.subtle.generateKey("X25519", true, ["deriveKey"]);

我们计划在未来的版本中添加对 Ed448 和 X448 的支持。

--allow-sys 权限标志

Deno 有许多 API 可以提供有关用户操作系统的的信息,例如 Deno.osRelease()Deno.systemMemoryInfo()

以前访问这些 API 需要 --allow-env 标志,这很不幸,因为它意味着您必须授予读取所有环境变量的权限才能访问有关操作系统的的信息。

Deno v1.26 引入了新的 --allow-sys 权限标志,它可以保护对这些 API 的访问,这意味着您不再需要也提供对环境变量的访问权限。

以下 API 需要 --allow-sys 标志

  • Deno.hostname()
  • Deno.networkInterfaces()
  • Deno.loadavg()
  • Deno.getUid()
  • Deno.getGid()
  • Deno.osRelease()
  • Deno.systemMemoryInfo()

与其他权限标志类似,您可以通过提供 API 的允许列表来细粒度地授予对 API 的访问权限,例如 --allow-sys=hostname,osRelease

对 npm 支持的改进

此版本修复了许多与 npm 说明符相关的错误,并添加了一些新功能。对 npm 模块的支持仍然是实验性的,需要 --unstable 标志。

--node-modules-dir 标志

npm 说明符将 npm 包解析到一个中心全局 npm 缓存。这在大多数情况下都能正常工作,而且是理想的,因为它占用空间更少,不需要 node_modules 目录。也就是说,您可能会发现某些情况下 npm 包期望它从 node_modules 目录中执行。为了提高兼容性并支持这些包,添加了新的 --node-modules-dir 标志。

例如,给定 main.ts

import chalk from "npm:chalk@5";

console.log(chalk.green("Hello"));

使用 --node-modules-dir 运行此脚本,如下所示…

deno run --unstable --node-modules-dir main.ts

…将在当前目录中创建一个 node_modules 文件夹,其文件夹结构类似于 pnpm

Screenshot showing a node_modules directory with the chalk package

请注意,当调用 deno run 时,所有这些都会自动完成,不需要单独的安装命令。

在您想要在执行之前修改 node_modules 目录的内容的情况下,您可以使用 --node-modules-dir 运行 deno cache,修改内容,然后运行脚本。例如

deno cache --unstable --node-modules-dir main.ts
deno run --allow-read=. --allow-write=. scripts/your_script_to_modify_node_modules_dir.ts
deno run --unstable --node-modules-dir main.ts

--reload=npm:--reload=npm:<package>

--reload 标志会重新加载之前缓存的外部资源。此版本添加了更针对性的 --reload=npm:--reload=npm:<package> 支持。

例如,要重新加载所有 npm 包,请在运行脚本时使用 --reload=npm: 标志

deno run --unstable --reload=npm: main.ts

或者,要重新加载单个包,例如 chalk

deno run --unstable --reload=npm:chalk main.ts

--compat 模式已移除

为了不使用两种不同的执行模式,不稳定的 --compat 模式已被弃用,转而使用 npm 说明符。

未来的改进

我们将继续致力于 npm 支持,并在接下来的几周内完成 TypeScript 和编辑器集成。有关我们完整的 npm 说明符路线图,请参见 https://github.com/denoland/deno/issues/15960

Node.js 兼容性改进

Deno v1.26 在 Node.js 兼容层中包含了对之前不支持的几个 API 的实现。此外,整个兼容层的测试套件已更新,以支持 Node.js v18.8.0。之前,测试套件的目标是 Node.js v16.13.0。此更改是为了准备 Node.js 18 在 10 月份进入长期支持 (LTS)。

请注意,整个 Node.js 兼容层仍然需要使用 --unstable 标志。

流重构

Deno 中的 Node.js 流实现已更新为使用 [email protected] npm 模块。此更改将使 Deno 能够更好地跟上重大更改和新功能。有关此决定的更多背景信息,请参见 这篇博文

在兼容层中,streamstream/promises 模块现在通过 readable-stream 实现。此重构还引入了几个新的 API,包括 Readable.toWeb()Writable.toWeb()Duplex.toWeb(),这些 API 用于将各种类型的 Node.js 流转换为 Web 流。

fs.ReadStreamfs.WriteStream 实现也已更新,以提高与 Node.js 中的实现的兼容性。感谢 @PolarETech 完成了这项工作。

child_process APIs

child_process 模块添加了对 spawnSync()exec()execSync()execFileSync() 的支持。

感谢 @iuioiua@PolarETech 分别贡献了 spawnSync()exec()

process.getuid()process.getgid()

在非 Windows 平台上,可以通过 process.getuid()process.getgid() 访问进程的用户标识符和组标识符。在 Windows 上,此功能不存在,这些方法为 undefined

感谢 @iuioiua 贡献了此功能。

Deno API 的更改

API 稳定性

以下 API 在此版本中已稳定,不再需要使用 --unstable 标志。

  • Deno.hostname()
  • Deno.refTimer()
  • Deno.unrefTimer()

不稳定的 Deno.stdin.setRaw() API

在此版本中,不稳定的 Deno.setRaw(rid) API 已被删除,取而代之的是 Deno.stdin.setRaw()。我们计划在下个次要版本中稳定此 API。

Deno.serve() API 的改进

我们收到了很多关于新的不稳定的 Deno.serve() API 的正面反馈,该 API 提供了快速的 HTTP 服务器。

在此版本中,我们修复了几个已报告的错误,例如 Windows 上的虚假挂起、并发请求的阻塞或部分写入。

我们继续改进我们的服务器实现,并希望在 Deno v1.27 中稳定此 API。

性能改进

在过去的几个版本中,我们一直在不断改进性能,作为内部计划的一部分,以找出瓶颈并尽可能减少延迟和处理开销。我们将在不久的将来详细介绍这项工作,所以请关注博客以获取更新。同时,我们可以分享一些我们进行的比较 v1.24.3 版本与最新版本的基准测试。

文本编码到现有 TypedArray 中,对于小负载的最大吞吐量提高了 5 倍,对于大负载则提高了 30 倍。请参见 denoland/deno#15922

TextEncoder.encodeInto Performance Improvement

写入小文件现在对于同步写入 (Deno.writeFileSync()) 快了 1.44 倍,对于异步写入 (Deno.writeFile()) 快了 1.15 倍。

Deno.writeFile Performance Improvement

CSV 解析性能最近因我们在文本编码/解码方式上做出的更改而下降。我们正在努力进行更大的改进,但此版本在 Mac 上提升了 1.36 倍,在 Linux 上提升了 1.19 倍,这是我们进行的基准测试的结果。

CSV Performance Improvement

URL 解析现在对于没有查询字符串的 Url 快了 2.27 倍,对于具有多个查询字符串参数的更复杂的 Url 快了 1.37 倍。请参见 denoland/deno#15663

URL Parsing Performance Improvement

最近对文件系统操作进行了一些改进,还有更多改进即将到来。这是您在本版本中与 v1.24.3 版本相比应该看到的改进总结。在 MacOS 上,Deno.copyFileSync 现在尽可能使用 APFS 的 copy-on-write clonefile 系统调用。请参见 denoland/deno#15873

FileSystem Performance Improvement

console.log() 现在对于小负载快了 5 倍!denoland/deno#15931

Console Performance Improvement

TTY 方法(如 Deno.consoleSize)与 v1.24.3 版本相比快了 2.4 倍。denoland/deno#15976

TTY Performance Improvement

改进的模块下载 UI

Deno 有了一个新的交互式“下载...”消息显示。

在非 TTY 环境中,Deno 将回退到以前的方式,在单独的行上显示“下载...”以表示每个文件。

开发者体验改进

最近所述,我们一直在致力于使 Deno 拥有最流畅的开发者体验。在过去的一段时间里,我们有一个团队专注于此,他们一直在解决的一个领域是发现。Deno 和更广泛的 JavaScript/TypeScript 生态系统非常庞大,而且导航起来可能很复杂,我们试图让您更容易找到您要找的东西。

我们最近做了一些更改,试图改善这种体验,包括

  • deno.land 上的搜索功能进行了彻底的修改,可以在 手册第三方模块 中进行搜索,并能够在 内置 API、Deno 标准库 (std) 和所有第三方模块中搜索符号。
  • 根据实际代码使用情况对搜索结果进行排名,并对 deno.land/x 上的第三方模块列表进行排序。以前,这是根据 GitHub 星标进行排名的,这提供了一个非常扭曲的 Deno 第三方生态系统视图。
  • 内置 API 的文档集成到 deno.land 中,将每个 API 分类,以帮助更容易地发现 Deno 内置功能的广度。
  • 每个第三方模块都有一个信息丰富的登录页面和集成的自动生成的文档。例如,查看 oak 的文档。
  • 搜索引擎和社交媒体索引、发现和分享文档的方式得到改进。仅仅改善deno.land上的搜索可能无法让所有尝试发现 Deno 或尝试分享 Deno 信息的人受益。
  • 我们加深了对 Deno 生态系统行为和连接方式的理解。我们一直在深入研究可用数据,以不断识别信息差距并持续改进发现体验。

即将推出的功能

  • 在文档内的符号之间自动链接,包括符号和文档之间的链接。这将使探索模块或 API 变得更容易。
  • 在每个第三方模块的着陆页上提供依赖项列表,便于了解第三方模块的连接方式。
  • 提供有关第三方模块的流行度、质量和维护的更多信息。
  • 从 Deno 的角度查看 npm 生态系统,便于在 Deno 中发现和使用 npm 包。
  • 对手册进行彻底的修订和重构,使其中包含的信息更加清晰,更适合那些发现和探索 Deno 的人。

虽然我们最近一直专注于发现方面,但我们也正在制定计划,重新专注于使智能编辑器体验更上一层楼,以及改进 Deno CLI 中内置工具的体验。

TypeScript 4.8

Deno v1.26 附带最新稳定版本的 TypeScript。有关 TypeScript 新功能的更多信息,请参见TypeScript 的 4.8 博客文章