Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在nodejs require()中的另一个模块中使用一个模块功能_Node.js_Module_Require - Fatal编程技术网

Node.js 如何在nodejs require()中的另一个模块中使用一个模块功能

Node.js 如何在nodejs require()中的另一个模块中使用一个模块功能,node.js,module,require,Node.js,Module,Require,我想在另一个模块中使用一个模块功能 文件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(...) {...}); }); }

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

文件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

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

您也可以在声明
\uu
时跳过
var
,使其成为全局变量,但这会带来全局变量的所有问题,例如:

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

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

您也可以在声明
\uu
时跳过
var
,使其成为全局变量,但这会带来全局变量的所有问题,例如:

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

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

var _ = require("./underscore.js");
但是,如果需要在多个模块之间传输一个对象实例,可以使用process object使其成为全局对象。但这是不好的实践

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(...);

我希望你明白了这一点。

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

var _ = require("./underscore.js");
但是,如果需要在多个模块之间传输一个对象实例,可以使用process object使其成为全局对象。但这是不好的实践

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(...);

我希望你明白了这一点。

只需添加
var\u=require(“./underline.js”)到你的bar.js上。@Mahn谢谢,是的,Ivan Vergiliev也是这么说的。问题解决了,现在添加了一个我需要在“main.js”和“bar.js”中使用的需求,我正在考虑哪个解决方案更好:Vyacheslav Voronchuk的(传入
)、或者你的(在两个地方需要);当您将每个模块的内容看作一个单独的实体时,这是有意义的到你的bar.js上。@Mahn谢谢,是的,Ivan Vergiliev也是这么说的。问题解决了,现在添加了一个我需要在“main.js”和“bar.js”中使用的需求,我正在考虑哪个解决方案更好:Vyacheslav Voronchuk的(传入
)、或者你的(在两个地方需要);当您将每个模块的内容视为一个单独的实体时,这是有意义的。谢谢,这种方式完全有效(即在模块中调用require),并且如果lib仅在顶级模块中使用,这似乎是一种最佳实践。我正在考虑使用传入解决方案(来自Vyacheslav),主要是因为我在main.js的其他部分中也需要下划线…谢谢,这种方式完全有效(即在模块中调用require),如果lib只在顶级模块中使用,这似乎是一种最佳实践。我正在考虑使用传入解决方案(来自Vyacheslav),主要是因为我在main.js的其他部分也需要下划线…感谢这个解决方案,我测试了Ivan和Mahn解决方案以及您的解决方案,它们都很好,您的可能是最好的,因为我计划在main.js和bar.js中使用
,我测试了Ivan和Mahn解决方案以及您的解决方案,它们都运行良好,您的解决方案可能是最好的,因为我计划在main.js和bar.js中使用