Deno 1.27:IDE 重大改进
Deno 1.27 已标记并发布,包含以下新功能和变更
- 语言服务器/IDE 改进
npm
兼容性改进navigator.language
Web APIdeno task
改进- 升级检查器
Deno
API 变更deno lint
更新- V8 10.8
- Node.js 兼容性改进
- 标准库 API 变更
如果您已经安装了 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。内联提示是添加到代码中的小型信息片段,用于显示有关代码的信息。在很多方面,它都是一种“内联悬停”。
没有内联提示的代码视图
启用内联提示的代码视图
内联提示可以使代码更具可读性,填补代码中不存在的信息空白。特别是在使用 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 中使用 parcel
、sqlite3
、usb
或 fs-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 缓存中。
navigator.language
Web API
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()
函数已移除,转而使用 WebCryptorandomUUID()
函数。
感谢 Asher Gomez 贡献这些更改。