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
,仍处于采用和开发的早期阶段。
以前,标准库内不同的成熟度水平对其稳定性构成了重大挑战。考虑到其组件成熟度的广泛差异,对整个库采用一刀切的方法是不切实际的。
通过对每个包采用独立版本管理,我们可以及时稳定成熟的包,同时继续改进和试验那些不太成熟的包。这一策略不仅加快了标准库的稳定性,也保持了其进一步发展所需的灵活性。
workspaces
功能
利用 Deno 的 我们使用 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/@std。deno.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 开发的新阶段。