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导出的属性。所以,这时候不需要继续解析