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/[email protected]"; ✔️
//     "jsr:@std/[email protected]";
//     "jsr:@std/[email protected]";
//     "jsr:@std/[email protected]";
//     "jsr:@std/[email protected]";
//     ...

其他改进和修复

  • 在 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

相关推荐
腾讯TNTWeb前端团队5 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰8 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪9 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy9 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom10 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom10 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom10 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom10 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom10 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试