nodejs中循环require的解决方案

121 篇文章 1 订阅
Module._load = function(request, parent, isMain) {
  if (parent) {
    debug('Module._load REQUEST %s parent: %s', request, parent.id);
  }

  var filename = Module._resolveFilename(request, parent, isMain);
  // 返回缓存的内容
  var cachedModule = Module._cache[filename];
  if (cachedModule) {
    return cachedModule.exports;
  }

  if (NativeModule.nonInternalExists(filename)) {
    debug('load native module %s', request);
    return NativeModule.require(filename);
  }

  var module = new Module(filename, parent);

  if (isMain) {
    process.mainModule = module;
    module.id = '.';
  }
// 设置缓存
  Module._cache[filename] = module;

  tryModuleLoad(module, filename);

  return module.exports;
};

a.js

module.exports = {'name': 'a'};
var a = require('./b');
console.log(a);

b.js

module.exports = {'name': 'b'};
var b = require('./a');
console.log(b);

main.js

require('./a');
require('./b');

输出

{'name': 'a'}
{'name': 'b'}

原理:
nodejs使用_load加载文件,过程是,首先判断该文件是否在缓存里,有的话就直接返回,否则创建一个Module对象,然后去加载另一个文件,加载另一个文件的时候,就是往Module对象里注入属性。所以,以上代码执行的时候,首先判断a.js是否存在,不存在,所以需要创建一个Module对象,然后去加载a.js,在a.js中,往Module对象注入了一些属性,然后发现需要加载b.js,首先判断b.js是否存在,不存在,然后创建一个Module对象,接着去加载b.js,在加载b.js的时候,往Module对象里注入了一些属性,然后继续加载a.js,这时候a.js已经在缓存里,所以直接返回a.js导出的属性。所以,这时候不需要继续解析

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值