本文输出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 23 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 [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 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 [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下目录成群···