跳到主要内容
Deno 2.4 版本发布,带来 deno bundle、字节/文本导入、OTel 稳定版等新特性
了解更多
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 等环境,甚至可以通过打包器在浏览器中使用,确保广泛的 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 全新的 workspaces 功能管理 @std 包之间的相互依赖关系。此功能有助于包在本地相互依赖,而无需发布每个包。

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

通过在 deno.json 中定义 "workspaces" 字段来启用 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/std@0.170.0/path/mod.ts";
+ import { join } from "https://deno.land/std@0.224.0/path/mod.ts";

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

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

就这样!

展望未来

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

展望未来,我们对 JSR 为全球开发者带来的可能性感到兴奋。欢迎加入我们,共同迎接 JavaScript 开发的新阶段。