我创建一个node.js的项目类的构造格局如下:
function my_class(x,y){
this.x = x;
this.y = y;
}
该项目的出发点是main.js
文件。 任何一类项目必须能够访问全局对象(如“世界”和“插座”),其上定义main.js
。 我发现了4个选项:
我定义在我的课main.js
。 他们将有机会获得main.js
的全局为是在它的关闭,但main.js
会变得臃肿。
我的类移动到其他文件,如my_class.js
和require()
它。 这不起作用,因为my_class的情况下,将失去关闭背景下,不再能够访问main.js
的全局。
我的类移动到另一个文件,手动注入依赖于它的构造函数(例如: my_class(world,socket)
)。 问题是,代码变得更加复杂和怪异的语义,如源“my_instance.world”流行,这完全是无稽之谈,因为“世界”是不是财产my_class
。
我的类移动到另一个文件,并使用需要my_class = eval(fs.readFileSync(())
而不是require
。这只是正常的my_class得到main.js
的关闭上下文,是我使用的解决方案,但似乎哈克。
这是模块化这种node.js的项目的正确方法?
你的问题似乎棘手,因为你有一个循环依赖 : main.js
取决于功能my_class
和my_class
取决于数据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
需要data.js
由于Node.js的模块是单身都main.js
和my_class.js
会得到相同的实例data.js
。
如果我理解你正确的可能的解决方案:
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.选项
如果你想使变量可用main.js的任何地方,然后你可以指定属性的global
对象。 见node.js中的全局变量? 例如。 它将只要你不超过做到这一点很好地工作。 随着新的解决方案,您将获得例如与测试多一点灵活性,因为你可以“注入”的任意对象到模块。 并不是每个模块都必须使用相同的“全球性”本身。