跳至主要内容
Deno 2 终于来了 🎉️
了解更多
Deno 1.27 Release Notes

Deno 1.27:主要 IDE 改进

Deno 1.27 已标记并发布,其中包含以下新功能和更改

如果您已安装 Deno,则可以通过运行以下命令升级到 1.27

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

点击这里 获取更多安装选项。

语言服务器/IDE 改进

内联提示

TypeScript 在 4.4 版本中添加了对内联提示的支持; 此 Deno 版本将此功能公开到 LSP。 内联提示是在您的代码中内联添加的小片段信息,显示有关您的代码的信息。 在很多方面,它是一个“内联悬停”。

没有内联提示的代码视图

A screenshot of an editor not displaying any inlay hints.

启用了内联提示的代码视图

A screenshot of an editor displaying inlay hints.

内联提示可以使代码更易读,填补代码中不存在的信息空白。 特别是在使用 TypeScript 或类型检查 JavaScript 时类型推断很常见的情况下,在不降低可读性的情况下,在不显式类型注解的情况下,“查看”隐藏的推断类型而无需将鼠标悬停在变量上以发现它是什么非常有用,以及减少代码中的显式类型注解。

有几个选项可以配置对内联提示的支持,允许您自定义内联提示的工作方式

  • deno.inlayHints.enumMemberValues.enabled - 启用/禁用枚举值的内联提示。 默认值为 false
  • deno.inlayHints.functionLikeReturnTypes.enabled - 启用/禁用隐式函数返回值类型的内联提示。 默认值为 false
  • deno.inlayHints.parameterNames.enabled - 启用/禁用参数名称的内联提示。 值可以是 "none""literals""all"。 默认值为 "none"
  • deno.inlayHints.parameterNames.suppressWhenArgumentMatchesName - 当参数名称与参数匹配时,不要显示内联提示。 默认值为 true
  • deno.inlayHints.parameterTypes.enabled - 启用/禁用隐式参数类型的内联提示。 默认值为 false
  • deno.inlayHints.propertyDeclarationTypes.enabled - 启用/禁用隐式属性声明的内联提示。 默认值为 false
  • deno.inlayHints.variableTypes.enabled - 启用/禁用隐式变量类型的内联提示。 默认值为 false
  • deno.inlayHints.variableTypes.suppressWhenTypeMatchesName - 当变量名称与隐式类型匹配时,抑制类型提示。 默认值为 true
  • editor.inlayHints.enabled - 控制是否在 VS Code 中启用内联提示。 值可以是 "off""offUnlessPressed""on""onUnlessPressed"

Visual Studio Code 支持内联提示,并且最新的 Deno VS Code 扩展 版本支持配置选项。 您需要检查您的编辑器和插件,以了解它们是否支持内联提示以及如何设置配置选项。

注册表补全

虽然与发布本身无关,但我们最近改进了支持它的编辑器中的注册表补全。 现在,当在智能编辑器中键入 deno.land/x 中的第三方模块名称时,将使用为 deno.land 上的模块搜索提供支持的搜索引擎,并提供模块描述和流行度信息。

在完成导入路径时,也有所改进,其中文档信息已集成到显示文本中,并且在将鼠标悬停在导入上时也可以使用。 第三方模块作者可以在模块顶部的第一个 JSDoc 块中使用 @module JSDoc 标记,将此信息一直传送到编辑器。

在 Visual Studio Code 中,默认情况下启用 deno.land/x 的注册表补全。 检查如何在其他编辑器中配置 deno.suggest.imports.hosts 以确保启用 https://deno.land 以获得补全。

观看视频,了解实际操作。

错误修复

此版本中包含几个与语言服务器相关的错误修复。 具体来说,语言服务器没有正确处理现在已修复的“代码段”字符串。 在 JSX 中执行自动导入和代码补全时,出现了一些导致奇怪行为的问题,这些问题现在已修复。

npm 兼容性的改进

此版本继续稳步改进在 Deno 中使用 npm 包的功能。

类型检查和 LSP 支持

Deno 现在将自动从分发类型的 npm 包中引入 TypeScript 类型。

对于未分发类型的包,您可以在导入的上方使用 @deno-types 指令,以便指定相应的 @types(如果存在)

// @deno-types="npm:@types/chalk@4"
import chalk from "npm:chalk@4";

对于需要 @types/node 的包,您可以指定三斜杠引用类型指令,以引入 Node 类型

/// <reference types="npm:@types/node" />

// @deno-types="npm:@types/express@4"
import express from "npm:[email protected]";

请注意,通过这样做,Deno 将使用 Node 的全局类型(例如 setTimeout(...): NodeJS.Timeout),而不是 npm 包类型中的浏览器兼容类型(例如 setTimeout(...): number)。 这些全局变量将被隔离到 npm 包中,不会影响 Deno 代码的类型。

Node-API

Deno 现在在 npm 包中使用时支持 Node-API(以前称为 N-API)。 Node-API 是一种在 Node.js 中使用本机代码的方式。 这意味着像 parcelsqlite3usbfs-xattr 这样的包现在可以与 Deno 一起使用。

请注意,此功能需要 --allow-ffi 标志。

Lockfile v2

使用 lockfile 时,现在将存储 npm 包解析和完整性。

# lock.json will include information about npm packages referenced in main.ts
deno cache --lock=lock.json --lock-write main.ts

请注意,在 1.28 版本中,如果使用 deno.json 文件,我们将默认编写 lockfile。请关注问题 #11971 以获取更新。

npm 说明符中的 dist 标签

npm 注册表允许使用名称对版本进行标记。例如,express 具有一个“next”标签,在撰写本文时,该标签已标记版本 5.0.0-beta.1

您现在可以在 npm 说明符的版本要求中指定这些 dist 标签。

// will import 5.0.0-beta.1 at the time of writing this
import express from "npm:express@next";

请注意,如果 dist 标签出现在包的 package.json 中,则它们仍然不受支持。这是一个错误,很快就会解决。请关注问题 #16321 以获取更新。

通过 `deno cache` 的参数直接缓存 npm 说明符

deno cache 现在支持在命令行上提供 npm 说明符

deno cache --unstable npm:chalk@5 npm:express

这将把包信息和解析后的版本下载到 Deno 的全局 npm 缓存中。

Deno v1.27 添加了 navigator.language API。它是一个只读属性,返回一个字符串,表示用户的系统首选语言。

$ deno
> navigator.language
"en-EN"

表示语言的返回字符串是 BCP 47 标签

此 API 返回的值可能会受到设置系统区域设置的环境变量的影响,例如 LC_ALL

$ LC_ALL=es_ES deno
> navigator.language
"es-ES"

此外,还支持 navigator.languages API。它返回一个首选区域设置数组,第一个值与 navigator.language 相同。

感谢 Luca Matei Pintilie 为此功能做出贡献。

对 `deno task` 的改进

已删除“deno task 不稳定,将来可能会发生巨大变化”的警告。deno task 已被证明有用,并且在将来不会发生巨大变化。也就是说,我们可能会对其环境进行一些更改,以简化未来操作,例如新的跨平台命令或环境变量。

INIT_CWD 环境变量

执行任务时,任务将具有与定义任务的 deno.json 相同的当前工作目录。这在某些情况下可能不希望,或者您可能想知道用户在哪个目录中运行了任务。现在可以通过使用 INIT_CWD 环境变量来实现,如果尚未设置,该变量将使用任务运行的目录的完整路径进行设置。这与 npm run 的相同行为一致。

例如,以下任务将更改任务的当前工作目录,使其位于用户从中运行任务的同一目录中,然后输出当前工作目录,即现在的目录(请记住,这在 Windows 上也有效,因为 deno task 是跨平台的)。

{
  "tasks": {
    "my_task": "cd $INIT_CWD && pwd"
  }
}

任务现在将在异步命令失败时失败

您可能已使用 deno task 通过使用异步命令一次启动多个命令

{
  "tasks": {
    "start": "deno run --allow-net server.ts & deno run --allow-net client.ts"
  }
}

以前,如果异步命令失败,其他命令将继续运行,您可能不会注意到。这与大多数 shell 的工作方式一致,但对于 deno task 的目的而言并不实用。

从本版本开始,如果异步命令失败,它也会使整个任务失败。请注意,如果您希望使用以前的 behavior,可以在命令末尾添加 || true,这将强制执行 0 退出代码

{
  "tasks": {
    "start": "deno run --allow-net server.ts || true & deno run --allow-net client.ts || true"
  }
}

sleep 时间后缀

deno task 中的 sleep 命令现在支持为时间参数提供后缀,如 sleep 的 linux 手册页 中所指定。

感谢 @sigmaSd 为此功能做出贡献。

升级检查器

Deno 附带 deno upgrade 子命令,允许您轻松获取最新版本的 Deno。从本版本开始,Deno 现在将自动检查新版本,并在可用时提示您。

$ deno run app.ts
A new release of Deno is available: 1.26.2 → 1.27.0
Run `deno upgrade` to install it.

我们特别注意确保这些检查不会影响应用程序的性能 - 它们最多每天在后台发生一次。可以通过设置环境变量来完全禁用此功能:DENO_NO_UPDATE_CHECK=1

对 `Deno` API 的更改

API 稳定性

以下 API 已在本版本中稳定,不再需要使用 --unstable 标志。

  • Deno.consoleSize()
  • Deno.futime()
  • Deno.futimeSync()
  • Deno.loadavg()
  • Deno.osRelease()
  • Deno.stdin.setRaw()
  • Deno.utime()
  • Deno.utimeSync()

其他更新

  • Deno.kill() 不再需要参数,如果省略参数,它将默认发送 SIGTERM 信号。

  • Deno.getGid() 已重命名为 Deno.gid(),为稳定此 API 做准备

  • Deno.getUid() 已重命名为 Deno.uid(),为稳定此 API 做准备

  • 添加了 TcpListenOptions.reusePort 选项。它允许多个进程监听同一个地址和端口。此选项需要 --unstable 标志,并且仅在 Linux 上支持。

对 `deno lint` 的更新

内置 linter 获得了一种新的“紧凑”报告格式,这可能与 ESLint 用户熟悉。您可以通过向 deno lint 子命令提供 --compact 标志来使用此格式。

$ deno lint --compact
/dev/deno/foo.js: line 1, col 10 - `foo` is never used (no-unused-vars)
Found 1 problem
Checked 1 file

此外,您可以在 deno.json 文件中指定您喜欢的报告类型

{
  "lint": {
    "report": "compact"
  }
}

感谢 Brenley Dueck 为此功能做出贡献。

V8 10.8

此版本升级到最新版本的 V8(10.8,之前为 10.7)。

此版本中最显著的新功能是对 通过复制更改数组提案 的支持。

Node.js 兼容性改进

10 月 25 日,Node.js 18 进入长期支持 (LTS),版本为 18.12.0。在 Deno v1.27 中,Node.js 兼容层测试套件已更新以匹配 Node.js v18.12.0,这意味着 Deno 能够运行最新的 Node.js LTS 版本。

请注意,整个 Node.js 兼容层仍需使用 --unstable 标志。

其他更新

  • 已实现 readline/promises 模块。此模块为 readline 模块提供基于 Promise 的 API。感谢 @PolarETech 为此功能做出贡献。

  • crypto 模块中的 hash.digest() 现在支持 'base64url' 编码。感谢 Deniz Akşimşek 为此功能做出贡献。

  • 现在可以加载 .node 模块。另请参见(Node-API 支持)[#node-api]。

  • fs.access() 添加了更好的 Windows 支持。

  • child_process 模块的 API 中已添加 windowsVerbatimArguments 选项。

标准库 API 的变更

在此版本中,已删除了几个已弃用的 API。

  • 已删除 hash 模块。此模块的功能可通过 crypto 模块使用。

  • 已删除 textproto 模块。

  • 已从 collections 模块中删除 BSNode,取而代之的是 BinarySearchNode

  • 已从 collections 模块中删除 BSTree,取而代之的是 BinarySearchTree

  • 已从 collections 模块中删除 RBNode,取而代之的是 RedBlackNode

  • 已从 collections 模块中删除 RBTree,取而代之的是 RedBlackTree

  • 已从 collections 模块中删除 direction,取而代之的是 Direction

  • 已从 encoding 模块中删除 CSVStream,取而代之的是 CsvStream

  • 已从 encoding 模块中删除 CSVStreamOptions 类型,取而代之的是 CsvStreamOptions 类型。

  • 已删除 encoding/csv_stringify.ts 文件,取而代之的是 encoding/csv.ts 文件和其他 API。

  • 已从 encoding 模块中删除 JSONValue,取而代之的是 JsonValue

  • 已从 encoding 模块中删除 JSONParseStream,取而代之的是 JsonParseStream

  • 已从 encoding 模块中删除 JSONStringifyStream,取而代之的是 JsonStringifyStream

  • 已从 encoding 模块中删除 ConcatenatedJSONParseStream,取而代之的是 ConcatenatedJsonParseStream

  • 已从 http 模块中删除 listenAndServe()listenAndServeTls() 函数,取而代之的是 serve()serveTls(),分别。

  • 已从 io 模块中删除流式功能,取而代之的是 streams 模块。

  • 已从 io 模块的 bufio.ts 文件中删除功能,取而代之的是 buffer.ts 文件。

  • 已从 io 模块的 ioutil.ts 文件中删除功能,取而代之的是 util.ts 文件。

  • 已从 streams 模块中删除 LineStream 类,取而代之的是 TextLineStream

  • 已从 testing 模块中删除所有基准测试 API,取而代之的是 Deno.bench()

  • 已从 testing 模块中删除接受回调函数的 assertThrows()assertRejects() 函数,取而代之的是它们的其它签名。

  • 已从 uuid 模块中删除 generate() 函数,取而代之的是 WebCrypto randomUUID() 函数。

感谢 Asher Gomez 为这些变更做出贡献。





HN 评论