npm作为Nodejs的包管理工具,它们共同构成了一个强大的生态系统,使得JavaScript开发者能够在服务器端开发复杂的应用程序,并且能够轻松地管理和共享代码。这的确是一个壮举,而创始人居安思危,点明了这个生态系统中存在的严重问题,主要涉及以下几个方面:
-
架构和验证问题(manifest confusion):
- npm 注册表没有根据相应 tarball 包的内容验证清单信息,导致元数据(manifest)和 tarball 中的
package.json
内容可能不一致。 - 这种不一致允许攻击者隐藏脚本或依赖项,例如,一个包可能显示没有依赖项,实际上却有,或者显示的包名或版本与
package.json
中的不同。
- npm 注册表没有根据相应 tarball 包的内容验证清单信息,导致元数据(manifest)和 tarball 中的
-
安全性问题:
- 通过包安装脚本引入的漏洞,例如
preinstall
、postinstall
和install
钩子可能执行任意代码,暴露敏感信息或允许外部控制。 - 未授权的数据外泄,一些包被发现将敏感数据(如系统用户名、目录路径或网络配置)发送到远程服务器,这违反了用户隐私并可能被用于进一步攻击。
- 下载和执行未经完整性检查的二进制文件可能导致恶意软件的安装。
- 通过包安装脚本引入的漏洞,例如
-
依赖管理问题:
- 重复安装问题,由于 npm 的依赖结构,相同的包可能被多次安装,导致
node_modules
目录体积膨胀。 - 嵌套层级过深,复杂的项目
node_modules
目录的嵌套层级可能非常深,导致路径名超出 Windows 和一些应用工具的处理范围。
- 重复安装问题,由于 npm 的依赖结构,相同的包可能被多次安装,导致
-
版本管理问题:
- SemVer(语义化版本控制)导致依赖安装的不确定性。
-
缓存和离线模式问题:
- npm 的缓存能力存在问题,且没有有效的离线模式。
-
供应链攻击:
- 攻击者可能通过克隆或分叉包,或者在更新包时未清理过时的元数据来引入安全风险。
-
维护和更新问题:
- 由于维护不足,许多包依赖于已知漏洞的代码,即使在漏洞公开多年后仍然如此。
这些问题表明 npm 生态系统在安全性、依赖管理和架构设计方面存在挑战,需要社区和工具提供者共同努力来解决这些问题,以提高整个生态系统的安全性和稳定性。
在今年三月,NPM 的创建者刚刚在今年三月组建了一个创始团队,vlt technology Inc.,准备使用两款开创性的工具彻底重构该生态:
- vlt,一款尖端的软件包管理器;
- vsr,一款无服务器注册表,它将重新定义我们管理和分发软件包的方式。
vlt:新一代软件包管理器
vlt 不仅仅是另一款软件包管理器,它还是一款免费的开源软件,旨在简化您的开发流程。下面就是它的与众不同之处:
- 快速安装:管理 Node.js 依赖关系时,告别漫长的等待时间。
- 智能依赖关系查询:新的选择器语法让软件包管理变得轻而易举。
- Visual magic:以各种格式导出依赖关系图,包括 Mermaid。
- 直观的图形用户界面:轻松探索项目的依赖关系网络。
简单的命令安装 vlt:
arduino
npm install -g vlt
# vlt目前在Node版本20或22上支持。
安装完成后,就可以开始体验 vlt 带来的高效软件包管理体验了。
提供各种客户端 CLI 命令:
提供了几种依赖性可视化方法:
-
可读格式:以树形结构显示数据,使嵌套关系更容易理解,帮助开发人员快速掌握依赖关系结构。
-
JSON:适用于系统间的数据交换,以可读和机器友好的方式表示信息,确保无缝数据传输。
-
Mermaid:使用 Mermaid 语法创建可视化图表,帮助开发人员显示复杂的数据流或层次结构,使依赖关系一目了然。
说明:Mermaid 是一种基于文本的图表绘制工具,支持在 Markdown 文件、文档或网页中嵌入可视化图表。通过简单的语法,用户可以快速生成流程图、时序图、甘特图等多种图表类型。
VLT 的图形用户界面(GUI)使探索和了解项目依赖关系变得更容易、更直观。
通过命令行使用以下查询语句,可以在浏览器中查看特定项目的依赖关系图:
vlt 提供功能强大的命令行工具,用于依赖性分析:
css
vlt query '[name="my-project"] > :is(:project > *[name="tap"][version="21.0.1"])' --view=gui
或使用以下命令启动图形用户界面仪表板
vlt gui
这将启动一个图形界面,让您更轻松地管理和分析项目的依赖关系。
vsr:下一代无服务器软件包注册中心
与 vlt 同时推出的还有 vsr,这是一个与 npm 兼容的公平源代码无服务器软件包注册表。它不仅仅是一个托管解决方案,更是一个可扩展、安全、经济高效的平台,它正在改变游戏规则:
- 无服务器架构:轻松扩展,保持低运营成本。
- 向后兼容:与 npm、yarn、pnpm、deno 和 bun 无缝兼容。
- 细粒度访问控制:以前所未有的精度管理权限。
- 灵活的托管:可选择本地开发、自托管或托管实例。
主要优势
部署方法:
-
本地开发:适合个人或小型团队在本地环境中进行软件包管理和测试。
-
自托管:企业或团队可在自己的服务器上部署 VSR,并控制数据和访问权限。
-
托管服务:如果您想要更省心的解决方案,可以选择官方提供的托管服务。
-
细粒度访问令牌:新的控制水平
vsr 引入了粒度访问令牌 (GAT),对软件包的交互进行精确控制:
-
客户令牌(只读):非常适合第三方访问,同时不影响安全性。
-
团队令牌(读写):无缝协作,同时保持严格的访问控制。
vsr 与竞争对手的比较:
-
vsr:擅长无服务器架构和细粒度访问控制。
-
Verdaccio:具有插件支持和多云功能。
-
JSR:支持 TypeScript 并提供详细的 API 文档。
这三款软件都涵盖了软件包发布和安装等基本功能,但 vsr 独特地融合了无服务器技术和细粒度访问控制,使其与众不同。
总结
npm 生态的发展推动了 JavaScript 的繁荣,但随之而来的安全、性能和依赖管理问题也不可忽视。为应对这些挑战,npm 的创始团队推出了全新的工具 vlt 和 vsr,试图彻底革新软件包管理和分发方式。
vlt 专注于提高开发效率,从快速依赖安装到智能依赖查询,结合强大的可视化功能和友好的图形界面,全面优化了开发者的日常体验。
与此同时,vsr 通过无服务器架构和细粒度访问控制重新定义了注册表的功能。它兼具安全性、灵活性和经济高效的特点,无缝兼容现有工具链,并为企业提供多种托管选择。
二者结合,描绘了一个更高效、更安全的包管理未来蓝图。随着这两款工具的普及,JavaScript 开发者的工作流程有望迎来新的变革。
参考资料:
VLT 官方网站: www.vlt.sh/client
vsr 官方网站: www.vlt.sh/serverless-...