Deno 1.30:内置 Node 模块
Deno 1.30 已标记并发布,其中包含以下新功能和更改
📝 通过填写我们的调查问卷来帮助改进 Deno 并有机会赢得 100 美元的亚马逊礼品卡。
如果您已安装 Deno,则可以通过运行以下命令升级到 1.30
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 中,npm 包已经可以通过 Deno 的 Node.js 兼容层访问内置 Node.js 模块,例如 fs、path、process 等。
在此版本中,这些模块通过 node:
指定符公开给 Deno 代码。
import { readFileSync } from "node:fs";
console.log(readFileSync("deno.json", { encoding: "utf8" }));
请注意,在没有导入映射的情况下,通过裸指定符(例如 import { readFileSync } from "fs";
)进行导入不受支持。如果您尝试这样做,并且裸指定符与导入映射中未找到的 Node.js 内置模块匹配,Deno 将提供一个有用的错误消息,询问您是否打算使用 node:
前缀进行导入。此外,LSP 提供了一个快速修复,以便更新到 node:
指定符。
如果您同时使用 Deno 和 Node.js 代码,node:
方案将在两种运行时中都能工作,建议您为 Node.js 代码也更新到它们。
deno.json
成为导入映射
此版本对配置文件进行了重大更新 - 现在可以将 deno.json
文件直接用作导入映射。在之前的版本中,可以通过指定包含导入映射文件路径的 importMap
键来告诉 Deno 在哪里查找导入映射文件。许多用户发现它很有用,但是这种方法意味着有两个配置文件。为了使其更简洁,现在可以在配置文件中指定 imports
和 scopes
键,Deno 会自动将配置文件视为导入映射。
示例 deno.json
{
"imports": {
"std/": "https://deno.land/[email protected]/"
}
}
然后,以下具有 std
裸指定符的脚本将起作用
import { assertEquals } from "std/testing/assert.ts";
assertEquals(1, 2);
Node/npm 和 LSP 修复
此版本包含 25 个以上与 npm 功能和 Node-API相关的错误修复。此外,LSP 继续改进,修复了 10 个以上错误。有关完整列表,请参阅 发行说明。
Deno
API 的更改
对 对稳定 API 的更改
Deno.permissions
API 获取同步对应项Deno.permissions.querySync({ name: "read", path: "./log.txt" }); Deno.permissions.revokeSync({ name: "read", path: "./log.txt" }); Deno.permissions.requestSync({ name: "read", path: "./log.txt" });
感谢 Asher Gomez 实现此功能。
Deno.writeFile()
和Deno.writeTextFile()
现在接受ReadableStream
作为第二个参数。const stream = new ReadableStream({ pull(controller) { controller.enqueue(new Uint8Array([1])); controller.enqueue(new Uint8Array([2])); controller.close(); }, }); await Deno.writeFile("/tmp/test.txt", stream); assertEquals(Deno.readFileSync(filename), new Uint8Array([1, 2]));
添加了新的
Deno.env.has(name)
APIDeno.env.set("TEST_VAR", "A"); assert(Deno.env.has("TEST_VAR")); Deno.env.delete("TEST_VAR"); assert(!Deno.env.has("TEST_VAR"));
Deno.Seeker
API 获取对bigint
偏移量的支持。现在可以将
bigint
类型用作Seeker
接口的参数const file = await Deno.open("./log.txt"); const cursor = await file.seek(150n, Deno.SeekMode.Start);
测试步骤可以是函数
以前,使用测试步骤 API 需要测试步骤的第一个参数是名称或测试定义
Deno.test("my test", async (t) => { const success = await t.step("step1", async () => { await t.step(function inner1() {}); await t.step(function inner1() {}); }); if (!success) throw new Error("Expected the step to return true."); });
从本版本开始,第一个参数也可以是命名函数
Deno.test("my test", async (t) => { const success = await t.step(async function step1() { await t.step(function inner1() {}); await t.step(function inner1() {}); }); if (!success) throw new Error("Expected the step to return true."); });
API 稳定化
Deno.Listener.ref()
和 Deno.Listener.unref()
现在已稳定。使用这些 API 不再需要 --unstable
标志。
对不稳定 API 的更改
在
new Deno.Command({}).spawn()
中,stdin
选项的默认值已更改为"inherit"
- 意味着如果您没有专门配置此选项,标准输入将从父进程继承。Deno.dlopen
添加了对按值传递结构体的支持const Rect = ["f64", "f64", "f64", "f64"]; const dylib = Deno.dlopen("./dylib.so", { make_rect: { parameters: ["f64", "f64", "f64", "f64"], result: { struct: Rect }, }, }); const rect_sync = dylib.symbols.make_rect(10, 20, 100, 200); assertInstanceOf(rect_sync, Uint8Array); assertEquals(rect_sync.length, 4 * 8); assertEquals(Array.from(new Float64Array(rect_sync.buffer)), [ 10, 20, 100, 200, ]);
感谢 @DjDeveloperr 和 Aapo Alasuutari 实现此功能。
新的不稳定 API
此版本添加了 3 个新的 API
Deno.osUptime()
(需要--allow-sys=osUptime
权限)Deno.Conn.ref()
Deno.Conn.unref()
这些 API 需要 --unstable
标志,但我们计划在下一个版本中稳定它们。
感谢 Kamil Ogórek 实现此功能。
Deno.core
删除内部 此版本删除了 Deno.core
命名空间。Deno.core
是一个私有 API,没有稳定性保证。此更改对大多数用户没有影响。
deno fmt
支持配置分号
deno fmt
的一个长期反复请求的功能是能够在不使用分号的情况下进行格式化。现在可以通过使用 --options-no-semicolons
标志或在 Deno 配置文件中指定 "semiColons": false
来实现这一点
{
"fmt": {
"options": {
"semiColons": false
}
}
}
📝 通过填写我们的调查问卷来帮助改进 Deno 并有机会赢得 100 美元的亚马逊礼品卡。