跳到主要内容
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 带来了两个备受期待的更新。现在可以使用动态导入和 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 的更改

现在在 Windows 上定义了 Deno.FileInfo.dev。这是一个附加的更改,但因此 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 模块以前从 2 个不同的位置导出: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 带来的其他性能优势之外,当不检查远程模块类型时(不使用 –all 标志),Deno 的初始类型检查速度也显着加快。此增强功能在大多数情况下尤其有助于减少 CI 上的类型检查时间。确切的节省时间取决于您的依赖项中远程模块的数量,但我们观察到类型检查速度提高了 2 倍以上(例如,将时间从 2200 毫秒减少到 600 毫秒)。

V8 11.2

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

此升级提供了一些令人兴奋的新 JavaScript 功能