跳到主要内容
Deno 2.4 来了,带来了 deno bundle、bytes/text 导入、稳定的 OTel 等更多功能
了解更多
Deno 1.32

Deno 1.32:增强的 Node.js 兼容性

🚨 Deno 1.32.0 包含一个严重的安全问题。请升级到 1.32.1。


Deno 1.32 已被标记发布,包含以下新功能和变更


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

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

有关更多安装选项,请点击此处

增强的 Node.js 兼容性

Deno 在提高与 Node.js 的兼容性方面持续取得显著进展,提供了更流畅的整体开发者体验。此版本中的关键增强功能包括

  • 限制包安装:包安装现在仅限于代码使用与 package.json 文件中的条目匹配的裸说明符的情况。
  • 延迟错误呈现:package.json 中的依赖解析错误现在以延迟方式呈现,从而最大程度地减少中断。
  • 受控自动发现:当设置了 --no-config--no-npm 标志时,将禁用 package.json 自动发现,从而对过程提供更大的控制。
  • 新环境变量:新的 DENO_NO_PACKAGE_JSON 环境变量允许您完全阻止 Deno 在环境中解析 package.json 文件。
  • 扩展的加密支持:已添加对 "node:crypto"createCipherivcreateDecipheriv API 的支持,扩展了可用的加密函数范围。

这些有针对性的可用性改进共同促进了在使用 Deno 和 Node.js 时更无缝和高效的开发体验。

deno compile 支持 Web Workers 和动态导入

此版本为 deno compile 带来了两项备受期待的更新。现在,可以使用 deno compile 子命令创建的二进制文件来使用动态导入和 Web Worker API。这使得多线程程序更容易通过 deno compile 构建。

如果您的动态导入语句是静态可分析的(换句话说,如果您在 import() 内部使用了字符串字面量),则这些说明符将自动包含在生成的二进制文件中。

// main.js
const dynamicModule = await import("./dynamic_module.js");

console.log(dynamicModule.hello());
// dynamic_module.js
export function hello() {
  return "hello world!";
}
$ deno compile -o dynamic_import_example main.js
Compile file:///dev/main.js
Emit dynamic_import_example
$ ./dynamic_import_example
hello world!

对于说明符无法静态分析的情况,您可以使用新的 --include 标志来指定要包含在二进制文件中的其他文件。此标志可以多次使用。

// main.js
const worker1 = new Worker(import.meta.resolve("./worker1.js"), {
  type: "module",
});

worker1.postMessage("hello from main!");
worker1.onmessage = (e) => {
  console.log("main received", e.data);
  worker1.terminate();
};

const worker2 = new Worker(import.meta.resolve("./worker2.js"), {
  type: "module",
});

worker2.postMessage("hello from main!");
worker2.onmessage = (e) => {
  console.log("main received", e.data);
  worker2.terminate();
};
// worker1.js
self.onmessage = (e) => {
  console.log("worker1 received:", e.data);
  self.postMessage("hello from worker1!");
};
// worker2.js
self.onmessage = (e) => {
  console.log("worker2 received:", e.data);
  self.postMessage("hello from worker2!");
};
$ deno compile --include worker1.js --include worker2.js -o worker_example main.js
Compile file:///dev/main.js
Emit worker_example
$ ./worker_example
worker1 received: hello from main!
main received hello from worker1!
worker2 received: hello from main!
main received hello from worker2!

感谢 Andreu Botella 贡献了这些功能。

deno run 运行无扩展名的文件

现在可以通过 --ext 标志指定文件扩展名来运行无扩展名的文件。

$ cat my_script
#!/usr/bin/env -S deno run --ext=js

console.log("Hello!");
$ ./my_script
Hello!

感谢 @Cre3per 贡献了此功能。

Deno API 变更

Deno.FileInfo.dev 现在在 Windows 上有定义。这是一个增量变更,但因此 Deno.FileInfo.dev 字段的类型从 number | null 更改为 number

增加了两个新的不稳定 API:Deno.DatagramConn.joinMulticastV4Deno.DatagramConn.joinMulticastV6。(感谢 Sam Gwilym 贡献此功能。)

Web API 变更

现在支持 URLSearchParams.size()。(感谢 Lino Le Van 贡献此功能。)

不稳定的 WebGPU API 已移除。支持 WebGPU 引入的开销使得 deno 二进制文件更大,并且对于所有用户(即使他们不使用它)启动速度更慢。此版本移除了不稳定WebGPU API,同时可以研究不增加启动时间的实现方案。

标准库变更

模块结构的破坏性变更

此版本中,std/encoding 类别下的以下 6 个模块已移动到标准库的顶层。

  • std/encoding/csv 已移动到 std/csv
  • std/encoding/yaml 已移动到 std/yaml
  • std/encoding/toml 已移动到 std/toml
  • std/encoding/json 已移动到 std/json
  • std/encoding/jsonc 已移动到 std/jsonc
  • std/encoding/front_matter 已移动到 std/front_matter

进行这些更改是为了提高标准库中模块/目录结构的一致性。例如,以前 csv 模块是从两个不同的地方导出的:std/encoding/csv.tsstd/encoding/csv/stream.ts。现在 csv 从单一位置 std/csv/mod.ts 导出(并且每个单独的 API 都从其对应的文件导出。有关详细信息,请参阅API 文档)。我们认为这种结构更加一致。如果您对更多详细信息感兴趣,请参阅讨论问题(1 2)。

感谢 Asher Gomez 为此付出的努力,也感谢 Tim ReichenLino Le Van 参与讨论。

TypeScript 5.0

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

请注意,ES 装饰器尚未受支持,但我们将在未来的版本中努力默认启用它们。

性能改进: 除了 TypeScript 5.0 带来的其他性能优势外,Deno 在不检查远程模块类型时(不使用 –all 标志)的初始类型检查速度显著加快。这一增强功能对于大多数情况下的 CI 类型检查时间减少尤其有影响力。具体的节省时间取决于您依赖项中远程模块的数量,但我们观察到类型检查速度提高了两倍以上(例如,将时间从 2200 毫秒减少到 600 毫秒)。

V8 11.2

此版本升级到最新版本的 V8 (11.2,之前是 11.0)。

此次升级带来了一些令人兴奋的新 JavaScript 功能