node.js中的重叠依赖



如果我需要一个npm模块,而这个npm模块已经作为另一个模块的子依赖项安装了,我还应该把它和npm一起安装吗?

例如,kue需要redis,所以kue安装了redis。NPM install kue

/node_modules/kue/node_modules/redis

我是否还应该安装redis,因此npm install redis

/node_modules/redis/

或者我可以在我的require语句

中添加对从kue安装的redis的引用
require("/node_modules/kue/node_modules/redis")

代替

require ("redis")

还是有更好的方法?

这里有一个一般的经验法则:

如果在应用程序的源代码中使用了require('module-name'),则应该将module-name列为依赖项。将依赖项的依赖项视为不透明的实现细节,不要关心它们。

这允许kue依赖于一个不同的redis模块版本,而不是你的应用程序,或者切换到一个完全不同的模块实现。所有这些都不会影响您的应用程序。

Node的模块系统与"传统"的模块系统(例如Ruby)不同,同一个模块的多个版本可以在同一个进程中加载而不会引起冲突。一开始感觉有点不对劲,但只要坚持下去,你很快就会看到好处。我猜想,随着社区对Node这方面的进一步探索,我们将看到一些利用它的有趣项目的出现。

直接在本地安装。

如果你想要一个不同版本的redis,而不是与kue安装的版本呢?当你更新kue的版本时,如果redis的版本突然改变了怎么办?

你真的不应该关心node_modules的内容,只要require(module)工作如预期。节省几kb的源代码是不值得的。

你不应该关心自己安装模块和依赖项,让NPM为你做这些。

同样,只安装一个Redis也不是很好,因为Kue(或其他依赖Redis的模块)可能需要一个特定的版本,而其他模块可能需要另一个版本。

让NPM为你做所有的工作,只在你的代码中npm install packagerequire('package')。正如@Raynos所说,节省几kb的代码并不是什么了不起的事情,甚至可能给您带来麻烦。

最新更新