繁体   English   中英

如何处理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中访问,又可以在A.js中访问B.staticBar。 任何想法如何做到这一点?

谢谢

编辑:实际上我的静态变量是配置值,所以另一种解决方案是将它们分组到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等进行覆盖以进行测试,我倾向于更简单的需求结构,而不是在JS中处理DI / IoC您的项目代码。

我还喜欢先执行需求,再执行导出,然后再执行该模块中的任何方法,通常只是模块中的一个方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM