请直接看官网英文文档,说的很明白的了:
npm v3 Dependency Resolution
如果要我简单来说的话,就是 npm3 和 npm2 对于依赖的处理不一样了
npm2所有项目依赖是嵌套关系,而npm3为了改进嵌套过多、套路过深的情况,会将所有依赖放在第二层依赖中(所有依赖只嵌套一次,彼此平行,也就是平铺的结构)
下面我来搬个砖,简单翻译一下:
举个栗子:
有一个模块A,其依赖于B:
现在有一个app应用依赖于A,执行:
npm install
会自动安装所有依赖。
npm3 会将模块A 和模块B 安装到同一 node_modules 目录下,二者是同级的;
而npm2 依然会在node_modules 中安装A,但是会将B 安装到 A里面的node_modules, 也就是 A 和 B 是嵌套关系:
现在假如 app 需要另一个模块C,并且 C 是依赖于另一个版本的B:
那么问题来了,在npm2中,由于是层层嵌套的结构,所以继续嵌套即可,但是npm3如何处理呢?已经有一个 B v1.0版本了,又不能相同目录下再来一个 B v2.0 ,那么变通一下,将 B v2.0 嵌套在 C 中即可:
在终端中,文件树长得像下面这样:
由于npm3 的改变,怕分不清彼此依赖了吗?
没关系,执行 npm ls
依然可以看到模块间彼此依赖关系:
如果你想查看最浅层的依赖关系,只需要:
npm ls --depth=0