npm2采用严格的包依赖模式
npm install [email protected]1.2.* ---- 1.2.0 <= version <= 1.2.9
npm install [email protected]1.* ---- 1.0.0 <= version <= 1.9.9
npm install [email protected]* ---- 0.0.0 <= version
npm install [email protected]^1.2.3 ---- 1.2.3 <= version < 1.9.9
npm install [email protected]~1.2.3 ----- 1.2.3 <= version <1.2.9
我们还可以通过npm info name,查看包的依赖包版本:
例如通过npm info vue,我们可以在输出的信息里面的
devDependencies 找到依赖于webpack的版本:webpack: ‘^3.10.0‘
npm3采用的包版本管理模式:
假如我们有一个包A 依赖于包B1.0.0,后来我们有了包C,包C需要依赖包B2.0.0,这个时候npm如何处理呢,npm会把包B2.0.0安装在包C下面,这个时候包B2.0.0嵌套在包C下面,所以我们本质上拥有两个版本的包B,如果我们又有了包D,包D也依赖于包B2.0.0,那么npm依然会在包D下面创建一个包B2.0.0,这个时候就拥有三个包B,假如包D不依赖包B2.0.0,而是依赖于包B1.0.0,那因为包B1.0.0是最先下载的,他属于顶级依赖,所以这个时候什么都不用做,因为包B1.0.0就在那里,这类似于全局环境和局部环境,我们把最先下载的包B1.0.0放入全局环境,如果以后有其他包(例如包C)依赖与包B2.0.0,则放入对应其他包(例如包C)的局部环境,因为局部环境对其他对象是不可见的,所以以后如果还会有其他包(例如包D)依赖于包B2.0.0,我们会另外创建一个包B2.0.0放入对应包D的局部环境,如果包D改为依赖包B1.0.0,因为包B1.0.0在全局环境,可以直接引用,所以就不需要做任何事情
那现在我们设定包D依赖于包B2.0.0,所以现在依赖于包B1.0.0的只有包A,如果我们升级了包A,升级后的包A依赖于包B2.0.0,那么最终会在全局环境删除包B1.0.0,因为包B1.0.0不再有价值了,然后在全局环境换成包B2.0.0,因为新升级的包A需要包B2.0.0,注意这个时候局部环境的包B2.0.0仍然存在,所以很多时候我们需要去重,去掉重复的包引用,例如本例:全局环境和局部环境引用了同样的包B版本,我们通过执行:
npm dedupe
达到删除局部环境里面包B2.0.0的目的,