Node.js 节点包管理器(NPM)似乎会产生重复的包

Node.js 节点包管理器(NPM)似乎会产生重复的包,node.js,module,npm,Node.js,Module,Npm,我已经安装了一些节点包,我注意到NPM创建了大量重复的节点包 例如,我首先安装了mongoose,它自然安装了一系列依赖项。然后我安装了mongodb包,它也是作为依赖项随bson一起提供的。由于依赖项重叠,我有以下异常情况: Mongodb位于以下目录中: /usr/local/lib/node_modules/mongodb/ /usr/local/lib/node_modules/mongoose/node_modules/mongodb/ 此外,bson是mongodb的一个依赖项,在

我已经安装了一些节点包,我注意到NPM创建了大量重复的节点包

例如,我首先安装了mongoose,它自然安装了一系列依赖项。然后我安装了mongodb包,它也是作为依赖项随bson一起提供的。由于依赖项重叠,我有以下异常情况:

Mongodb位于以下目录中:

/usr/local/lib/node_modules/mongodb/
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/
此外,bson是mongodb的一个依赖项,在以下两种情况下都存在:

/usr/local/lib/node_modules/mongodb/
/usr/local/lib/node_modules/mongoose/node_modules/mongodb/
我意识到这些只是千字节的文件,但我觉得这可能会产生大量冗余。最后,我可能会得到一个非常复杂的树,类似于以下内容:

/usr/local/lib/node_modules/[something1]/node_modules/[something2]/node_modules/[something3/.../.../node_modules/[somethingX]/
在这种情况下,/usr/local/lib/node_模块下的X层上可能存在给定的[dependency]

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


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

问题是,当mongoose只编码为与mongodb的v1一起工作时,而您的应用程序编码为与mongodb的v2一起工作时,它会安装并加载这两个版本,这样就可以全部工作。我们可以在node中轻松做到这一点,因为require模块方式不会污染全局名称空间,这与浏览器不同,浏览器会因为全局名称空间污染而使管理和包含正确的依赖项成为一件非常痛苦的事情


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

在安装了一系列不同的模块并启动了一系列不同的项目之后,这难道不会创建一个繁忙的层次结构吗?有没有一种方法可以使用NPM运行递归更新?如果人们编写的是有一天会完成的小模块,而不是总是不断更新的大模块,那么只会安装模块的一个副本。因此,事实证明这并不是一个大问题,因为大多数节点模块都很小,如果不是,它们会听substack(James Halliday-)一段时间,然后相信也会采用微小的哲学:)不久前,我在这里发布了一些关于这个问题的想法:也许这会有所帮助,我花了很长时间才意识到这一点:)
如果[两者]。。。允许相同的[]版本。。。将只安装一个副本
那么为什么不安装呢?我有一个特殊的情况,只有一个副本应该使用,但几个副本正在安装,这需要很长时间,因为。。。嗯,我不知道为什么,但每个实例需要相当长的时间来安装!