跳到主要内容
Deno 2.4 现已推出,带来了 deno bundle、字节/文本导入、OTel 稳定版等新功能
了解更多
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:express@4.18";

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

Node-API

Deno 现在支持在 npm 包中使用 Node-API(以前称为 N-API)。Node-API 是一种在 Node.js 中使用原生代码的方式。这意味着现在可以在 Deno 中使用 parcelsqlite3usbfs-xattr 等包。

请注意,此功能需要 --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 的目的而言并不实用。

从此版本开始,如果异步命令失败,则整个任务也将失败。请注意,如果您想要之前的行为,可以通过在命令末尾添加 || true 来选择退出,这将强制退出代码为 0

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

sleep 时间后缀

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

感谢 @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 以 18.12.0 版本进入长期支持(LTS)。在 Deno v1.27 中,Node.js 兼容层测试套件已更新为匹配 Node.js v18.12.0,这意味着 Deno 能够运行最新的 Node.js LTS 版本。

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

其他更新

  • readline/promises 模块已实现。此模块为 readline 模块提供基于 Promises 的 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 模块中的 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 评论