跳至主要内容
Deno 2 终于来了 🎉️
了解更多
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 Worker 和动态导入

此版本为 deno compile 带来了两个备受期待的更新。现在可以使用动态导入和 Web Worker API,以及使用 deno compile 子命令创建的二进制文件。两者一起使多线程程序更易于使用 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 上的类型检查时间。确切的节约时间取决于依赖项中的远程模块数量,但我们观察到类型检查速度提高了 2 倍以上(例如,将时间从 2200 毫秒减少到 600 毫秒)。

V8 11.2

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

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