由于之前没有真正地了解cnpm导致最近踩了个坑:cnpm两种使用方式存在本质区别
因此做个学习记录,对学习到的相关知识点也做个归纳总结。
npm
npm(node package manager)nodejs包管理器, 安装、共享、分发代码,管理项目依赖关系。默认源为 registry.npmjs.org。 npm官网、 npm中文文档。
cnpm
由于npm默认源服务器在国外,国内访问较慢且不稳定,淘宝做了一个完整 npmjs.org 镜像cnpm, 同步频率目前为10分钟一次。源为 registry.npm.taobao.org。 cnpm文档
package-lock.json
package-lock.json的作用是 锁定版本。官方文档
npm install(npm版本大于v5.0.0)时,
- 若没有package-lock.json文件,会根据semver规则去下载依赖,并生成一份存有当前依赖版本的package-lock.json;
- 若有package-lock.json文件,会下载package-lock.json中依赖锁定的版本号。
package-lock.json准确的描述了当前项目npm包的依赖树,保证不同环境,不同时间下的依赖是一样的。package-lock.json文件中记录了下载源地址,可以加快install速度。
每次npm install,package-lock.json还是会被改动?
既然锁定了版本,存在package-lock.json时,每次npm install还是会被改动,原因是:
项目的依赖版本依然是被锁定,即使是小版本也不会更新,但是依赖的依赖并没有被锁定,因此会发现package-lock.json仅仅是修改了一些依赖的依赖,项目的依赖的版本并不会被修改

定制cnpm无视package-lock.json文件
而定制cnpm(非alias)在安装依赖时,会无视package-lock.json文件。
cnpm核心模块 npminstall 作者在《为什么我不使用 shrinkwrap(lock)》中解释了这么做的理由:
通过 semver 依赖机制,在一个良性的环境中,可以快速的正向传递新功能和 bug fix,而 shrinkwrap(lock)就是这个传递路径上的一道墙,虽然它也许可以挡住一些新 bug 的引入,但其实是得不偿失的。我们真正要做的是提供一个更好的环境(依赖可靠的模块)。
到底是选用semver依赖机制还是shrinkwrap,业界内各执己见,但我相信重要的不是哪种方式的好与坏,而是业务方的使用姿势正确。
cnpm的两种使用方式存在本质区别
cnpm文档中介绍了cnpm两种使用方式:
1. 使用定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
2. 通过添加 npm 参数 alias 一个新命令:
alias cnpm="npm --registry=https://registry.npm.taobao.org \
--cache=$HOME/.npm/.cache/cnpm \
--disturl=https://npm.taobao.org/dist \
--userconfig=$HOME/.cnpmrc"
天真我原本以为, 这两种使用方式并没有区别。后来我发现我错了,错的一塌糊涂~
第二种alias方式仅仅只是将registry源切换,且使用特定的cache、distur、userconfig等,但实际还是走npm,依赖安装策略还是走semver 依赖机制而不是cnpm的shrinkwrap(lock)。
因此,若工程的package-lock.json并没有被ignore,将会出现问题:
A同学本地使用alias cnpm,本地版本将会永远锁定;B同学本地使用定制cnpm,
假设该工程的某一个依赖没有遵循semver规范,小版本更新并没有兼容,因此会导致使用定制cnpm的B同学本地开发出现问题,而A同学是OK的。
npm install 与 npm ci
npm install
npm install,或者 npm i ,通常是用来安装依赖项:
- 如果使用 ^ 或 ~ 来匹配依赖项的版本时,会根据semver规则;
- 利用 npm install 安装新依赖项时,会更新 package-lock.json。
npm ci
使用 npm ci ,会发生:
- 将会删除项目中的 node_modules 文件夹;
- 不像 npm install , npm ci 不会修改你的 package-lock.json 。但是它确实期望你的项目中有一个 package-lock.json 文件 - 如果你没有这个文件, npm ci 将不起作用,此时必须使用 npm install 。
npm or pnpm or cnpm or yarn ?
-
pnpm,采用了一种巧妙的方法,利用硬链接和符号链接来避免复制所有本地缓存源文件。Why should we use pnpm?
-
cnpm,国产,核心模块
npminstall介绍:
This project is inspired by pnpm, and has a similar store structure like pnpm. You can read pnpm vs npm to see the different with npm.
-
yarn,优点 npm和yarn的区别,我们该如何选择?
-
npm:你们牛逼
nrm
快速切换npm registry源地址的工具。
NPM registry manager, fast switch between different registries: npm, cnpm, nj, taobao
nvm
Node版本管理工具。
nvm is a version manager for node.js, designed to be installed per-user, and invoked per-shell. nvm works on any POSIX-compliant shell (sh, dash, ksh, zsh, bash), in particular on these platforms: unix, macOS, and windows WSL.