背景
随着项目越来越多,前端承受的分工压力会越来越大,业务线较多,前端项目变得庞杂,因此我们可能会考虑根据业务线进行拆分为几个工程系统,这样又引申出一个问题:这几个系统之间如何共用一套公司内部的组件库呢?每个工程里面都copy一套肯定不行,做一个小修改要同步几个工程,繁琐且容易出错。上传到npm库是个很不错的选择,不同的系统都指向一个npm源,然后通过npm install就行,快速且“干净”,所以在这种场景下,搭建一套公司内部的npm库就显得很有必要。简单来说,npm私服主要优势其实就两个:
- 托管公司内部组件库代码,不对外,方便管理
- 项目中使用到的npm包会缓存到私服库里,能明显提升之后下包的速度
解决方案
cnpm(https://github.com/cnpm/cnpmjs.org)
搭建麻烦,需要配置mysqlsinopia(https://www.npmjs.com/package/sinopia)
搭建十分简单友好,但已经5年前就停止维护verdaccio(https://verdaccio.org)
基于sinopia建的一个分支,搭建私服很简单,维护比较积极环境搭建
1.全局安装verdaccio
npm i -g verdaccio
2.全局安装pm2
npm i -g pm2
3.安装nginx
3.1在终端输入:
brew install nginx
3.2检查nginx是否安装成功:
nginx -v
3.3配置nginx
cd /usr/local/etc/nginx/
修改nginx.conf
,加上这一段:
server {
listen 80;#要监听的端口
server_name registry.npm.your.server;#本机ip或域名
location / {
proxy_pass http://127.0.0.1:4873/;#verdaccio默认的端口
proxy_set_header Host $host;
}
}
3.4启动nginx,在终端输入:
sudo nginx
4.pm2启动服务
执行pm2 start verdaccio
,然后浏览器访问http://服务器IP
,出现以下页面则代表安装成功。
verdaccio使用
公司npm仓库地址http://10.35.46.142:4873,如果在自己本地安装,改成本机ip即可
单个项目配置npm config
在项目根目录添加.npmrc
文件,在文件中添加
@b612:registry=http://10.35.46.142:4873
全局重新配置npm config
npm的配置一般都存放在~/.npmrc
,设置安装内部包的规则,直接修改~/.npmrc
文件,追加
@b612:registry=http://10.35.46.142:4873
或者使用命令设置
npm config set @b612:registry http://10.35.46.142:4873
安装内部npm包
配置好npm config后,就可以直接安装内部npm包,跟安装其它npm包无区别
npm i @b612/xxxx #使用npm安装
yarn add @b612/xxxx #使用yarn安装
注册用户与登录
- 添加一个用户:
npm adduser --registry http://10.35.46.142:4873
登录:
npm login --registry http://10.35.46.142:4873
发布
1.配置
.npmrc
文件给要添加到服务的工程添加源信息,在工程根目录下新建
.npmrc
文件,添加以下内容:registry=http://10.35.46.142:4873
package.json
中设置好版本,执行npm publish
package.json
示例{
"name": "@b612/foodie-jsbridge",
"version": "1.0.0",
"description": "foodie jsbridge",
"homepage": "http://10.35.33.29:9999/dengjianjun/magic",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": "http://10.35.33.29:9999/dengjianjun/magic",
"keywords": [
"foodie",
"jsbridge"
],
"author": "dengjianjun",
"license": "ISC"
}
2.指定
registry
(推荐)如果没有在
.npmrc
文件中指定registry
,可以执行npm publish --registry http://10.35.46.142:4873
发布版本到内部npm仓库3.设置publishConfig
在package.json中设置publishConfig
{
"publishConfig": {
"registry": "http://10.35.46.142:4873"
}
}
详见官方文档https://verdaccio.org/docs/en/installation#basic-usage
注意事项
package.json中的name必须是@b612/开头
- 每一次发布的版本号不能一样,在package.json中version字段,建议在README.md中说明本次版本改了什么内容,方便维护和使用
verdaccio最佳实践
上述publish仓库的步骤很简单,创建用户 -> 设置npm源 -> npm publish。但这样并不是我们想要的流程,我们想要的是publish权限可把控,这当然是可以做的。查看config.yaml配置文件
一般来说此配置文件在~/.config/verdaccio
中,如果你不确定,你可以直接在服务器上执行verdaccio
命令,第一个config file即文件所在位置.
这个目录下有两个文件及一个目录:
打开config.yaml
,查看packages项,原始内容为:
packages:
'@*/*':
# scoped packages
access: $all
publish: $authenticated
unpublish: $authenticated
proxy: npmjs
'**':
# allow all users (including non-authenticated users) to read and
# publish all packages
#
# you can specify usernames/groupnames (depending on your auth plugin)
# and three keywords: "$all", "$anonymous", "$authenticated"
access: $all
# allow all known users to publish/publish packages
# (anyone can register by default, remember?)
publish: $authenticated
unpublish: $authenticated
# if package is not available locally, proxy requests to 'npmjs' registry
proxy: npmjs
字段含义:
scope有两种模式
一种是 @/ 表示某下属的某项目
另一种是 * 匹配项目名称(名称在package.json中有定义)
权限:
access
: 表示哪一类用户可以对匹配的项目进行安装(install)publish
: 表示哪一类用户可以对匹配的项目进行发布(publish)proxy
: 如其名,这里的值是对应于 uplinks 的名称,如果本地不存在,允许去对应的uplinks去取。值的含义:
$all
表示所有人(已注册、未注册)都可以执行对应的操作$authenticated
表示只有通过验证的人(已注册)可以执行对应操作,注意,任何人都可以去注册账户。$anonymous
表示只有匿名者可以进行对应操作(通常无用)
如果要指定某个用户才有权限,可以直接写上用户名,多个用户用空格隔开,比如:
publish: michael martin
修改完成后请重启nginx和pm2。当前已存在的用户列表可在htpasswd
文件中查看。
更多配置详见https://verdaccio.org/docs/zh-CN/configuration
PS:
常用命令
注册用户:npm adduser —registry http://10.35.46.142:4873
- 登陆:npm login
- 退出:npm logout
- 查看当前用户,是否是注册用户:npm who am i
- 发布:npm publish
- 撤销发布的包版本:npm unpublish —force
- 删除发布的包:npm unpublish
nginx常用命令
//检查是否安装nginx及对应的目录
find /|grep nginx.conf
//启动Nginx
sudo nginx
//关闭Nginx
sudo nginx -s quit
//重启nginx
sudo nginx -s reload
相关链接
如何管理公司内部的NPM包
npm私服搭建—verdaccio方案及其最佳实践
Mac系统下nginx的安装
verdaccio官网文档