如何处理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 中,因为它混淆了你的项目代码。
我也喜欢做我的需求,然后是我的导出,然后是该模块中的任何方法,通常只是一个模块中的一个方法。
我正在开发一个包含游戏引擎的 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 中,因为它混淆了你的项目代码。
我也喜欢做我的需求,然后是我的导出,然后是该模块中的任何方法,通常只是一个模块中的一个方法。