nodejs在处理模块时,根据模块之间的引用关系,会构建一个以Module实例为节点的树形结构来缓存模块相关信息,module结构如下:

  1. // lib/module.js
  2. function Module(id, parent) {
  3. this.id = id;
  4. this.exports = {};
  5. this.parent = parent;
  6. updateChildren(parent, this, false);
  7. this.filename = null;
  8. this.loaded = false;
  9. this.children = [];
  10. }

其中通过字段 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;
}

参考

一行 delete require.cache 引发的内存泄漏血案