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

时间:2013-04-26 10:04:53

标签: javascript node.js require modularity

我正在按照类构造函数模式创建一个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的全局变量来关闭它,但是main.js会变得臃肿。

  2. 我将课程移至另一个文件,例如my_class.jsrequire()。这不起作用,因为my_class的实例将丢失闭包上下文,不再能够访问main.js的全局变量。

  3. 我将类移动到另一个文件并手动将依赖项注入其构造函数(例如:my_class(world,socket))。问题是,代码变得更加复杂,并且源代码中出现了诸如“my_instance.world”之类的奇怪语义,这是无稽之谈,因为“world”不是my_class的属性。

  4. 我将该课程移至另一个文件,并使用my_class = eval(fs.readFileSync(())而不是require来要求该文件。这可以正常工作,因为my_class得到main.js的闭包上下文,并且是我正在使用的解决方案,但看起来很糟糕。

  5. 哪种模块化这种node.js项目的正确方法?

3 个答案:

答案 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_classmy_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.jsmain.js都将获得my_class.js的相同实例。