nodejs require 模块化模拟

发布时间 2023-12-24 00:48:39作者: laremehpe

require伪代码:

// import fs from "fs";
var cache = {};

function require(modulePath) {
  //1.根据传入的模块路径获取绝对路径 用绝对路径作为id
  var moduleId = getModuleId(modulePath);
  //2.通过id判断缓存是否存在
  if (cache[moduleId]) {
    return cache[moduleId];
  }

  //3.代码运行辅助函数
  function _require(exports, require, module, __filename, __dirname) {
    // 执行目标代码
    // exports === this === module.exports
    // eval(fs.readFileSync(moduleId).toString())
  }

  //准备运行辅助函数
  var module = {
    exports: {},
  };
  var exports = module.exports;
  //获取模块文件的绝对路径
  var __filename = moduleId;
  //获取模块目录的绝对路径
  var __dirname = getDirName(__filename);

  //调用 获取导出的内容 (保存到module对象中)
  _require.call(exports, exports, require, module, __filename, __dirname);

  //缓存 module.exports
  cache[moduleId] = module.exports;

  //返回module.exports
  return module.exports;
}