前言
因为国内的网络环境问题,对于使用 npm 的企业或者组织来说,替换npm源一定是驾轻就熟,如我们常用的淘宝源
淘宝源以其优异的软硬件性能,保障了我们下载npm依赖的速度体验,其本质上是一个可以让我们下载npm包的资源服务器
另一方面,企业在开发的过程中,也会沉淀出一些没有必要发布到公网环境的包,如一些和企业业务强相关的业务库,还有一些是包含了企业核心技术和敏感信息的库,这些库都不适合上传到 npmjs.org
或者 npm.taobao.org
verdaccio 就为搭建企业npm仓库提供了简便易达的解决方案
Why Verdaccio 🤔
搭建这样一个npm仓库能解决两个直观的问题
缓存下载过的npm包
npm 包中存在大量的重复依赖,比如 request 库,一层一层依赖下来,可能10个涉及网络情况的库里有8个会直接或间接依赖到这个库。这些库下过一次即缓存在本地,可以提升整个依赖树的 npm install 的速度, 并且随着私有仓库的使用次数越来越多,仓库缓存的包也会越来越多,越来越趋近于全量仓库,这时无论再安装什么包基本都能命中私有仓库缓存,这时就能极大提升安装速度。不可否认淘宝源已经大大提高了npm库的下载体验,但缓存
在本地的库在下载速度上更是登峰造极
发布自己的私有包
在生产研发的过程中积累的工具库,支持库等就可以直接publish到私有仓库,从而与外界隔离,保证安全性
使用 npm 私库前后请求结构示意图
直接访问 npmjs 或者淘宝源
访问私库
私库就像在出网前架设了一层代理层,它来负责帮你取回你需要的包,如果他已经做过这个事情了,那就直接把包交给你,如果没有则继续请求上游仓库
安装
verdaccio 可以通过npm进行安装,一行命令搞定
1 | npm i -g verdaccio |
如果没有特别的配置需求,使用默认配置启动也是一行命令
1 | verdaccio |
打开 localhost:4873 会看到如下页面
如上的启动方式会在特定的地方创建默认配置文件,并以默认配置文件启动进程
OSX 和 Unix 操作系统的配置创建目录为 ~/.config/verdaccio/config.yaml
默认监听4873端口
如此一来,一个可以使用的npm私有仓库就启动起来了
和使用淘宝源一样,本质上是在使用npm命令的时候,更改 registry 配置,指定要安装的包的来源,常用的有两种方式
在npm参数中指定源
1
2
3
4npm install <package> --registry='http://localhost:4873'
更进一步,可以把这条指令抽取成 alias
export mynpm="mynpm --registry='http://localhost:4873'"
每次需要运行 npm 的时候就运行 mynpm使用 npm set 来指定
1
npm set registry http://localhost:4873
关键配置
在众多配置中,有几项配置比较值得关注
verdaccio 的配置文件是基于 yml
的,需要注意缩进(用缩进区分层级)
packages
1 | packages: |
上述配置控制的是仓库里的包的访问行为
@*/*
表示接下来的配置是针对 scoped 的包,如@vue/some-package
@vue/*
表示接下来的配置针对 @vue 这个scope
下的任意库的vue-*
表示接下来的配置针对以vue-开头
的库**
表示接下来的配置针对任意库
access
和 publish
分别控制访问(下载)和发布的权限范围proxy
控制从哪个下载源(uplink)
uplinks
uplinks
类似于 git 的 remote
,说白了就是私库的上游是什么,当私库中不存在用户要安装的包时,就会继续往上游拉取
1 | uplinks: |
例如上述配置,指定了三个不同的源,分别对应于 官方npm
, 淘宝npm
, 其他私有库
uplinks
可以在 packages
中,根据不同组的下载需求,配置 proxy
例如
1 | packages: |
上述配置表明 @restrict
scope下的包,都从 https://192.168.0.100:6999/ 这个源下载
实操之更进一步
在实际企业运维的情况下,我们肯定不能直接在终端执行 verdaccio 命令就结束战斗,因为这样会存在一些问题,如
- 没有办法对实际的平台运行内存消耗进行监控
- 如果机器重启,那这个 verdaccio 进程也就消失殆尽了
- 如果是服务器环境,总不能开个 verdaccio 占满输入输出吧?如果用户退出了呢?可能有的人会选择使用 nohup 之类的,也可以一定程度上达到目的,但在我个人看来总归不太稳
如果你的需求只是简单的让服务跑起来,甚至可以容忍这些不稳定因素的话,那么搭建过程到这里就结束了
如果你对服务运维有更加稳定的需求,那么还需要启动额外的运维辅助程序
针对以上几个方面,使用一些 node app 的运维管理应用来辅助运行这个私库程序会更好
在我的实际经验中,pm2
能在这方面带来比较好的体验
pm2
PM2 是一个帮助你管理并保持你的Nodejs应用 7/24 小时在线的后台程序
也就是 pm2 的特性可以帮助你更好地在后台运行 nodejs 应用
pm2 安装 & 运行
1 | Install |
让 pm2 找到 verdaccio 的执行 bin 路径,并启动即可
这时用 pm2 list
可以查看运行的 verdaccio 进程
pm2 的其他更多用法在本文暂不赘述
◉ End.
参考资料:
如博文有叙述不妥以及不准确的地方, 望各位看客不吝赐教, 感谢.