过去几年,新的包管理器如 Yarn 和 pnpm 相继出现,改进了包的下载方式。然而,作为 JavaScript 生态系统基石的 npm 包注册表却几乎没有发展。其上次显著的更新还是多年前添加的一个“文件”选项卡。JavaScript 语言以其活跃的演进著称,但似乎矛盾地陷入了一个未能跟上步伐的分发模型中。
当初我创建 Node 时,JavaScript 还没有标准的模块系统。因此,npm 注册表和 Node 默认使用 CommonJS(require
),这是一个存在根本缺陷的系统,使其在浏览器中无法工作。所以,将近十年前,在 2015 年,JavaScript 语言采用了 ES 模块(import
)的语法。如今,大多数 JavaScript 代码都使用 ES 模块编写,但分发这些模块的途径仍然复杂,尤其是在涉及 TypeScript 时。生态系统中这一明显的空白促使了 JSR 的创建,它不是另一个包管理器,而是一个变革性的注册表,旨在彻底改变 JavaScript 和 TypeScript 在服务器端运行时、浏览器和各种工具之间共享的方式。
JSR 通过简化长期困扰开发者的复杂性,从根本上改进了代码分发过程。通过只支持 ESM 和 TypeScript 优先,JSR 消除了令人沮丧的 package.json
配置和错综复杂的 tsconfig 编译器选项的繁琐操作。通过 包评分系统,JSR 鼓励代码分发的最佳实践——包含每个导出符号的完整 JSDoc 文档的包会获得更高的分数,这类似于 Dart 社区在 pub.dev 中所做的。正如在 Go 和 Rust 等其他现代编程生态系统中看到的那样,JSR 提供了开箱即用的自动文档生成功能。
JSR 是一个注册表,而不是 npm 注册表的另一个客户端。但这并不意味着你需要放弃 npm 中的所有内容,或者硬性切换到一个分离的 JavaScript 模块生态系统。JSR 旨在补充 npm 注册表,而不是取代它。JSR 包可以依赖 npm 包——例如,请看这个包。此外,JSR 包可以在现有的 npm 优先软件中使用,因为 JSR 本身充当了一个 npm 注册表(可在 npm.jsr.io 访问),分发与 npm 兼容的 tarball。这使得 JSR 包可以包含在使用 npm、Yarn 或 pnpm 的任何软件中,并可以与私有注册表集成。JSR 分发的 npm tarball 是最优的。
在 Deno,我们将安全性视为 JavaScript 开发中的首要关注点。虽然没有任何注册表能够全面监管所有发布的代码,但 JSR 提供了发布者的透明度并确保了发布过程的安全性。通过将 OIDC 令牌与 GitHub Actions 集成,JSR 使用 软件制品供应链级别(SLSA)创建了高级的、可验证的出处证明,并将其存储在 Sigstore 中。这不仅确保了代码的真实性,还在开发者实施的内容中建立了信任和问责制。
JavaScript 是许多程序员的通用语言,使其既普适又易于访问。这种语言值得拥有一个中心枢纽——一个“城市广场”——供开发者在其中分享他们的作品,而无需过多的复杂性。我们相信 JavaScript 在未来许多年仍将是软件开发的核心,JSR 旨在支持这种持久的相关性。虽然 JSR 不是一个包管理器,但它提供了一种管理和保护代码的新方法,旨在成为一个稳定、前瞻性的平台,以增强和保障 JavaScript 的开发。通过这种方式,JSR 不仅仅是生态系统中的另一个工具,更是我们思考如何分发 JavaScript 和 TypeScript 的根本性转变。
🚨️ 阅读更多关于 JSR 的信息 🚨️