前端架构之路(7) - 私有 npm 仓库

私有 npm 仓库

1. “私有 npm 仓库” 有何用

组件化之后,搭建 “私有 npm 仓库” 是个不错选择。

私有 npm 仓库可以让我们使用组件就像 npm 官方仓库里的包一样方便。

一般私有 npm 仓库有以下一些特性:

  • 私有包托管在内部服务器或者单独的服务器上;
  • 可以同步整个官方仓库,也可以只同步需要的;
  • 下载的时候,可以让公共包走公共仓库,私有包走私有仓库;
  • 可以缓存下载过的包;
  • 对于下载,发布,有对应的权限管理。

目前比较好的解决方案有两种:

  1. sinopiaverdaccio
  2. cnpm + cnpmjs.org

2. sinopiaverdaccio

sinopia 在15年的时候就停止更新了,继而由 verdaccio 提供更新升级,所以两者用法基本上都是一致的,以下都以 sinopia 为例说明。

2.1 安装

$ npm install -g sinopia

2.2 配置

配置文件位于 ~/.config/sinopia/config.yaml

# path to a directory with all packages
storage: /home/{user}/.local/share/sinopia/storage # 库存路径,需要考虑磁盘空间

web: # 自定义web项,即浏览器访问页面
  title: Sinopia

auth:
  htpasswd:
    file: ./htpasswd # 添加用户(npm adduser)后自动创建,保存用户信息,可以初始化用户

uplinks: # 可以配置多个上游地址,后面packages中的proxy指定用哪个
  npmjs:
    url: https://registry.npm.taobao.org/ # 更改此上游地址

packages: # 包的权限管理,$all为所有人,$authenticated为通过验证人
          # 分布和安装两种权限,值可以特指某几人
  '@*/*': # 跟package.json中的name属性进行匹配
    # scoped packages
    access: $all
    publish: $authenticated

  '*':
    access: $all

    publish: $authenticated

    proxy: npmjs

logs:
  - {type: stdout, format: pretty, level: http}

listen: 0.0.0.0:4873 # 设置监听地址,0.0.0.0匹配本机地址

更多配置参考 sinopia

2.3 设置 npm registry 属性

$ npm config set registry http://{服务器ip}:4873/

推荐使用 nrm 来快速切换 npm registry 配置。

2.4 运行

sinopia

或者使用 pm2 永久运行

pm2 start sinopia

现在你就可以发布私有包了。

3. cnpm + cnpmjs.org

sinopia 的优点是配置简单,对环境依赖少(仅 node 就够了),并且支持 windows 系统下运行。

但它也有缺点,主要是以下几点:

  • 权限管理比较弱,对用户权限,发布权限,下载权限控制不是很得心应手;
  • 缓存优化不足,经常会在安装共有包的时候处于挂起状态;
  • 不能做官方仓库的镜像。

所以,sinopia 比较适合个人搭建在本地作为 npm 缓存,这样,安装过的包会直接从缓存中获取,加快安装速度。

对于企业级的应用来说,就需要另外一个解决方案了:cnpm + cnpmjs.org

环境依赖:

  • node >= 4.3.1
  • linux(不支持 windows)
  • 数据库(mysql, sqlite, MariaDB, PostgreSQL)

3.1 安装

$ npm install -g cnpm
$ npm install -g cnpmjs.org

3.2 配置

配置文件位于 ~/.cnpmjs.org/config.json

{
  "debug": false, // 是否启动 debug 模式
  "enableCluster": true, // 是否启用 cluster 模式
  "mysqlServers": [ // 数据库配置,以 mysql 为例
    {
      "host": "host",
      "port": 3306,
      "user": "user",
      "password": "password"
    }
  ],
  "mysqlDatabase": "cnpmjs", // 数据库名
  "enablePrivate": true, // 是否启用私有化,这样只有定义在 `admins` 中的用户才能发布
  "admins": { // 管理员配置,可以配置多个
    "senntyou": "jiangjinbelief@163.com"
  },
  "syncModel": "exist", // 同步模式
  "scopes": [ // 包前缀,如果不是以这个前缀命名的包将不能发布,可以配置多个
    "@test"
  ],
  "registryHost": "http://your.company.npm.registry.com", // 你的服务器对应的 npm registry 地址
  "officialNpmRegistry": "https://registry.npm.taobao.org" // 如果在该仓库中找不到的包,会上游到哪里去找
}

更多配置参考 cnpmjs.org config

3.3 设置 cnpm registry 属性

$ cnpm config set registry http://your.company.npm.registry.com

3.4 运行

cnpmjs.org start

运行的时候将会开启两个端口:7001(registry),7002(web)。

7001(registry)

用来在命令行发布,下载包等对用的远程 registry 地址。比如一些比较常用的 registry 地址:

nginx 配置 url 地址到 7001 端口:

server {
    listen 80;
    listen [::]:80;

    server_name your.company.npm.registry.com;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:7001;

    }

    location ~ /.well-known {
        allow all;
    }

    client_max_body_size 50m;
}

重启 nginx,现在你就可以通过 http://your.company.npm.registry.com 去发布私有包到这个仓库里了(如果没有其他问题的话)。

7002(web)

用来在 web 端查看仓库信息,搜索包,包信息等。比如一些比较常用的地址:

nginx 配置 url 地址到 7002 端口:

server {
    listen 80;
    listen [::]:80;

    server_name your.company.npm.com;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:7002;

    }

    location ~ /.well-known {
        allow all;
    }

    client_max_body_size 50m;
}

重启 nginx,现在你就可以通过 http://your.company.npm.com 访问仓库web页面了(如果没有其他问题的话)。

永久运行

如果仅通过 cnpmjs.org start 运行,一旦关闭终端,程序就会停止运行。推荐使用 screen 命令开启永久运行,可以通过 Linux screen 了解下这个命令的用法。

# 创建一个名为 cnpmjs 的窗口
$ screen -S cnpmjs

# 运行程序
$ cnpmjs.org start

# 按Ctrl+a,然后再按d,离开当前窗口,而程序不会终止
Ctrl+a+d

# 重新进入 cnpmjs 的窗口,做更多的操作
$ screen -r cnpmjs

4. 后续

上一篇:组件化

下一篇:单页面应用(SPA)、按需加载

参考文章:

  1. 用sinopia在linux系统中搭建npm私有库

更多博客,查看 https://github.com/senntyou/blogs

作者:深予之 (@senntyou)

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容