Deno 1.32:增强的 Node.js 兼容性
一个严重的安全问题。请升级到 1.32.1。
🚨 Deno 1.32.0 包含
Deno 1.32 已被标记发布,包含以下新功能和变更
- 增强的 Node.js 兼容性
deno compile
支持 Web Workers 和动态导入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 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.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 类型检查时间减少尤其有影响力。具体的节省时间取决于您依赖项中远程模块的数量,但我们观察到类型检查速度提高了两倍以上(例如,将时间从 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
)