Deno 1.42:使用 JSR 更好地进行依赖管理

3 月 28 日,Deno 宣布 1.42 版本正式推出。Deno 的愿景是简化编程,其中一个重要方面就是管理依赖关系。虽然 npm 已发展成为最成功的开源注册表,但使用和发布模块却变得越来越复杂。

基于 npm 的成功,JSR 提供​​了一个现代化的、TypeScript 优先且跨平台兼容的注册表,并完全集成到 Deno 中。

Deno v1.42 通过 deno publishdeno 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%。现在,引导程序初始化会在快照期间预热并减少内存分配。

更高效的 setTimeoutsetInterval :计时器进行了重大重写。创建一百万个计时器大约需要 1.4 秒,而 Deno 1.41 中需要 5.9 秒,同时内存使用量也减少了 70%。

Fresh 2.0 即将到来

我们的下一个主要 Fresh 版本将更加简单,具有更可组合的、类似 Express 的 API。

参考链接:deno.com/blog/v1.42

相关推荐
醉の虾10 分钟前
Vue3 使用v-for 渲染列表数据后更新
前端·javascript·vue.js
张小小大智慧18 分钟前
TypeScript 的发展与基本语法
前端·javascript·typescript
hummhumm28 分钟前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
asleep70140 分钟前
第8章利用CSS制作导航菜单
前端·css
hummhumm44 分钟前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
怕冷的火焰(~杰)1 小时前
Node基本使用
node.js
幼儿园的小霸王1 小时前
通过socket设置版本更新提示
前端·vue.js·webpack·typescript·前端框架·anti-design-vue
疯狂的沙粒1 小时前
对 TypeScript 中高级类型的理解?应该在哪些方面可以更好的使用!
前端·javascript·typescript
gqkmiss2 小时前
Chrome 浏览器 131 版本开发者工具(DevTools)更新内容
前端·chrome·浏览器·chrome devtools
Summer不秃2 小时前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter