Deno 1.32: 增强 Node.js 兼容性
一个严重的安全问题。请升级到 1.32.1。
🚨 Deno 1.32.0 包含
Deno 1.32 已经发布,包含以下新功能和更改
- 增强 Node.js 兼容性
deno compile
支持 Web Worker 和动态导入- Deno API 的变更
- Web API 的变更
- 标准库的变更
- TypeScript 5.0
- V8 11.2
如果您已经安装了 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"
中添加了对createCipheriv
和createDecipheriv
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.joinMulticastV4
和 Deno.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.ts
和 std/encoding/csv/stream.ts
。现在,csv
从单个位置 std/csv/mod.ts
导出(每个单个 API 也从其相应的文件导出。有关详细信息,请参见 API 文档)。我们认为这种结构更一致。如果您想了解更多详细信息,请参阅讨论问题 (1 2)。
感谢 Asher Gomez 为此做出贡献,还要感谢 Tim Reichen 和 Lino 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 功能
String.prototype.isWellFormed
和String.prototype.toWellFormed
- 使用集合符号的
RegExp
v
标志 + 字符串属性 WebAssembly
尾调用- 实验性
WebAssembly
垃圾回收 (WasmGC) 支持(需要--v8-flags=--experimental-wasm-gc
)