nodejs在处理模块时,根据模块之间的引用关系,会构建一个以Module实例为节点的树形结构来缓存模块相关信息,module结构如下:
// lib/module.js
function Module(id, parent) {
this.id = id;
this.exports = {};
this.parent = parent;
updateChildren(parent, this, false);
this.filename = null;
this.loaded = false;
this.children = [];
}
其中通过字段 parent,children来标识引用关系。
还有个全局缓存map保存filename与Module实例映射关系。这个map分别挂载到了require方法和Module类上,作为静态属性存在。require.cache === Module._cache
// lib/internal/module.js
function makeRequireFunction() {
// 我们调用的 require 方法
function require() {
//...
}
//...
require.cache = Module._cache;
return require;
}