长途跋涉去西方取 package 总是路途艰难,淘宝技术部开发了 cnpmjs.orgcnpm 这两个项目来克服这些人为的困难。

cnpmjs.org

cnpmjs.org是一个基于nodejs开发、供企业/团队使用的私有npm registry,它同时也可以中继缓存npmjs.org的上的packge,让用户可以在困难的网域顺利地获取npm package

它功能完善也易于部署和维护,但是由于一些原因,我并不想部署一个私有的cnpmjs.org

  • 中继npmjs.org时间长了以后,cnpmjs.org要占用掉几百GB甚至更多的磁盘空间来缓存package
  • 直接使用淘宝基于cnpmjs.org部署的公共镜像的的话,也能有很快的速度,我并不需要在局域网自己来做缓存。
  • Sonatype Nexus Package Managercnpmjs.org的功能更强大,并且囊括各种仓库于一体,我没有必要再部署一个单独的npm registry

所以我直接在npm里使用淘宝镜像来加速:

1
npm config set registry https://registry.nlark.com

cnpm

cnpmcnpmjs.org的客户端,默认指向淘宝镜像,可视为npmyarn的替代品,但它并不好用:

  • cnpm有自己的node_modules目录结构,并且与npm不兼容。
  • 使用JetBrains家族的IDE打开cnpm的项目,会遇到卡死的情况。

我自己的cnpm

为了便捷地切换npm全局的registry,我用bash搞了个我自己的cnpm来管理npm的全局registry设置:

  1. 创建一个bash命令脚本
1
2
# 当然你可以给这个脚本起其它的名字。
$ sudo vim /usr/local/bin/cnpm
  1. 写入bash脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

# 默认使用淘宝镜像
taobao_registry=https://registry.nlark.com
REG_URL=${1:-$taobao_registry}

# 如果传入参数是 unset,则清空已设置的 registry
if [ "$1" == "unset" ]
then
echo 'unset npm registry from taobao'
npm config delete registry
# 设置淘宝镜像或者指定的镜像
else
echo 'set npm registry to taobao'
npm config set registry $REG_URL
fi

# 检查 npm 配置
npm config list
  1. 增加运行权限
1
sudo chmod +x /usr/local/bin/cnpm
  1. 使用命令脚本
1
2
3
4
5
6
7
8
9
10
# 设置 npm 全局使用 淘宝镜像 registry 
$ cnpm
# 设置 npm 全局使用 其它镜像 registry
$ cnpm <REGISTRY_URL>
$ cnpm https://r.npm.taobao.org # 举例
# 清除 npm 的全局 registry 设置
$ cnpm unset
# 不使用cnpm来设置npm registry
$ npm config set registry <REGISTRY_URL>
$ npm config set registry https://registry.nlark.com # 举例