为什么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第二个选项。