如何正确模块化一个node.js项目?
我正在创build一个类构造函数模式下的node.js项目:
function my_class(x,y){ this.x = x; this.y = y; }
该项目的起点是main.js
文件。 任何类的项目都必须能够访问在main.js
上定义的全局对象(比如“world”和“socket”)。 我发现了4个选项:
-
我在
main.js
定义了我的类。 他们可以访问main.js
的全局variables来closures它,但main.js
会变得臃肿。 -
我把这个类移动到另一个文件,如
my_class.js
并require()
它。 这不起作用,因为my_class的实例将失去闭包上下文,不再能够访问main.js
的全局variables。 -
我将该类移动到另一个文件中,并手动向其构造函数注入依赖项(例如:
my_class(world,socket)
)。 问题是,代码变得复杂得多,怪异的语义,比如“my_instance.world”在源代码上popup,这是无稽之谈,因为“world”不是my_class
属性。 -
我将该类移动到另一个文件中,并且使用
my_class = eval(fs.readFileSync(())
而不是require
。这很好,因为my_class获取main.js
的闭包上下文,并且是我正在使用的解决scheme,但似乎hacky。
模块化这种node.js项目的正确方法是什么?
你的问题似乎很棘手,因为你有一个循环依赖 : main.js
取决于main.js
的function, my_class
取决于my_class
的数据。
通过将main.js
的数据放入global
对象中,可以解决循环依赖问题:
-
main.js
取决于main.js
的function -
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
实例。
如果我正确理解了你的可能的解决scheme:
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中的任何位置使用variables,则可以将属性分配给global
对象。 请参阅node.js全局variables? 例如。 只要你不这样做,它就可以正常工作。 借助Neo的解决scheme,您可以通过testing获得更多的灵活性,因为您可以将任意对象“注入”模块。 并不是每个模块都必须使用相同的“全局”本身。