Docker/Verdaccio快速创建NPM私有仓库
随着前端工程化的概念深入人心,为了提高效率减轻程序员crv的负担,在满足项目组开发规范的前提下,将一些满足通用型的功能或者项目基础,作为脚手架、插件发布至公司内的独立仓库内,但是如果仅仅使用git去拉取反而不好管理,毕竟万一有人提交违背规则的代码,就脱离了管理的束缚,并且公司内的脚手架、组件等都属于公司财产不能上传至公网,所以私有仓库是必须的
npm私有库的好处
- 安全性角度考虑:如果我们想要一个公共组件库,那么把组件放到我们私有库中,只有内网可以访问,这样可以避免组件中业务的泄露;
- 模块复用性角度考虑:多个项目之间有重复的共有模块,当需要修改模块,通过简单的统一的配置就可以实现;提炼后的组件有专门的地址可以用来查看,方便使用,在后期项目的引用中也能节约开发成本
- npm 包下载速度角度考虑:使用内部的地址,能够在开发下载 node 包的同时,将关联的依赖包缓存到 npm 私有仓库服务器中,下载速度更快;
- 项目开发中的路劲角度考虑:在项目开发中书写代码更整洁简练,不需书写更长的相对路径;
- 公司技术沉淀角度考虑:知识的沉淀,在公司业务相关的应用上尤佳;
- 版本角度的考虑:相当于一个容器,统一管理需要的包,保持版本的唯一;
- 开发效率角度考虑:使私有公共业务或组件模块能以共有包一样的管理组织方式,保持一致性,提高开发效率.
npm私有库原理

用户执行 install 命令后会
- npm服务会先查询所有的请求模块是否在私有仓库内或者是已缓存的公共模块
- 如果是已缓存的模块则直接跳过
- 如果是存在私有库内的模块则从私有库下载模块,
- 如果模块不在私有库内且并未缓存,则通过当前配置的数据源进行请求(数据源可以是npm、cnpm)
Verdaccio框架
- 基于 Node.js 的网页应用程序
- 私有 npm registry
- 本地网络 proxy
- 可插入式应用程序
- 易安装和使用
- 提供 Docker 和 Kubernetes 支持
- 与 yarn, npm 和 pnpm 100% 兼容
- forked 于 sinopia@1.4.0 并且 100% 向后兼容。
docker镜像拉取
# 使用docker搭建,略过下面这种使用方式
# npm install --global verdaccio
docker pull verdaccio/verdaccio
mkdir -p ~/docker/verdaccio
cd ~/docker/verdaccio
git clone https://github.com/verdaccio/docker-examples
cd ~/docker/verdaccio/docker-examples
mv docker-local-storage-volume ~/docker/verdaccio
rm -rf ~/docker/verdaccio/docker-examples
chown -R 10001:65533 ~/docker/verdaccio
Verdaccio配置
#
# This is the default config file. It allows all users to do anything,
# so don't use it on production systems.
#
# Look here for more config file examples:
# https://github.com/verdaccio/verdaccio/tree/master/conf
#
# 用户下载安装的包都被缓存在此配置的目录
storage: ./storage
# 插件所在目录
plugins: ./plugins
# 定制 Web 界面
web:
# 访问服务主页时(http://localhost:4873/),网页标签的title名称,可改成公司名称
title: JK724包管理中心
# Gravatar 头像支持,默认关闭,可打开(http://cn.gravatar.com/)
gravatar: true
# 默认情况下package 是升序自然排序的, 可选值: asc 或 desc
# sort_packages: asc
auth:
htpasswd:
# 存储了加密认证信息的 htpasswd 文件
file: ./htpasswd
# 允许注册的用户最大数量, 默认值是 "+inf",即不限制
# 可以将此值设置为-1 以禁用新用户注册。
# max_users: 1000
# 如果你要安装的包在私有的npm库里没有找到,就去下面的服务列表里找
uplinks:
npmjs:
url: https://registry.npmjs.org/
packages:
'@*/*':
# scoped packages
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
'**':
# 默认情况下所有用户 (包括未授权用户) 都可以查看和发布任意包
#
# 你可以指定 用户名/分组名 (取决于你使用什么授权插件,默认的授权插件是内置的 htpasswd)
# 访问权限有三个关键词: "$all", "$anonymous", "$authenticated"
# $all 表示不限制,任何人可访问;$anonymous 表示未注册用户可访问;$authenticated 表示只有注册用户可访问
access: $all
# 允许所有注册用户发布/撤销已发布的软件包
# (注意:默认情况下任何人都可以注册)
publish: $authenticated
unpublish: $authenticated
# 如果私有包服务不可用在本地,则会代理请求到'npmjs'
proxy: npmjs
# You can specify HTTP/1.1 server keep alive timeout in seconds for incoming connections.
# A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout.
# WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enough.
server:
keepAliveTimeout: 60
middlewares:
audit:
enabled: true
# 终端日志输出配置
logs:
- { type: stdout, format: pretty, level: http }
#- {type: file, path: verdaccio.log, level: info}
#experiments:
# 支持 npm token 命令
# token: false
启动镜像并配置npm
docker run --name verdaccio -itd -v ~/docker/verdaccio:/verdaccio -p 4873:4873 verdaccio/verdaccio
# 打开 http://localhost:4873 验证
npm set registry http://localhost:4873/
npm install -g nrm
nrm ls
nrm add verdaccio http://127.0.0.1:4873
# nrm del verdaccio
nrm use verdaccio
npm adduser --registry http://localhost:4873
npm publish --registry http://localhost:4873
npm unpublish <package-name> --force
npm unpublish --force [packageName@version]
如若发生一下错误请检查verdaccio的文件夹权限
npm ERR! code E500
npm ERR! 500 Internal Server Error - PUT http://localhost:4873/-/user/org.couchdb.user:makai - internal server error
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/admin/.npm/_logs/2021-05-31T06_12_12_217Z-debug.log
测试发布
mkdir ~/test
cd ~/test
npm init -y
npm publish
将一个scope和一个仓库关联
scope可以和一些自己搞的npm仓库关联起来。这样你就可以同时使用npm公共仓库和一些其他的私有仓库中的模块,例如企业npm。可以用npm login把scope关联到一个仓库:
npm login –registry=http://reg.example.com –scope=@myscope
scope和仓库可以是一个多对一的关系:一个仓库里边可以放多个scope,但是一个scope同时只能放在一个仓库中。也可以用npm config把scope关联到一个仓库:
npm config set @myscope:registry http://reg.example.com
当一个scope关联到一个私有仓库之后,该scope下的模块在npm install的时候都会从它关联的仓库中获取模块,而不是npm配置的仓库,发布的时候也是同样的道理,会发布到它关联的仓库而不是npm配置的仓库。