节点包管理器(NPM)似乎产生了重复的包

zcs*_*rei 5 module node.js npm

我一直在安装一些节点包,我注意到的是NPM创建了一堆重复项.

例如,我首先安装了mongoose,它自然地安装了一堆依赖项.然后我安装了mongodb软件包,它也带有bson作为依赖项.由于重叠依赖,我有以下异常:

Mongodb存在于以下目录中:

/usr/local/lib/node_modules/mongodb/
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/
Run Code Online (Sandbox Code Playgroud)

另外,bson,mongodb的依赖关系存在于这两个方面:

/usr/local/lib/node_modules/mongodb/
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/
Run Code Online (Sandbox Code Playgroud)

我意识到这些只是千字节的文件,但我觉得这可能会产生很多冗余,最终我可能会得到一个非常复杂的树,类似于以下内容:

/usr/local/lib/node_modules/[something1]/node_modules/[something2]/node_modules/[something3/.../.../node_modules/[somethingX]/
Run Code Online (Sandbox Code Playgroud)

在这种情况下,给定的[dependency]可能出现在/ usr/local/lib/node_modules下的X级别上.

我主要关心的是更新这些模块.我不觉得很难想象同时安装不同版本的并发模块.

将所有内容直接放在/ usr/local/lib/node_modules /然后交叉引用依赖项会不会更容易?

bal*_*ton 3

问题是,当 mongoose 仅​​编码为与 mongodb v1 一起使用时,并且您已将应用程序编码为与 mongodb v2 一起使用时 - 因此,它会安装并加载两个版本,以便一切正常。我们可以在节点中轻松地做到这一点,因为 require 模块方式不会污染全局名称空间,这与浏览器不同 - 由于全局名称空间污染,这使得管理和包含正确的依赖项成为巨大的痛苦。

现在,如果您的 package.json 和 mongoose 的 package.json 允许相同的 mongodb 版本(您可以指定特定版本或范围),那么执行 arm -Rf node_modules; npm install只会安装一份 mongodb 副本,而不是两个。但是如前所述,如果指定了多个版本,则会安装并加载多个版本。