在前端开发中,使用第三方 npm 模块可以显著提高我们的工作效率。我们既可以创建并分享自己的模块到 npm 仓库,供其他开发者使用,也可以从仓库中获取他人的模块以加快开发进程。
然而,在中国大陆,由于特定的网络限制,从 npm 仓库下载模块经常异常缓慢,甚至直接失败。一个常见的解决方法是切换到如淘宝或腾讯等镜像源。
在离开 Node 官方团队后,“Node 之父”开发了一个新的 JavaScript 运行时环境 Deno,该环境在多个方面对 Node 进行了改进。最近,针对 npm 仓库中的长期问题,他提出了一个名为 JSR(JS 下载源)的全新方案。
“这不是另一个 npm 包管理器!”“Node 之父”这样强调。让我们通过查阅“Node 之父”在 Deno 官方博客上的文章,了解一下这个与 npm 仓库竞争的新项目 JSR。
在最近几年,新的包管理器如yarn和pnpm已经增强了npm包的下载体验。然而,作为JavaScript生态系统基石的npm注册源本身的发展几乎处于停滞状态,其最近一次显著更新是几年前引入的“files”标签。尽管JavaScript语言发展迅速,其分发模式却显得相对落后。
在我创建Node的时代,JavaScript尚无统一的模块系统,导致npm注册源及Node默认采用require语法和CJS模块,这一模块系统无法在浏览器中使用,具有根本性缺陷。大约在2015年,JavaScript采纳了ES模块和import语法。尽管如今大多数JavaScript代码都采用ES模块,其分发路径仍然复杂,特别是在涉及到TypeScript时。
为解决这些问题,JSR应运而生,它不仅仅是另一个npm包管理器,而是一种旨在改变JavaScript和TypeScript代码在服务器、浏览器和各种工具间共享方式的革命性下载源。JSR通过简化开发者长期面临的复杂性,从根本上改善了代码的分发方式。它专注于ES模块,并优先支持TypeScript,消除了繁琐的package.json配置和tsconfig编译选项的困扰。
JSR还通过包评分系统鼓励最佳实践,类似于Dart社区在pub.dev中的做法,为包含详尽JSDoc文档的每个导出符号的包提供更高的评分。与Go和Rust等其他现代编程生态系统一样,JSR提供开箱即用的自动化文档生成功能。
JSR本质上是一个新的registry,不仅仅是npm的另一个客户端。它不要求开发者放弃现有的npm内容或完全切换到一个全新的JS模块生态,而是旨在补充现有的npm注册源。它允许依赖npm包,专为TypeScript优化,并且只支持ES模块。适用于Deno和基于npm的项目如Node、Bun等,且完全开源免费。
你可以像这样安装软件包:
# 基于 npm:
npx jsr add xxx
# 基于 deno:
deno add xxx
JSR包能够集成到依赖npm的现有软件系统中,因为JSR自身作为一个npm下载源分发与npm兼容的tarball文件。这使得JSR包能够被包括在任何使用npm、yarn或pnpm的项目中,并且可以与私有下载源无缝集成。这种方式的npm tarball分发被认为是非常优秀的。
在Deno环境中,我们特别重视安全性,把它作为JavaScript开发的首要考量。虽然没有下载源能够完全监控所有发布的代码,但JSR通过提高发布者的透明度和确保发布过程的安全性,提供了一种更为安全的方法。
JSR还通过整合OIDC令牌和GitHub Actions,利用供应链安全技术来创建高级的、可验证的代码来源证明,并将其保存在Sigstore中。这样不仅保证了代码的真实性,也加强了对开发者责任的信任和确立。
JavaScript作为广泛使用的编程语言,其普遍性和易用性为其赢得了大量的使用者。一个中心化的社区对于JavaScript是必要的,开发者可以在这里共享他们的成果,而不会感到过于复杂。
我们坚信,JavaScript将继续在软件开发领域保持其核心地位,而JSR的设计正是为了支持这种持久的相关性。尽管JSR不是一个传统的包管理器,它提供了一种新的方法来管理和保护代码,致力于成为一个稳定且具有前瞻性的平台,旨在加强和保护JavaScript开发。
因此,JSR不仅仅是生态系统中的另一个工具,更是一种彻底改变我们如何分发JavaScript和TypeScript代码的根本性变革。