如何正确模块化使Node.js的项目?(How to correctly modularize a

2019-10-18 02:06发布

我创建一个node.js的项目类的构造格局如下:

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

该项目的出发点是main.js文件。 任何一类项目必须能够访问全局对象(如“世界”和“插座”),其上定义main.js 。 我发现了4个选项:

  1. 我定义在我的课main.js 。 他们将有机会获得main.js的全局为是在它的关闭,但main.js会变得臃肿。

  2. 我的类移动到其他文件,如my_class.jsrequire()它。 这不起作用,因为my_class的情况下,将失去关闭背景下,不再能够访问main.js的全局。

  3. 我的类移动到另一个文件,手动注入依赖于它的构造函数(例如: my_class(world,socket) )。 问题是,代码变得更加复杂和怪异的语义,如源“my_instance.world”流行,这完全是无稽之谈,因为“世界”是不是财产my_class

  4. 我的类移动到另一个文件,并使用需要my_class = eval(fs.readFileSync(())而不是require 。这只是正常的my_class得到main.js的关闭上下文,是我使用的解决方案,但似乎哈克。

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

Answer 1:

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

通过将数据main.jsglobal对象你解决循环依赖关系:

  • 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.jsmy_class.js会得到相同的实例data.js



Answer 2:

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

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



Answer 3:

如果你想使变量可用main.js的任何地方,然后你可以指定属性的global对象。 见node.js中的全局变量? 例如。 它将只要你不超过做到这一点很好地工作。 随着新的解决方案,您将获得例如与测试多一点灵活性,因为你可以“注入”的任意对象到模块。 并不是每个模块都必须使用相同的“全球性”本身。



文章来源: How to correctly modularize a node.js project?