跳到主要内容
Deno 2.4 发布,带来 deno bundle、字节/文本导入、OTel 稳定版等新特性
了解更多

Deno 1.5 发布说明

今天我们发布了 Deno 1.5.0。此版本包含一些新功能、许多功能稳定性改进以及大量的错误修复。以下是一些亮点

如果您已安装 Deno,可以通过运行 deno upgrade 升级到 1.5。如果您是首次安装 Deno,可以使用下面列出的方法之一

# Using Shell (macOS and Linux):
curl -fsSL https://deno.land/x/install/install.sh | sh

# Using PowerShell (Windows):
iwr https://deno.land/x/install/install.ps1 -useb | iex

# Using Homebrew (macOS):
brew install deno

# Using Scoop (Windows):
scoop install deno

# Using Chocolatey (Windows):
choco install deno

新功能和变更

改进的打包功能

自上次发布以来,我们一直在努力重构整个 TypeScript 编译器基础设施。因此,我们能够用基于 swc 的新打包器替换我们老化的打包基础设施。

这使得在进行类型检查时,性能提升了 3 倍;如果使用 --no-check 标志,性能最高可提升 15 倍

除了性能提升,打包器现在还能够对您的代码进行摇树优化。这意味着它将从打包文件中移除您未实际使用的代码。这大大减小了打包文件的大小。例如,与 1.4 版本相比,file_server 示例 的打包文件在 1.5 版本中小了 35%

打包文件现在也以标准 ES 模块的形式输出,这意味着动态导入现在将正常工作,并且 import.meta.url 也已正确设置。如果您使用 Deno 为浏览器打包代码,请确保现在将打包文件作为 ES 模块加载(在您的 <script> 标签上添加 type="module" 属性)。

新增 alertconfirmprompt

此版本添加了 Web 平台 API alertconfirmprompt。它们具有与在浏览器中相同的功能

  • alert 将消息记录到终端,然后同步阻塞,直到您确认(按 [Enter] 键)。
  • confirm 向用户显示一条消息,然后同步阻塞,直到用户响应 yn(表示 yesno)。
  • prompt 请求用户输入一些内容,并同步阻塞,直到用户输入文本并按下 [Enter] 键。

这是一个这些函数实际应用的演示。您可以运行 deno run https://deno.org.cn/v1.5/alert_confirm_prompt.js 来试用。

let name = "";

while (true) {
  name = prompt("What is your name?");

  if (confirm(`Are you sure ${name} is your name?`)) {
    break;
  }
}

alert(`Hello ${name}!`);

REPL 改进

REPL 经过重大重构,支持了多项新功能。以下是一些亮点

  • 对象属性和方法的 Tab 补全:要使用此功能,只需按下 Tab 键即可在属性和方法列表中循环选择。
  • 代码语法高亮:如果您使用的终端支持颜色,您输入的代码现在会进行语法高亮显示。您可以通过设置 NO_COLOR 环境变量来禁用此功能。
  • 顶层 await 支持:您现在可以直接在 REPL 中 await Promise,而无需将调用包裹在异步 IIFE 中。

稳定版中更严格的类型检查

此版本默认对所有用户启用 isolatedModules TypeScript 编译器选项。在 1.4 版本中,此标志仅对使用 --unstable 的用户启用。此选项在 TypeScript 编译器中启用了一些更严格的检查,这可能会导致一些您以前未见过的新错误

ERROR TS1205: Re-exporting a type when the '--isolatedModules' flag is provided requires using 'export type'.

当接口或类型别名被重新导出时,会发生这些错误。要修复此错误,请将您的重新导出更改为使用 export type。例如

// Bad
export { MyType } from "./mod.ts";

// Good
export type { MyType } from "./mod.ts";

目前,您可以在 tsconfig.json 中覆盖此选项。

Deno API 新增和稳定化

我们已经稳定了 Deno.fsync()Deno.fdatasync() 及其同步对应方法。这些低级方法用于确保修改后的文件数据写入磁盘驱动器。

此外,还引入了两个新的非稳定版 API 到 --unstable

  • Deno.sleepSync() - 此函数可用于同步休眠。这将阻塞事件循环,从而阻塞所有异步操作和 JavaScript 执行。在大多数情况下,您会希望使用 setTimeout 进行休眠,因为它不会阻塞事件循环。
  • Deno.systemCpuInfo() - 此函数可用于获取机器中可用核心数量以及 CPU 速度的信息。

deno lint 更新

deno lint 在此版本中增加了一些新规则。主要的一条是 camelcase:它检查您的所有变量声明是否都使用 camelCase 格式。我们希望在 Deno 1.6 中稳定 deno lint

除了新规则之外,我们还为 lint 诊断引入了提示。这些提示将建议如何修复 lint 错误。

最后,deno lint 现在有了一个网站,您可以在其中查看规则的文档和解释。您可以在 https://lint.deno.land 找到它。

deno fmt --ignore 现已稳定

deno fmt --ignore 标志现在无需 --unstable 标志即可使用。此标志可用于忽略某些文件或文件夹,使其不被格式化程序格式化或检查。

std 变更

std/testing/asserts.ts 中的 assertStringContainsassertArrayContains 方法已分别重命名为 assertStringIncludesassertArrayIncludes,以与字符串和数组上的 includes 方法命名保持一致。要更新您的代码,只需重命名导入的方法即可

- import { assertStringContains, assertArrayContains } from "https://deno.land/std@0.74.0/testing/asserts.ts";
-
- assertStringContains("denosaur", "deno")
- assertArrayContains(["deno", "new", "release"], "new")
+ import { assertStringIncludes, assertArrayIncludes } from "https://deno.land/std@0.75.0/testing/asserts.ts";
+
+ assertStringIncludes("denosaur", "deno")
+ assertArrayIncludes(["deno", "new", "release"], "new")

除了这次重命名,std/testing/asserts.ts 中还添加了 assertExistsassertObjectMatch 断言。

  • assertExists 断言传入的值不是 nullundefined
    assertExists("foo"); // passes
    assertExists(""); // passes
    assertExists(0); // passes
    assertExists(null); // throws
    assertExists(undefined); // throws
  • assertObjectMatch 断言 expected 值是 actual 值的子集。
    assertObjectMatch({ a: "b", c: "d" }, { a: "b", c: "d" }); // passes
    assertObjectMatch({ a: "b", c: "d" }, { a: "b" }); // passes
    assertObjectMatch({ a: "b", c: "d" }, { a: "b", c: "f" }); // throws
    assertObjectMatch({ a: "b" }, { a: "b", c: "d" }); // throws

完整的发布说明,包括错误修复,可在 https://github.com/denoland/deno/releases/tag/v1.5.0 查看。

HN 评论