Node.js 如何在nodejs require()中的另一个模块中使用一个模块功能
我想在另一个模块中使用一个模块功能 文件main.jsNode.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(...) {...}); }); }
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
下划线
\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中使用