理解npm的依赖关系

我试图弄清楚到底是怎么回事与npm依赖关系。

我的问题的最短具体forms是:鉴于我的传递依赖关系图使用不同的版本多次调用某个包,为什么这些不同的版本不在npm list或文件系统中显示?

我不想用垃圾混淆全局命名空间来进行testing,所以将使用我当前的实际项目; 我觉得它足够小,可以清楚。

 C:\ayane>npm list ayane@3.0.1 C:\ayane +-- clause-normal-form@2.4.0 | +-- big-integer@1.6.22 | +-- big-rational@0.10.6 | +-- clone@2.1.1 | `-- lodash@4.17.4 +-- command-files@1.1.0 | `-- glob@7.1.1 | +-- fs.realpath@1.0.0 | +-- inflight@1.0.6 | | `-- wrappy@1.0.2 | +-- inherits@2.0.3 | +-- minimatch@3.0.3 | | `-- brace-expansion@1.1.7 | | +-- balanced-match@0.4.2 | | `-- concat-map@0.0.1 | +-- once@1.4.0 | `-- path-is-absolute@1.0.1 +-- commander@2.9.0 | `-- graceful-readlink@1.0.1 +-- dimacs-parser@2.3.0 +-- get-stdin@5.0.1 +-- iop@1.4.1 `-- tptp-parser@2.5.1 

除了ayane依赖于clause-normal-form 2.4.0, tptp-parsertptp-parser依赖于clause-normal-form 2.3.0, 为什么这不是在上面显示?

 C:\ayane>tree /a Folder PATH listing for volume OS Volume serial number is C685-B1F1 C:. \---node_modules +---.bin +---balanced-match +---big-integer +---big-rational +---brace-expansion +---clause-normal-form +---clone +---command-files +---commander +---concat-map | +---example | \---test +---dimacs-parser +---fs.realpath +---get-stdin +---glob +---graceful-readlink +---inflight +---inherits +---iop +---lodash | \---fp +---minimatch +---once +---path-is-absolute +---tptp-parser \---wrappy 

同样的问题:为什么只有一个clause-normal-form目录出现?

这可能是因为除非另有说明,否则它只会安装同一个模块的一个版本。 这将是一个问题,如果clause-normal-form版本2.3.0和2.4.0不兼容,你可能会遇到一些麻烦,如果他们是。 为了获得最好的解决scheme,所以你的代码没有问题,你需要在package.json使用peerDependencies

https://nodejs.org/en/blog/npm/peer-dependencies/

PS:这不适用于npm版本3及以上版本,只会给我们一个警告,让我们手动安装它们