我正在按照类构造函数模式创建一个node.js项目:
function my_class(x,y){
this.x = x;
this.y = y;
}
项目的起点是main.js
文件。项目的任何类都必须能够访问main.js
上定义的全局对象(例如“world”和“socket”)。我找到了4个选项:
我在main.js
中定义了我的类。他们可以访问main.js
的全局变量来关闭它,但是main.js
会变得臃肿。
我将课程移至另一个文件,例如my_class.js
和require()
。这不起作用,因为my_class的实例将丢失闭包上下文,不再能够访问main.js
的全局变量。
我将类移动到另一个文件并手动将依赖项注入其构造函数(例如:my_class(world,socket)
)。问题是,代码变得更加复杂,并且源代码中出现了诸如“my_instance.world”之类的奇怪语义,这是无稽之谈,因为“world”不是my_class
的属性。
我将该课程移至另一个文件,并使用my_class = eval(fs.readFileSync(())
而不是require
来要求该文件。这可以正常工作,因为my_class得到main.js
的闭包上下文,并且是我正在使用的解决方案,但看起来很糟糕。
哪种模块化这种node.js项目的正确方法?
答案 0 :(得分:3)
如果我理解正确的解决方案:
main.js:
(function(){
var global = "test"; // this you wanna have as a closure
var my_class = require('./my_class')(global);
my_class.go();
})();
my_class.js:
module.exports = function(global){
return {
go: function(){
console.log(global);
}
};
};
所以它类似于你的3.选项
答案 1 :(得分:1)
如果要在main.js中的变量可用,那么可以为global
对象分配属性。请参见node.js全局变量?例如。只要你不做它就可以正常工作。使用Neo的解决方案,您可以获得更多的灵活性,例如测试,因为您可以将任意对象“注入”到模块中。并非每个模块本身都必须使用相同的“全局”。
答案 2 :(得分:1)
你的问题似乎很棘手,因为你有循环依赖:main.js
取决于my_class
和my_class
的功能取决于{{1}的数据}}
将main.js
的数据放入main.js
对象中,解决循环依赖关系:
global
取决于main.js
my_class.js
取决于main.js
对象global
取决于my_class.js
对象现在,为了摆脱将数据放入global
对象,实现第三个模块让我们说global
。然后你需要这样的来源:
data.js
需要main.js
data.js
需要main.js
my_class.js
需要my_class.js
由于node.js中的模块是单例,data.js
和main.js
都将获得my_class.js
的相同实例。