其他注册表
除了 JSR 之外,还有几个平台可以用来分享 JavaScript 库。在本节中,我们将重点介绍各种选项之间的区别。
npm
npm 是 JavaScript 库共享的主要且广为人知的平台。它最初是在 2010 年代初期与 Node.js 一起开发的。
JSR 旨在补充 npm,而不是取代它。JSR 允许包使用 npm:
指定符引用 npm 包。
JSR 包也可以在尚未原生支持 JSR 的工具中使用,通过使用 JSR 的 npm 兼容性层。
我们创建 JSR 是为了解决 npm 生态系统中的特定问题。
- 原生 TypeScript 支持:JSR 不需要在发布之前对 TypeScript 代码进行转译。它明确构建为支持 TypeScript 功能,例如“转到定义”,避免不必要地遇到声明文件 (d.ts)。
- ESM 语法:JSR 推广现代 ECMAScript 模块 (ESM) 语法,而不是 CommonJS,从而简化代码结构。
- 更好的约束:JSR 强制执行各种约束,以增强 Unix 和 Windows 平台之间的可移植性,例如路径长度限制和禁止某些文件名。
deno.land/x
JSR 和 deno.land/x 具有共同的起源,但 JSR 旨在与各种运行时和捆绑器兼容。
deno.land/x 充当一个存储库,用于托管通过 HTTPS 可访问的源代码。JSR 的创建是为了解决与 deno.land/x 相关的几个问题。
- 语义版本控制强制执行:Deno.land/x 不强制执行语义版本控制 (semver),导致在对依赖项进行重复数据删除时出现挑战。因此,同一库的多个版本可能会出现在模块图中。
- 可靠性:Deno.land/x 缺乏自包含链接,包括指向可能不可靠的服务器的链接,这些服务器可能在代码发布后已离线。这可能会损害对 deno.land/x 库的长期可靠性的信任。
- TypeScript 性能:虽然 Deno 和 deno.land/x 提供原生 TypeScript 支持,但在使用来自 deno.land/x 的 HTTPS 模块时存在性能问题。类型检查器可能会继续分析超出用户控制范围的代码,从而影响性能。
esm.sh
Esm.sh 是一个通过 HTTPS 提供 npm 包的平台。在 Deno 提供原生 npm 支持之前,这是在 Deno 程序中包含 npm 依赖项的首选方法。
与 esm.sh 相反,JSR 不会直接提供 npm 包。JSR 作为一个独立的注册表运行,允许使用 npm 依赖项,但主要关注纯 JSR 代码。
与 esm.sh 的相似之处
- 仅限 ESM 模块:esm.sh 和 JSR 都只提供 ESM 模块,而不是 CommonJS。
- 直接文件访问:与 esm.sh 一样,JSR 通过 HTTPS 提供对单个包文件的直接访问。
unpkg.com
unpkg.com 与 esm.sh 类似,允许通过 HTTPS 访问 npm 模块中的单个文件。但是,与 esm.sh 相比,它提供的功能更少。