Deno 1.5 版本发布说明
今天我们发布 Deno 1.5.0 版本。此版本包含一些新功能、许多功能稳定化以及大量的错误修复。以下是一些亮点
- 全新且改进的打包功能:
deno bundle
现在具有 tree shaking 功能,并且比 1.4 版本快 15 倍 - 新增
alert
、confirm
和prompt
:与用户交互的 Web 兼容提示 API - REPL 的改进:现在可以使用 tab 补全、代码语法高亮和顶层 await
如果您已经安装了 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 倍。
除了性能改进之外,打包器现在还能够对您的代码进行 tree shaking。这意味着它将从 bundle 中删除您实际上没有使用的代码。这导致 bundle 的大小大幅减小。例如,与 1.4 相比,1.5 中的 file_server 示例 的 bundle 小了 35%。
Bundle 现在也作为标准 ES 模块发出,这意味着动态导入现在可以正确工作,并且 import.meta.url
也被正确设置。如果您过去使用 Deno 为浏览器打包代码,请确保现在将 bundle 作为 ES 模块加载(在您的 <script>
标签上使用 type="module"
属性)。
alert
、confirm
和 prompt
新增 此版本添加了 Web 平台 API alert
、confirm
和 prompt
。它们的功能与在浏览器中相同
alert
将消息记录到终端,然后同步阻塞,直到您确认(使用[Enter]
键)。confirm
向用户显示一条消息提示,然后同步阻塞,直到用户回复y
或n
(表示yes
或no
)。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,而无需将调用包装在 async 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
中的 assertStringContains
和 assertArrayContains
方法已分别重命名为 assertStringIncludes
和 assertArrayIncludes
,以匹配字符串和数组上 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
中还添加了 assertExists
和 assertObjectMatch
断言。
assertExists
断言传递的值不是null
或undefined
。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 找到。