我已经尝试了许多建议,我发现谷歌搜索节点和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',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”
任何建议表示赞赏!
解决方法
循环引用很好,不一定是糟糕设计的症状.您可能会争辩说,拥有许多微小的模块可能同样有害,因为代码/逻辑是分散的.
为了避免可怕的TypeError:Object#< Object>没有方法你需要注意初始化module.exports.我确定在节点中使用requirejs时类似的情况也适用,但我没有在节点中使用requirejs.
问题是由节点具有模块的空引用引起的.在调用require之前,可以通过为导出值指定值来轻松修复它.
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,其中提供了更多信息.