为什么require()会给我一个从不同位置加载的模块的新副本?

我很新的Node.JS发展,我试图创build一个Hubot适配器。

hubot模块导出一个名为TextMessage的类,我需要使用它。 在我的适配器中,我创build了一个实例并将其传递给运行的机器人,如下所示:

 {Adapter, TextMessage} = require 'hubot' class MyAdapter extends Adapter onNewMessage: (text) => @receive new TextMessage text 

但是, 在Hubot自己的代码中,它检查我的消息是instanceof TextMessage一个instanceof TextMessage 。 当我运行一个bot并使用我的适配器时,这个检查总是失败。

项目结构如下所示:

 my-bot |- node_modules |- my-adapter | |- node_modules | | |- hubot |- hubot 

因此,在my-adapter require('hubot')给我一个hubot模块的副本,就像给my-bot

我很确定我不了解Node模块的一些基本概念。 我究竟做错了什么?

这样devise的原因是,模块总是可以得到一个“新鲜”的版本(没有被任何一个库所修改)。 通常,如果您require()您的依赖项之一,那么您应该能够依靠该模块的默认行为。 (替代是不可预测的,可能不安全。)

如果您的模块的目的是调整另一个模块,那么您应该:

返回一个修改的模块

例如,你的模块可能会这样做:

 module.exports = require('hubot'); // ... your custom modifications 

要么:

 var hubot = module.exports.hubot = require('hubot'); 

这意味着应用程序本身不会依赖hubot ,而只依赖于你的模块。

不要将hubot列为适配器的依赖项

Node.js require()调用级联的path – 所以如果你根本不安装hubot作为依赖,那么你仍然可以require()它,它会使用应用程序的版本。

这意味着可以在不安装hubot的情况下安装模块,从而导致问题 – 但另一方面,它也允许多个模块修改相同的基础模块。

就我个人而言,我会select第二个选项。