跳转到主要内容
JSR is not another package manager

Deno 标准库现已在 JSR 上可用

我们激动地宣布 Deno 生态系统迎来重大变革:Deno 标准库,这是一组高质量 TypeScript 包的强大集合,已正式迁移至新的 JavaScript 包注册表 JSR

自 Deno 早期以来,标准库一直是 https://deno.land/std 的基石,其中包含从 文件系统管理高级加密功能等重要软件包。这些软件包均由 Deno 团队审核,并保证与 Deno 兼容。

JSR 不是另一个包管理器;它是一个具有前瞻性的注册表,旨在统一和简化 JavaScript 包在不同环境中的分发。JSR 旨在与 Deno 和其他 JavaScript 运行时无缝集成,引入了许多显著增强 JavaScript 生态系统的功能。它的兼容性扩展到 Node.js、Cloudflare Workers 甚至使用 bundler 的浏览器等环境,确保各种 JavaScript 应用程序都可以利用 Deno 的标准库。

随着迁移到 https://jsr.deno.org.cn/@std,JSR 现在托管了标准库,提供 自动生成的文档SemVer 重复数据删除,同时增强了全球开发人员的可访问性和多功能性。

在 JSR 上使用标准库

要安装这些包,请使用以下命令

deno add @std/fs @std/path

此命令会更新你的 deno.json 导入映射,如下所示

{
  "imports": {
    "@std/fs": "jsr:@std/fs@^0.224.0",
    "@std/path": "jsr:@std/path@^0.224.0"
  }
}

然后你可以在源代码中导入这些包

import { copy } from "@std/fs";
import { join } from "@std/path";

await copy("foo.txt", join("dist", "foo.txt"));
// Copies foo.txt to dist/foo.txt

或者,你可以使用 jsr: 说明符直接导入

// This works without import map
import { copy } from "jsr:@std/fs@^0.224.0";
import { join } from "jsr:@std/path@^0.224.0";

await copy("foo.txt", join("dist", "foo.txt"));

Node.js 及其他

JSR 与 npm 的兼容性允许你在 Node.js、Cloudflare Workers 和使用 bundler 的浏览器中使用 Deno 标准库。例如,运行此命令

npx jsr add @std/async @std/collections

将依赖项添加到你的 package.json

 {
   "dependencies": {
+    "@std/async": "npm:@jsr/std__async@^0.224.0",
+    "@std/collections": "npm:@jsr/std__collections@^0.224.0"
   }
 }

现在你可以如下所示使用这些包

import { delay } from "@std/async";
import { deepMerge } from "@std/collections";

await delay(100);

console.log(deepMerge({ foo: { bar: 1 }, baz: 2 }, { foo: { qux: 2 } }));

使用 Node.js 运行此脚本

$ node main.mjs
{ foo: { bar: 1, qux: 2 }, baz: 2 }

目前,大约 70% 的标准库包与 Node.js 兼容。你可以查看 https://jsr.deno.org.cn/@std 上的包列表中的兼容性图标,以查看哪些包与 Node.js 兼容。

注意:标准库仅作为 ES 模块分发。任何使用标准库的脚本都需要是 ES 模块。这意味着你的文件要么需要具有 .mjs 文件扩展名,要么项目的 package.json 需要具有 "type": "module" 属性。

每个标准库包的独立版本控制

Deno 标准库现在被组织成 37 个不同的包,例如 @std/fs@std/path

对标准库的不同部分进行单独版本控制的决定是受到其组件的不同成熟度、复杂性和用途的驱动。库的某些部分,如 @std/fs,已经成熟且更改较少,已被广泛应用于许多实际应用中。相比之下,较新的新增功能,如 @std/expect(仅有四个月的历史),仍处于采用和开发的早期阶段。

以前,标准库内部不同的成熟度水平对其稳定化构成了重大挑战。考虑到其组件之间成熟度的广泛差异,对整个库应用一刀切的方法是不切实际的。

通过为每个包采用独立版本控制,我们可以及时稳定成熟的包,同时继续改进和试验不太成熟的包。这种策略不仅加速了标准库的稳定,而且保持了进一步发展它所需的灵活性。

利用 Deno workspaces

我们使用 Deno 全新的工作区功能来管理 @std 包之间的相互依赖关系。此功能帮助包在本地相互依赖,而无需发布每个包。

工作区功能仍在开发中。特别是,对其 LSP 的支持仍在添加中。如果你对其开发进展感兴趣,请查看并订阅 跟踪问题

工作区功能通过在 deno.json 中定义 "workspaces" 字段来启用。让我们看一下标准库存储库的 deno.json

{
  "workspaces": [
    "./archive",
    "./assert",
    "./async",
    "./bytes"
    // ...
  ]
}

请注意,例如,@std/archive 依赖于 @std/assert (参考)

import { assert } from "@std/assert/assert";

...
assert(fileSize !== undefined, "fileSize must be set");
...

assert 函数直接从存储库中的本地 ./assert 目录导入,而不是从已发布的版本导入。尽管每个包都是独立发布的,但标准库仍然像单个源代码一样工作。

deno.land/std 的未来

deno.land/std 将无限期地可用。所有依赖 deno.land/std 的程序都将继续工作。别担心!

但是,展望未来,新功能将发布到 jsr.io/@stddeno.land/std 将仅接收关键更新,例如安全补丁。

deno.land/std 迁移到 jsr:@std

如果你目前使用 deno.land/std 中的标准库,我们建议你升级为从 jsr:@std 导入。

要升级到 jsr:@std,我们首先建议将你的 deno.land/std 版本升级到 0.224.0

- import { join } from "https://deno.land/[email protected]/path/mod.ts";
+ import { join } from "https://deno.land/[email protected]/path/mod.ts";

然后将 HTTP 说明符更新为 JSR 说明符

- import { join } from "https://deno.land/[email protected]/path/mod.ts";
+ import { join } from "jsr:@std/[email protected]";

就是这样!

展望未来

标准库仍处于 v0.x 版本,这意味着 API 尚未稳定。我们计划在每个包的基础上稳定 Deno 标准库。首批稳定候选包是 @std/bytes@std/collections。有关更新,请关注此问题 (denoland/deno_std#4600)。

随着我们不断前进,我们对 JSR 为全球开发者开启的可能性感到兴奋。加入我们,共同迎接 JavaScript 开发的新阶段。