我已经尝试了很多建议,我发现谷歌搜索节点和requirejs中的循环依赖。不幸的是,我没有让它发挥作用。关于解决方案(我认为)的尝试如下:
// run.js
var requirejs = require('requirejs');
requirejs.config({
baseUrl: __dirname,
nodeRequire: require
});
requirejs(['A'], function(A) {
var a = new A.Go();
console.log(a.toon())
});
// A.js
define(['B', 'exports'], function(B, exports) {
exports.Go = function() {
var b = new require('B').Ho();
var toon = function() {
return 'me tarzan';
};
return {
b: b,
toon: toon
}
};
});
// B.js
define(['A', 'exports'], function(A, exports) {
exports.Ho = function() {
var a = new require('A').Go();
var show = function() {
return 'you jane';
}
return {
a: a,
show: show
}
};
});
在节点中运行此代码会导致RangeError:超出最大调用堆栈大小 我们从A.js中删除了B的依赖关系,“我返回了tarzan”
任何建议都表示赞赏!
答案 0 :(得分:4)
循环引用很好,不一定是糟糕设计的症状。你可能会争辩说,拥有许多微小的模块可能同样有害,因为代码/逻辑是分散的。
为避免可怕的TypeError: Object #<Object> has no method
,您需要注意初始化module.exports的方法。我确定在节点中使用requirejs时类似的情况也适用,但我没有在节点中使用requirejs。
问题是由节点具有模块的空引用引起的。通过在调用require 之前为exports 分配值,可以轻松修复它。
function ModuleA() {
}
module.exports = ModuleA; // before you call require the export is initialized
var moduleB = require('./b'); //now b.js can safely include ModuleA
ModuleA.hello = function () {
console.log('hello!');
};
此示例来自https://coderwall.com/p/myzvmg,其中提供了更多信息。