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

How to deal with mutual inclusions in Node.js?

我正在开发一个包含游戏引擎的 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.js

var _A;
exports.setA = function(ref) {
  _A = ref;
};

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

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

的参考

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

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

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