跳至主要内容
Deno 2 终于来了 🎉️
了解更多
Deno 1.30 ...

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 模块,例如 fspathprocess 等。

在此版本中,这些模块通过 node: 指定符公开给 Deno 代码。

import { readFileSync } from "node:fs";

console.log(readFileSync("deno.json", { encoding: "utf8" }));

请注意,在没有导入映射的情况下,通过裸指定符(例如 import { readFileSync } from "fs";)进行导入不受支持。如果您尝试这样做,并且裸指定符与导入映射中未找到的 Node.js 内置模块匹配,Deno 将提供一个有用的错误消息,询问您是否打算使用 node: 前缀进行导入。此外,LSP 提供了一个快速修复,以便更新到 node: 指定符。

A screenshot of an editor showing the bare specifier to node: specifier quick fix.

如果您同时使用 Deno 和 Node.js 代码,node: 方案将在两种运行时中都能工作,建议您为 Node.js 代码也更新到它们。

deno.json 成为导入映射

此版本对配置文件进行了重大更新 - 现在可以将 deno.json 文件直接用作导入映射。在之前的版本中,可以通过指定包含导入映射文件路径的 importMap 键来告诉 Deno 在哪里查找导入映射文件。许多用户发现它很有用,但是这种方法意味着有两个配置文件。为了使其更简洁,现在可以在配置文件中指定 importsscopes 键,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) API

    Deno.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,
    ]);

    感谢 @DjDeveloperrAapo 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 美元的亚马逊礼品卡。