3 月 28 日,Deno 宣布 1.42 版本正式推出。Deno 的愿景是简化编程,其中一个重要方面就是管理依赖关系。虽然 npm 已发展成为最成功的开源注册表,但使用和发布模块却变得越来越复杂。
基于 npm 的成功,JSR 提供了一个现代化的、TypeScript 优先且跨平台兼容的注册表,并完全集成到 Deno 中。
Deno v1.42 通过 deno publish
和 deno add
子命令提供更强大的依赖关系管理,可以从 JSR 和 npm 发布和安装模块。最重要的是,此版本提供了改进的 Node/npm 兼容性、多项 LSP 改进、更快的启动时间(以及其他性能优势)等等。
如果您已经安装了 Deno,请在终端中使用 deno upgrade
命令升级到版本 1.42。如果您尚未安装 Deno,您可以使用以下命令之一或许多其他方式安装它。
MacOS / Linux 安装
sh
curl -fsSL https://deno.land/install.sh | sh
Windows安装
sh
irm https://deno.land/install.ps1 | iex
以下是 Deno 1.42 新增功能的概述。
JSR、 deno publish 和 deno add
JSR 是现代 JavaScript 和 TypeScript 包的开源注册表。了解我们为何构建 JSR,使用 JSR 绝对是一种乐趣。它消除了分发 TypeScript 和 JavaScript 的所有麻烦。
在 1.42 中,Deno 添加了对 JSR 的一流支持。这意味着无需任何额外的工具,您就可以使用模块并将其发布到 JSR。
有两个新的子命令。首先是 deno add
。它的工作方式与 npm add
类似,但默认为 JSR 包。例如,如果您想使用 JSR 中的 @std/assert
,您只需运行
sh
deno add @std/assert
这将添加一个导入映射条目,使您可以轻松导入代码
js
import { assertEquals } from "@std/assert";
assertEquals(1, 2);
请注意, deno add
还支持添加带有 npm:
前缀的 npm 包。
对于模块作者可以使用 deno publish
执行您所期望的操作,它将发布到 JSR。JSR 也完全融入到 Deno 的 LSP 和 VS Code 扩展中。即使使用 TypeScript,也希望 go-to-definition 能够正常工作。 Intellisense 对于 JSR 包来说应该工作得很好。
Node.js 和 npm 兼容性
此版本中进行了大量改进,使 Deno 与 Node.js 更加兼容;以及与 npm 兼容性相关的多项改进。此外,设置 node_modules/
目录的性能也得到了改进 - 您可以在 Deno v1.42 中看到高达 1.7 倍的速度提升。
deno task
对于任何以 #!/usr/bin/env -S
开头的 shebang,跨平台 shebang 支持已在 deno task
中实现。给定一个 script.ts
文件和 deno.json
:
ts
#!/usr/bin/env -S deno run
console.log("Hello there!");
json
{
"tasks": {
"hi": "./script.ts"
}
}
现在即使在 Windows 计算机上也可以运行此任务。
退出状态变量
shell 现在支持使用 $?
来获取上次运行命令的退出代码:
json
{
"tasks": {
// outputs 10
"output": "deno eval 'Deno.exit(10)' || echo $?"
}
}
改进的重定向支持
现在实现了输入重定向和更多文件描述符重定向:
json
{
"tasks": {
// redirect file.txt to the stdin of gzip
"input-redirect": "gzip < file.txt",
// redirect stdout to stderr
"stdout-err": "deno run main.ts >&2",
// redirect stderr to stdout
"stderr-out": "deno run main.ts 2>&1"
}
}
任务描述
如果您使用的是 JSONC 文件,您现在可以使用注释向任务添加描述:
json
{
"tasks": {
// Start development server
"dev": "deno run --watch main.ts",
/**
* Run tests with coverage and output HTML report
*/
"coverage": "deno test --coverage **/*_test.ts && deno coverage --html"
}
}
sh
$ deno task
- dev
// Start development server
deno run --watch main.ts
- coverage
// Run tests with coverage and output HTML report
deno test --coverage **/*_test.ts && deno coverage --html
deno lint --fix
该基础设施已实现在命令行上自动修复 lint 规则并通过编辑器中的快速修复。
例如,给出以下代码:
js
window.onload = () => console.log("Hi there!");
deno lint
现在输出以下内容:
sh
> deno lint
error[no-window]: window is deprecated and scheduled for removal in Deno 2.0
--> main.ts:1:1
|
1 | window.onload = () => console.log("Hi there!");
| ^^^^^^
= hint: Instead, use `globalThis`
docs: https://lint.deno.land/rules/no-window
Found 1 problem (1 fixable via --fix)
Checked 1 file
请注意文本 (1 fixable via --fix)
。让我们尝试一下:
sh
> deno lint --fix
Checked 1 file
> cat main.ts
globalThis.onload = () => console.log("Hi there!");
> deno lint
Checked 1 file
目前,这仅适用于三个 lint 规则,但该列表会随着时间的推移而增长。
类型检查
以前,如果您使用 --check
标志运行 deno run
,当遇到静态不可分析的动态导入或启动工作线程时,Deno 可能会在执行过程中键入 check。
此功能带来了很大的维护负担,给 JSR 带来了一些挑战,并产生了不良行为,即可能在执行过程中使正在运行的应用程序失败。因此,在初始类型检查之后不再进行类型检查(强调: deno run --check main.ts
在执行任何模块之前仍然进行类型检查)。
如果需要,建议使用 deno check
子命令来键入检查这些模块。
deno install 更新
deno install
允许您轻松安装和分发可执行代码。
ruby
$ deno install --allow-net --allow-read https://deno.land/std/http/file_server.ts
✅ Successfully installed file_server.
$ file_server
Listening on http://127.0.0.1:4507
虽然此命令很有用,但许多用户希望它能够在项目本地"安装"依赖项 - 就像之前介绍的 deno add
一样。
为了更好地符合预期,Deno 2 中的 deno install
将更改为在项目本地安装脚本。也就是说, deno install
将是 deno add
的别名。-g
/ --global
标志仍然支持当前行为,以告诉 Deno 您想要全局安装脚本。
css
$ deno install --global --allow-net --allow-read https://deno.land/std/http/file_server.ts
✅ Successfully installed file_server.
如果您忽略它,Deno 现在会警告您并建议使用 -g
/ --global
标志。
语言服务器改进
从 v1.37 开始,我们的 LSP 支持 npm:
说明符的补全。在 v1.42 中,我们不仅添加了对 jsr:
说明符的支持,还添加了包名称和版本的补全。
ts
import "jsr:@std/a";
// "jsr:@std/archive";
// "jsr:@std/assert"; ✔️
// "jsr:@std/async";
// "jsr:@std/data-structures";
// "jsr:@std/datetime";
// ...
ts
import "jsr:@std/assert@";
// "jsr:@std/assert@0.220.1"; ✔️
// "jsr:@std/assert@0.219.1";
// "jsr:@std/assert@0.219.0";
// "jsr:@std/assert@0.218.2";
// "jsr:@std/assert@0.218.1";
// ...
其他改进和修复
- 在 JSR 导入悬停文本中包含注册表 url
- 不要警告本地文件从 .js 重定向到 .d.ts 文件
- 不要对供应的远程模块应用符号重命名
- 对包说明符导入映射键应用尾部斜杠扩展
表现
此版本全面提升了性能,其中最值得注意的是:
更快的启动时间:Linux 上的启动时间缩短了 10%。现在,引导程序初始化会在快照期间预热并减少内存分配。
更高效的 setTimeout
和 setInterval
:计时器进行了重大重写。创建一百万个计时器大约需要 1.4 秒,而 Deno 1.41 中需要 5.9 秒,同时内存使用量也减少了 70%。
Fresh 2.0 即将到来
我们的下一个主要 Fresh 版本将更加简单,具有更可组合的、类似 Express 的 API。
参考链接:deno.com/blog/v1.42