【问题标题】:How to deal with mutual inclusions in Node.js?如何处理 Node.js 中的相互包含?
【发布时间】:2015-05-04 16:23:52
【问题描述】:

我正在开发一个包含游戏引擎的 Node.js 应用程序,我的引擎中基本上有这种模式:

A.js

var B = require('./B');

var A = module.exports = function () {
    this.b = new B;

    console.log(B.staticBar)
};

A.staticFoo = 'foo';

B.js

var A = require('./A');

var B = module.exports = function () {
    console.log(A.staticFoo);
};

B.staticBar = 'bar';

所以我希望 A.staticFoo 在 B.js 和 B.staticBar 中都可以在 A.js 中访问。 知道该怎么做吗?

谢谢

编辑:实际上我的静态变量是配置值,因此另一种解决方案是将它们分组到 config.js 文件中,并在每个其他文件中都需要该文件,但我发现它更优雅直接将配置变量定义为相关类的静态成员。希望这足够清楚;)

【问题讨论】:

  • 访问B不需要var B = require('./B');吗?否则模块将被执行,但不会被导入。
  • 是的对不起我的意思是

标签: javascript node.js scope require circular-dependency


【解决方案1】:

我建议将您的静态状态分成第三个模块...通过将状态与您的模块分离,您可以独立操作。

state.js

//state.js - changed by other modules...
module.exports = {
  staticFoo: null,
  staticBar: null
};

a.js

//a.js
var state = require('./state');
exports = module.exports = fnA;
...
function fnA() {
  console.log(state.staticBar);
}

b.js

//b.js
var state = require('./state');
exports = module.exports = fnB;
...
function fnB() {
  console.log(state.staticFoo);
}

另一个例子提到了类似于依赖注入的东西...考虑到模块在 JS 中的工作方式,并且您可以覆盖以使用 proxyquire 等进行测试,我倾向于使用更简单的 requires 结构而不是在 JS 中处理 DI/IoC因为它会混淆您的项目代码。

我也喜欢做我的需求,然后是我的导出,然后是那个模块中的任何方法,通常只是一个模块中的一个方法。

【讨论】:

    【解决方案2】:

    这取决于您的代码架构。但是,使用其他人的代码当然总是不同的。

    最好的选择是将您的代码分成更小的模块。如果它们相互引用,则构建测试可能具有挑战性,尤其是在代码增长时。

    如果这不可能,您总是可以通过使用引用来消除耦合。

    B.js

    var _A;
    exports.setA = function(ref) {
      _A = ref;
    };
    
    var B = exports.B = function () {
        console.log(_A.staticFoo);
    };
    

    并使用B.setA(A) 确保B 具有使用A.staticFoo 的引用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 2010-09-28
      • 2017-08-08
      • 2014-09-08
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      相关资源
      最近更新 更多