[英]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 - changed by other modules...
module.exports = {
staticFoo: null,
staticBar: null
};
//a.js
var state = require('./state');
exports = module.exports = fnA;
...
function fnA() {
console.log(state.staticBar);
}
//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.