如何处理Node.js中的相互包含?

时间:2015-05-04 16:23:52

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

我正在开发一个包含游戏引擎的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.jaticFoo可以在A.js中访问,而B.staticBar可以在A.js中访问。 知道怎么做吗?

由于

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

1 个答案:

答案 0 :(得分:0)

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

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等进行测试,我倾向于更喜欢简单的需求结构而不是在JS中处理DI / IoC因为它弄乱了你的项目代码。

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