首先我们得明白这个: package.json中库的版本号详解:
- ~ 匹配最近的小版本依赖包,比如~1.2.3会匹配所有1.2.x版本,但是不包括1.3.0
- ^ 匹配最新的大版本依赖包,比如^1.2.3会匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0
- *意味着安装最新版本的依赖包
原理图:
栗子:
首先我们npm init
一个目录用来测试
安装npm install lodash@4.11.1
生成了对应文件以及锁包lock文件
可见我们安装的版本是我们想要的4.11.1版本:
lock文件里面也声明了对应的版本号:
ok现在刚刚安装的包已经在缓存里了 我们删除node_modules文件夹重新执行npm install
:
因为lock文件的存在 且前面安装过一次的那个版本符合 ^ 符号的版本范围 所以会直接从缓存取 所以版本依然是正确的
那么lock不存在呢?版本还正确吗? 现在我们删除node_modules以及package-lock.json,只留一个package.json用来
npm install
,看看安装版本还准不准确。
重新执行完npm install
后同样生成了以下文件:
那么版本正确吗 是我们想要的4.11.1吗?
很明显更新到了4.x.x的最新版本了 不是我们想要的版本 因为lock文件不存在就会直接从registry仓库取符合版本符号最新的版本
注:npm从版本5开始支持锁包 可以用npm -v查看自己的npm版本。 注:cnpm目前不支持锁包。