如何正确模块化一个node.js项目?

我正在创build一个类构造函数模式下的node.js项目:

function my_class(x,y){ this.x = x; this.y = y; } 

该项目的起点是main.js文件。 任何类的项目都必须能够访问在main.js上定义的全局对象(比如“world”和“socket”)。 我发现了4个选项:

  1. 我在main.js定义了我的类。 他们可以访问main.js的全局variables来closures它,但main.js会变得臃肿。

  2. 我把这个类移动到另一个文件,如my_class.jsrequire()它。 这不起作用,因为my_class的实例将失去闭包上下文,不再能够访问main.js的全局variables。

  3. 我将该类移动到另一个文件中,并手动向其构造函数注入依赖项(例如: my_class(world,socket) )。 问题是,代码变得复杂得多,怪异的语义,比如“my_instance.world”在源代码上popup,这是无稽之谈,因为“world”不是my_class属性。

  4. 我将该类移动到另一个文件中,并且使用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.jsmy_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获得更多的灵活性,因为您可以将任意对象“注入”模块。 并不是每个模块都必须使用相同的“全局”本身。