我有以下项目结构
|server
|- module1.js
|- module2.js
|app.js
module1.js 看起来就是这样
module.exports = {
f1 : function(){ ... },
...
fN : function(){ ... }
};
module2.js 看起来就是这样
module.exports = {
t1 : function(){ ... },
...
tN : function(){ ... }
};
在app.js中我使用这两个模块
var M1 = require('./module1.js');
var M2 = require('./module2.js');
现在我可以使用M1.f1()
,M2.t1()
。问题是在module2中我必须使用module1中的函数。如果我将t1定义为function(){M2.f1(); ....}它会产生一个错误,告诉我没有定义M2。
我该如何解决? (我知道我可以在module1中要求module2,但它感觉不对)
答案 0 :(得分:1)
另一个选项(除了要求module2中的module1)将把函数传递给module2:
// module2.js
module.exports = function(mod1) {
// use mod1.f1, ..., mod1.fN anywhere in here
return {
t1 : function(){ ... },
tN : function(){ ... }
};
};
// main.js
var M1 = require('./module1.js');
var M2 = require('./module2.js')(M1);
答案 1 :(得分:1)
1)M1
中需要M2
。不确定为什么你不认为它“感觉正确”,但它是一种合法的方式来处理它。
2)在您声明M1 - require('./module1.js');
后,将M1
传递给M2
,以便M2
使用它。这将使您可以访问那里的属性。你最终看起来像var M2 = require('./module2.js')(M1)
。在我看来,这开始使事情变得更复杂,而不是#1 ...
3)如果你想要两个相同的功能......那么你可能需要第三个模块。第三个模块将导出M1
和M2
将作为方法公开的函数。
如果您发现自己拥有许多与一个或另一个对象没有紧密耦合的常用函数,那么第三种方法可能是最好的方法。创建一个导出这些公共函数(文件或数据库函数是示例)的实用程序模块,以便在其他函数中重用,这是一种常见的方法。
请注意,您最终需要在原始的两个模块中使用这个第三个模块...我认为这是合理的,因为代码的组织方式使您需要一个'实用程序库',另外两个模块。