为什么 NPM 模块的依赖项总是可以安装到嵌套的 node_modules 中?

tho*_*rn̈ 6 npm node-modules protractor

如您所知,NPM v3 尝试使依赖关系树尽可能平坦。以前我认为它以嵌套方式安装依赖项只是为了解决冲突,以防同一模块有多个版本。

但是,我注意到 module 有一些奇怪的地方protractor。它有一个依赖项 ,webdriver-manager它总是以嵌套的形式安装到node_modules/protractor/node_modules。您可以通过npm install protractor在空文件夹中运行来轻松重现这一点。

为什么会发生这种情况?

Adi*_*ddy 2

这是一个很好的问题,当前的行为是预期的。npmV3确实以扁平结构安装依赖项,并且Protractor也以相同的方式安装

\n\n

当量角器安装时npmV3

\n\n

在此输入图像描述

\n\n

当量角器安装时npmV2.*

\n\n

在此输入图像描述

\n\n

所有模块均以扁平结构安装,但仍webdriver-manager采用嵌套结构。这是因为相互依赖的冲突。

\n\n

根据官方文档

\n\n
\n

您的依赖项现在将最大限度地平坦安装。只要可能,您的所有依赖项及其依赖项以及它们的依赖项都将安装在项目的 node_modules 文件夹中,且不存在嵌套。当两个(或更多)模块具有冲突的依赖关系时,您只会看到彼此嵌套的模块。

\n\n

现在,假设我们想要另一个模块 C。C 需要 B,但版本与 A 不同。但是,由于 B v1.0 已经是顶级 dep,所以我们无法安装 B v2.0 作为顶级依赖项。npm v3\n 通过默认 npm v2 行为并将新的、\n 不同的模块 B 版本依赖项嵌套在需要它的模块下(在本例中为模块 C)来处理此问题。

\n
\n\n

webdriver-manager package.json列出依赖项"minimist": "^1.2.0",,它与其他包的冲突要求,例如需要以下依赖项列表的 optimist

\n\n
  \xe2\x94\x9c\xe2\x94\x80 optimist@0.6.1\n   \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 wordwrap@0.0.3\n   \xe2\x94\x82  \xe2\x94\x94\xe2\x94\x80 minimist@0.0.10\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,由于依赖关系冲突,webdriver-manager安装在内部protractor node_modules

\n\n

执行npm-remote-ls protractor完整的依赖关系树并跨所有依赖关系进行冲突

\n