跳至主要内容
Deno 2 终于来了 🎉️
了解更多
JSR is not another package manager

Deno 标准库现已在 JSR 上可用

我们很高兴地宣布 Deno 生态系统的一次重大演变:Deno 标准库,一个由高质量 TypeScript 包组成的强大集合,已正式迁移至 JSR,新的 JavaScript 包注册表。

自 Deno 的早期以来,标准库一直是 https://deno.land/std 的基石,它包含从 文件系统管理高级加密功能 的基本包。这些包都经过 Deno 团队的审计,并保证与 Deno 兼容。

JSR 不是另一个包管理器;它是一个具有前瞻性的注册表,旨在统一和简化跨不同环境的 JavaScript 包分发。JSR 建立在与 Deno 和其他 JavaScript 运行时无缝集成的基础上,引入了一些功能,这些功能极大地增强了 JavaScript 生态系统。它的兼容性扩展到 Node.js、Cloudflare Workers 甚至使用打包程序的浏览器等环境,确保各种 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 以及使用打包程序的浏览器中使用 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 包之间的相互依赖关系。此功能可以帮助包在本地相互依赖,而无需发布每个包。

workspaces 功能仍在开发中。特别是,LSP 支持尚未添加。如果您有兴趣了解其开发进度,请查看并订阅 跟踪问题

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

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

注意,例如,@std/archive 依赖于 @std/assert (ref)

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 开发的新阶段。