1

我正在按照类构造函数模式创建一个 node.js 项目:

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

项目的起点是main.js文件。项目的任何类都必须能够访问定义在main.js. 我找到了 4 个选项:

  1. 我在里面定义我的类main.js。他们将可以访问main.js's 的全局变量以使其关闭,但main.js会变得臃肿。

  2. my_class.js我将类移动到另一个文件,例如require()它。这不起作用,因为 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了闭包上下文,并且是我正在使用的解决方案,但看起来很老套。

模块化这样的node.js项目的正确方法是什么?

4

3 回答 3

4

如果我理解正确,可能的解决方案:

主.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. 选项

于 2013-04-26T10:53:22.777 回答
1

你的问题似乎很棘手,因为你有一个循环依赖main.js依赖于的功能my_classmy_class依赖于的数据main.js

通过将数据main.js放入global对象中,您可以解决循环依赖:

  • main.js取决于的功能my_class.js
  • main.js取决于global对象中的数据
  • my_class.js取决于global对象中的数据

现在,为了摆脱将数据放入global对象中,请在 let us say 中实现第三个模块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.

于 2014-04-23T22:25:57.277 回答
1

如果你想让 main.js 中的变量在任何地方都可用,那么你可以为global对象分配属性。看到 node.js 全局变量了吗?例如。只要您不过度使用它就可以正常工作。使用 Neo 的解决方案,您可以获得更多的灵活性,例如测试,因为您可以将任意对象“注入”到模块中。并非每个模块本身都必须使用相同的“全局”。

于 2013-04-26T11:07:15.767 回答