前言:为什么你的团队需要一个私有npm仓库?

在日常开发中,你是否遇到过这样的场景:辛辛苦苦封装的公司内部组件库,只能通过复制粘贴或者git submodule的方式在项目间共享?团队成员每次npm install都要花上几分钟等待公共仓库的响应?或者担心某个关键依赖突然从公共仓库消失?

这些问题,其实都可以通过搭建一个私有npm仓库来优雅地解决。而Verdaccio,正是目前最轻量、最简单易用的私有npm仓库方案。

Verdaccio是一个基于Node.js构建的轻量级私有npm代理注册中心。它能帮你做三件核心的事:

管理私有包:你可以将公司内部的组件库、工具库发布到Verdaccio,像使用公共包一样通过npm install安装,但核心代码无需公开。

缓存和加速:Verdaccio可以作为官方npm仓库的代理。团队第一次下载某个包后会被缓存到本地,后续安装直接从缓存读取,速度提升立竿见影。

聚合多个仓库:如果你的团队同时使用多个不同的npm源,Verdaccio可以将它们聚合为一个统一的入口。

最重要的是,它开箱即用,自带小数据库,零配置就能跑起来,对中小型团队来说性价比极高。

快速上手:十分钟搭好你的私有仓库

搭建Verdaccio的流程非常简单,我们一步步来。

环境准备

首先确保你的机器上安装了Node.js(建议v18或更高版本)和npm。你可以通过以下命令确认版本:

bash
node -v
npm -v

安装Verdaccio

通过npm全局安装Verdaccio:

bash
npm install -g verdaccio

安装完成后,直接运行命令启动服务:

bash
verdaccio

默认情况下,服务会运行在http://localhost:4873。你可以在浏览器中访问这个地址,会看到Verdaccio的Web界面,说明服务已经成功启动了。

小贴士:Verdaccio的默认配置文件位于~/.config/verdaccio/config.yaml(Linux/macOS)或%APPDATA%\verdaccio\config.yaml(Windows),后续的权限、代理等配置都在这个文件中进行。

配置用户认证

开箱即用的Verdaccio允许任何人注册和发布包,但在团队内部使用时,我们需要控制访问权限。Verdaccio默认使用htpasswd方式管理用户。

你可以通过npm adduser命令来注册新用户:

bash
npm adduser --registry http://localhost:4873

系统会提示你输入用户名、密码和邮箱,这些信息会被保存在htpasswd文件中。之后团队成员发布或安装私有包时,都需要先登录认证。

客户端配置

有两种方式让你的npm客户端指向私有仓库:

方式一:配置项目的.npmrc

在项目根目录创建或编辑.npmrc文件:

text
registry=http://localhost:4873/

方式二:在package.json中指定

json
{
  "publishConfig": {
    "registry": "http://localhost:4873"
  }
}

这样,执行npm installnpm publish时就会优先使用私有仓库。

进阶配置:让私有仓库更安全、更可靠

1. 权限分层:谁可以发布和安装?

config.yamlpackages部分,你可以精细控制每个包的访问权限。Verdaccio提供了三种权限关键字:$all(所有人)、$anonymous(未登录用户)、$authenticated(已登录用户)。

推荐的最佳实践是为私有包配置严格的权限:

yaml
packages:
  '@my-company/*':     # 公司内部私有包
    access: $authenticated
    publish: $authenticated
  '**':                # 其他所有包
    access: $authenticated
    publish: $authenticated
    proxy: npmjs

这样配置后,只有认证过的用户才能访问和发布包,有效防止未经授权的访问。

2. 删除proxy,防止私有包泄露

默认配置中,私有包也会被代理到公共npm仓库查询。如果你的私有包名和公共包同名,可能会导致意外下载公共版本。更严重的是,这存在包名冲突的安全风险。

对于私有作用域包(如@my-company/*),建议删除proxy属性

yaml
packages:
  '@my-company/*':
    access: $authenticated
    publish: $authenticated
    # 注释或删除 proxy 行
  '@*/*':
    access: $authenticated
    publish: $authenticated
    proxy: npmjs
  '**':
    access: $authenticated
    publish: $authenticated
    proxy: npmjs

这样私有包就完全由本地仓库管理,不会与公共仓库产生任何交互。

3. HTTPS加密与进程守护

生产环境强烈建议启用HTTPS。你可以配置SSL证书:

yaml
https:
  key: ./key.pem
  cert: ./cert.pem
  port: 8443
listen: https://0.0.0.0:8443

或者使用Nginx做反向代理来提供HTTPS支持。

另外,使用PM2管理Verdaccio进程是个好习惯,可以保证服务持续运行并自动重启:

bash
npm install -g pm2
pm2 start verdaccio --name "npm-registry"
pm2 save
pm2 startup

Docker部署:更干净的隔离环境

如果你倾向于容器化部署,Verdaccio官方提供了Docker镜像,部署同样简单:

bash
docker pull verdaccio/verdaccio
docker run -d --name verdaccio -p 4873:4873 -v $(pwd)/storage:/verdaccio/storage verdaccio/verdaccio

通过挂载数据卷,可以持久化存储包数据和配置文件。