【问题标题】:How to Use one module feature within another module in nodejs require()如何在 nodejs require() 中的另一个模块中使用一个模块功能
【发布时间】:2012-10-13 22:31:55
【问题描述】:

我想在另一个模块中使用一个模块功能

文件 main.js

var _ = require("./underscore.js");
var foo = require("./bar.js");
foo.publish(...);

文件 bar.js

(function(e) {
    var array = [...];
    e.publish = function(t, args) {
        _.each(array, function(...) {...});
    });
})(exports);

我尝试了几种变体,但不确定解决此错误的最佳方法:

ReferenceError: _ is not defined

【问题讨论】:

  • 只需将 var _ = require("./underscore.js"); 添加到您的 bar.js 中。
  • @Mahn 谢谢,是的,这也是 Ivan Vergiliev 所说的。问题解决了,现在添加一个要求,我需要在“main.js”和“bar.js”中使用_ 我正在考虑哪个解决方案更好:Vyacheslav Voronchuk 的(传入_),或者你的(在两个地方需要)。
  • 我只想在每个模块中包含需求;当您将每个模块的内容视为一个单独的实体时,这是有道理的。

标签: node.js module require


【解决方案1】:

是的,您应该在每个需要该变量的模块中使用,以您为例。

var _ = require("./underscore.js");

但是如果您需要在多个模块之间传输一个对象实例,您可以使用 process 对象使其成为全局对象。但这是不好的做法。

process._ = require("./underscore.js");

在模块之间传递对象实例的好方法是将它们作为函数参数传递,但是您需要更改 bar.js 以返回工厂函数,而不是对象本身。

module.exports = function(_) {
   var e = {};
   var array = [...];
   e.publish = function(t, args) {
      _.each(array, function(...) {...});
   });
   return e;
}

在 main.js 中:

var _ = require("./underscore.js");
var foo = require("./bar.js")(_);
foo.publish(...);

希望你明白了。

【讨论】:

  • 感谢您的解决方案,我测试了 Ivan 和 Mahn 解决方案以及您的解决方案,它们都运行良好,您可能是最好的,因为我计划在 main.js 和 bar.js 中使用 _
【解决方案2】:

您分配结果的变量是模块 main.js 的本地变量,因此您无法在 bar.js 中访问它。相反,您应该也需要 bar.js 中的下划线模块。

您也可以在声明_ 时跳过var 并将其设为全局变量,但这会带来全局变量的所有问题,例如:

  • bar.js 模块没有明确说明其依赖关系,因此很难理解它期望全局需要下划线;
  • 它需要特定的初始化顺序 - 如果您稍后移动 _ = require(underscore),您将再次遇到未定义的错误,并且可能很难理解原因;
  • 需要bar.js 的所有其他模块也需要underscore

【讨论】:

  • 谢谢,这种方式完全有效(即在模块中调用 require),如果 lib 仅在顶级模块中使用,这似乎是最佳实践。我正在考虑使用传入解决方案(来自 Vyacheslav),主要是因为我在 main.js 的其他部分也需要下划线...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多