跳转至主要内容
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/std@0.158.0/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 标志。

Streams 重构

Deno 中的 Node.js streams 实现已更新为使用 readable-stream@4.1.0 npm 模块。此更改将使 Deno 能够更好地跟上破坏性更改和新功能。有关此决策的更多背景信息,请参阅 这篇博客文章

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

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

child_process API

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,URL 解析速度提高了 1.37 倍。请参阅 denoland/deno#15663

URL Parsing Performance Improvement

最近文件系统操作进行了一些改进,未来还会有更多改进。这是与 v1.24.3 相比,您在此版本中应该看到的改进摘要。在 MacOS 上,Deno.copyFileSync 现在尽可能使用 APFS 的写时复制 clonefile 系统调用。请参阅 denoland/deno#15873

FileSystem Performance Improvement

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

Console Performance Improvement

与 v1.24.3 相比,TTY 方法(如 Deno.consoleSize)的速度提高了 2.4 倍。denoland/deno#15976

TTY Performance Improvement

改进的模块下载 UI

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

在非 TTY 环境中,Deno 将回退到以前的方式,即为每个文件在单独的行上显示 “Download …”。

开发者体验改进

正如 最近提到的,我们一直专注于使 Deno 成为最流畅的开发者体验。过去一段时间,我们有一个团队专注于此,他们一直在解决的领域之一是围绕发现。Deno 和更广泛的 JavaScript/TypeScript 生态系统非常庞大,并且导航起来可能很复杂,我们已尽力让您更容易找到您正在寻找的内容。

我们最近更改了一些内容,以努力使体验更好,其中包括

  • 全面改进了 deno.land 上的搜索功能,提供跨 手册第三方模块的搜索,以及跨 内置 API、Deno 标准库 (std) 和所有第三方模块搜索符号的能力。
  • 对搜索结果进行排名,并按实际代码使用情况对 deno.land/x 上的第三方模块列表进行排序。以前,这是按 GitHub 星星数排名的,这提供了 Deno 第三方生态系统非常片面的视图。
  • deno.land 上集成了 内置 API 的文档,对每个 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 博客文章