月下载超2亿次的npm包又遭投毒,我学会了搭建私有 npm 仓库!

最近的Nx 被投毒

就在几天前(2025 年 8 月 26 日),安全研究团队 Wiz 披露了一起复杂的供应链攻击:流行的 Nx npm 包被注入恶意代码

Nx 是由 Nrwl 开发的 AI 驱动 monorepo 构建系统,每周下载量超过 460 万次,被广泛集成到 Angular、React、Node.js 项目中,甚至在 VSCode 插件、create-nx-workspace 脚手架和 CI/CD 工具链中大量使用。

换句话说,只要你在这段时间安装了有问题的 Nx 包,你的敏感资产可能已经暴露

这并不是第一次

如果你还记得,几年前也发生过著名的 event-stream 事件

  • event-stream 是一个被大量前端框架依赖的 npm 包,每月下载量数千万;
  • 攻击者在其中植入恶意代码,影响范围甚至波及到 Vue 官方脚手架 vue-cli
  • 无数开发者的项目被间接污染。

还有去年发生的 Vant组件库遭投毒事件,npm 生态中的供应链攻击正在成为常态化风险。

怎么避免

不禁提出一个疑问: 我们只能通过npm 安装第三方依赖包吗, 能不能搭建私有化 npm 仓库。

其实很多公司就是这么做的,不仅能避免npm包投毒,而且还能解决:

  • 下载速度慢(国外源+公司网络限制问题)
  • 担心npm服务宕机,无法拉包

今天就给大家推荐一个轻量级、5分钟就能搭建好的私有 npm 仓库的包:verdaccio

verdaccio

是什么

Verdaccio是基于Node.js开发的开源私有npm注册表,以其轻量易用、开箱即用的特性著称。

核心功能包括:

  • 智能缓存代理:自动缓存公共源依赖,显著提升下载速度
  • 私有包托管:安全存储内部组件、工具库和业务SDK
  • 精细化权限管控:灵活配置发布与下载权限
  • 无外置依赖:默认使用文件系统存储,简化部署

适用场景

  • 企业内部资产管理:业务组件、工具库等敏感代码的安全托管
  • 团队协作加速:依赖包本地缓存,大幅减少重复下载
  • 隔离环境开发:离线或半离线网络下的完整npm工作流
  • 开发测试隔离:本地私有环境测试,避免污染公共空间

五分钟快速部署

推荐全局安装:

bash 复制代码
# npm | yarn | pnpm
npm install -g verdaccio

服务启动

bash 复制代码
verdaccio

服务默认监听4873端口,访问 http://localhost:4873

Node.js 版本要求v18 以上

首次运行可以看到提示:暂时没有发布任何包,首先要创建一个用户,我们按照提示完成。

创建用户

bash 复制代码
npm adduser --registry http://localhost:4873/

执行后输入你的用户名、密码以及邮箱即可注册成功

然后在页面中使用刚才注册的账号进行登录

发布私有包

我们创建一个测试项目vue3-project

然后在项目下执行:

bash 复制代码
npm publish --registry http://localhost:4873

发布后,可查看到上传的包:

注意:

1、当前私有仓库必须包含 package.json 文件, private设置为false

2、每次发布的时候,都需要使用npm version v1.x.x 更新版本,并且保证仓库是干净的

移除包

go 复制代码
// 删除特定版本
npm unpublish <package-name>@<version>

// 删除整个包(谨慎使用):
npm unpublish <package-name> --force

请注意,如果你要删除整个包,必须使用 --force 标志。

总结

Verdaccio作为轻量级npm私有仓库解决方案,具有以下突出价值:

  • 部署简易:几分钟即可完成安装配置
  • 功能完备:完整支持缓存、托管、权限管理等核心需求
  • 安全可靠:有效规避供应链攻击风险
  • 成本低廉:特别适合中小团队和技术创业公司

在当前软件供应链安全形势日益严峻的背景下,搭建私有仓库不仅是效率优化措施,更是至关重要的安全实践。

相关推荐
ttod_qzstudio2 分钟前
Vue 3 Props 定义详解:从基础到进阶
前端·vue.js
钱端工程师2 分钟前
uniapp封装uni.request请求,实现重复接口请求中断上次请求(防抖)
前端·javascript·uni-app
茶憶3 分钟前
uni-app app移动端实现纵向滑块功能,并伴随自动播放
javascript·vue.js·uni-app·html·scss
dcloud_jibinbin4 分钟前
【uniapp】解决小程序分包下的json文件编译后生成到主包的问题
前端·性能优化·微信小程序·uni-app·vue·json
茶憶7 分钟前
uniapp移动端实现触摸滑动功能:上下滑动展开收起内容,左右滑动删除列表
前端·javascript·vue.js·uni-app
Ayn慢慢11 分钟前
uni-app PDA焦点录入实现
前端·javascript·uni-app
一位搞嵌入式的 genius21 分钟前
微前端架构:JavaScript 隔离方案全解析(含 CSS 隔离)概要
前端·css·前端实战
4_0_422 分钟前
一步一步实现 Shader 水波纹效果(入门到进阶)
前端·three.js
lemonboy22 分钟前
可视化大屏适配方案:用 Tailwind CSS 直接写设计稿像素值
前端·vue.js
鹏仔工作室23 分钟前
vue中实现1小时不操作则退出登录功能
前端·javascript·vue.js