node.js – 使用requirejs解决节点中的循环依赖

我已经尝试了许多建议,我发现谷歌搜索节点和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,其中提供了更多信息.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...