本文输出Node中另一款包管理工具CNPM相关的内容,包括基本情况和简单使用。

1.0 简单介绍

CNPM是阿里的Node团队开发的一款NPM工具,由蚂蚁金服Node技术专家苏千(袁锋·Node技术专家)和死马(何翊宇·Node技术专家·koa.js和egg.js框架核心维护者)主导,内核使用了自主研发的npminstall实现。CNPM依托于淘宝NPM镜像,在国内能够更快速的进行包和依赖的安装。

淘宝NPM镜像网站上面有关于镜像的说明:“这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步”

也就是说,我们在管理和安装包的时候使用淘宝NPM镜像跟直接使用npm来进行安装的资源其实是相同的,因为国内网络环境的原因,我们直接使用淘宝NPM镜像来下载包速度会更快一些。

2.0 基本使用

安装CNPM

$ npm install -g cnpm 全局安装CNPM
$ npm install -g cnpm - -registry=https://registry.npm.taobao.org 全局安装CNPM并切换源

注意 在命令行工具中执行上面命令的时候--中间没有空格。

在全局安装CNPM的时候如果切换了源,将会从Registry.npm.taobao.org来安装模块。当安装的时候如果发现安装的模块还没有同步过来, 那么淘宝NPM会自动在后台进行同步, 并且会让你从官方NPM Registry.npmjs.org进行安装. 当下次再安装这个模块的时候则直接从淘宝NPM安装。

查看CNPM版本

$ cnpm -v 查看cnpm的版本信息

包的安装

CNPM支持 npm 除了 publish 之外的所有命令,而且这些命令的使用方式和npm完全一致。

$ cnpm install xxx 安装指定包到当前路径(局部安装)
$ cnpm install -g xxx 安装指定包到全局包安装路径(全局安装)

这里简单列出上面几个命令的执行演示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
wendingding$ npm install cnpm -g --registry=https://registry.npm.taobao.org
npm WARN deprecated socks@1.1.10: If using 2.x branch, please upgrade to at least 2.1.6
to avoid a serious bug with socket data flow and an import issue introduced in 2.1.0
/usr/local/bin/cnpm -> /usr/local/lib/node_modules/cnpm/bin/cnpm
+ cnpm@6.0.0
added 12 packages, removed 8 packages and updated 58 packages in 29.841s

wendingding$ cnpm -v
cnpm@6.0.0 (/usr/local/lib/node_modules/cnpm/lib/parse_argv.js)
npm@6.4.1 (/usr/local/lib/node_modules/cnpm/node_modules/npm/lib/npm.js)
node@8.9.3 (/usr/local/bin/node)
npminstall@3.16.0 (/usr/local/lib/node_modules/cnpm/node_modules/npminstall/lib/index.js)
prefix=/usr/local
darwin x64 17.4.0
registry=https://registry.npm.taobao.org

wendingding$ cnpm install jquery
✔ Installed 1 packages
✔ Run 0 scripts
✔ All packages installed (1 packages installed from npm registry,
used 624ms(network 622ms), speed 660.5kB/s, json 1(5.19kB), tarball 405.64kB)

dingding:cnpm wendingding$ cnpm install -g jquery
Downloading jquery to /usr/local/lib/node_modules/jquery_tmp
Copying /usr/local/lib/node_modules/jquery_tmp/_jquery@3.3.1@jquery
to /usr/local/lib/node_modules/jquery
Installing jquery's dependencies
to /usr/local/lib/node_modules/jquery/node_modules
All packages installed (used 4ms(network 2ms), speed 0B/s, json 0(0B), tarball 0B)

同步模块

$ cnpm sync xxx 同步指定的模块。

CNPM还支持同步模块,只需要使用sync命令即可,下面列出同步模块命令的执行细节。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
wendingding$ cnpm sync jquery
Start sync ["jquery"].
sync jquery, PUT https://registry.npm.taobao.org/jquery/sync?publish=false&nodeps=false
logurl: https://npm.taobao.org/sync/jquery#logid=6065624
[2018-11-27 10:16:56]
user: anonymous, sync jquery worker start, 1 concurrency,
nodeps: false, publish: false, syncUpstreamFirst: false
[2018-11-27 10:16:56] ----------------- Syncing jquery -------------------
[2018-11-27 10:16:56]
[c#0] [jquery] package(https://r.cnpmjs.org/jquery) status: 200,
dist-tags: {"beta":"3.3.1","latest":"3.3.1"},
time.modified: 2018-01-20T17:27:17.000Z, unpublished: null, start...
[2018-11-27 10:16:56] [jquery] found 0 missing star users
[2018-11-27 10:16:56] [jquery] all versions are exists
[2018-11-27 10:16:56] [jquery] no versions need to deleted
[2018-11-27 10:16:56] [jquery] all 383 npm users exists
[2018-11-27 10:16:56] [c#0] [jquery] synced success, 0 versions:
[2018-11-27 10:16:56] ----------------- Synced jquery success -------------------
[2018-11-27 10:16:56] [done] Sync jquery package finished, 1 success, 0 fail
Success: [ jquery ]
Fail: [ ]
Sync all packages done, successed: ["jquery"], failed: []

3.0 番外篇

我们使用CNPM的主要原因在于它在处理包的时候速度更快,很多人认为它的可取之处仅在于使用了国内的镜像,其实就算不用国内的镜像,CNPM的安装速度相对NPM也要更快一些。这是因为CNPM在处理的时候会把一些包缓存到node_module/.npminstall目录下,再以符号链接的方式将依赖目录链接到其对应的路径,这样做的好处是相同版本的包在安装的过程中实际上只有一份实体

CNPM截止本文最新的版本6.0.0,在目录结构和依赖支持方面它的4.2以及4.3+版本是比较重要的一个分水岭。在4.2的版本里,它的目录结构和NPM 2保持一致,是嵌入式的结构。后来因为NPM 3的原因导致很多前端以及部分Node依赖在NPM 2下无法正常工作。

因此,在4.3版本中CNMP为前端开发者加入了扁平化的支持,即后期的版本中除按照嵌入式目录结构安装依赖外,还会顺便将计算得到的依赖(依赖依赖的依赖或者是依赖的特定版本)存放一份到node_moudles目录下,不过这也导致node_moubles下目录成群···