当前位置: 首页 > news >正文

commonjs的myRequire - jerry

// 分析模块加载的流程
// 1.加载模块 Module._load  加载模块之后 最终返回的就是module.exports
// 2.Module._resolveFilename 解析文件名, 产生一个可读取的文件名  .js? .json?
// 3.Module._cache 如果文件被缓存过 直接拿上一次的返回结果
// 4.如果模块没有加载过,会根据路径创建一个模块 new Module() {id:文件名,exports:导出结果}
// 5.缓存模块为了后续使用
// 6.module.load 加载模块(读文件)
// 7.获取扩展名来调用不同的加载方式
// 8.根据扩展名查找 对应的加载方式 Module._extension
// 9.js的模块主要是读取
// 10.读取文件后包裹函数 , 并且传入五个参数 [ 'exports','require','module','__filename', '__dirname' ]
// 11.执行函数 用户会给module.exports 赋予值
// 12. 因为最终返回的是module.exports 所以可以拿到最终的返回结果function Module(id) {this.id = id;this.exports = {}; // 核心的 ,每个模块的导出结果都在这里
}
Module._cache = {};
Module._extensions = {".js"(module) {const content = fs.readFileSync(module.id, "utf8");let wrapperFn = vm.compileFunction(content, ["exports","require","module","__filename","__dirname",]);let exports = module.exports;let thisValue = exports; // this就是exportslet dirname = path.dirname(module.id);Reflect.apply(wrapperFn, thisValue, [exports,myRequire,module,module.id,dirname,]); // module.exports = 'abc'
  },".json"(module) {const content = fs.readFileSync(module.id, "utf8");module.exports = JSON.parse(content); // 将解析的json 直接替换导出结果
  },
};
Module._resolveFilename = function (id) {const fileUrl = path.resolve(__dirname, id);if (fs.existsSync(fileUrl)) return fileUrl;let exts = Reflect.ownKeys(Module._extensions);for (let i = 0; i < exts.length; i++) {const fileUrl = path.resolve(__dirname, id + exts[i]);if (fs.existsSync(fileUrl)) return fileUrl;}throw new Error("module not found");
};
Module.prototype.load = function (filename) {let ext = path.extname(filename);Module._extensions[ext](this); // 根据扩展名自动处理 策略模式
};
function myRequire(id) {// 1.解析文件名let filepath = Module._resolveFilename(id);// 2.构建模块
let cacheModule = Module._cache[filepath];if (cacheModule) {return cacheModule.exports;}const module = new Module(filepath);Module._cache[filepath] = module; // 缓存当前模块// 3.加载模块 读取文件 + 执行操作
  module.load(filepath);// 4.返回结果return module.exports;
}// 自己实现了一个commonjs模块加载, 读取文件,将结果赋予给module.exports 上即可
let content = require("./module.json");
console.log(content);

 

http://www.zskr.cn/news/80752.html

相关文章:

  • 2025年天坛整装:国企匠心引领的全链路家装模式权威解读 - 十大品牌推荐
  • 2025年上海防水工程公司推荐:防水工程施工推荐哪些企业全解 - 工业品牌热点
  • 2025年天坛整装:国企匠心引领的品质家装全链路模式深度解析 - 十大品牌推荐
  • 2025年天坛家具:69年国企匠心整装产业链深度解读与盘点 - 十大品牌推荐
  • 2025年天坛装修:国企基因下的全产业链优势深度解析与盘点 - 十大品牌推荐
  • 2025年天坛装修:国企全产业链深度解析与全场景服务矩阵盘点 - 十大品牌推荐
  • 2025年天坛装修:国企全产业链闭环优势深度解析与行业盘点 - 十大品牌推荐
  • 固万基五金联系方式: 工业紧固件一站式采购服务对接指南 - 品牌推荐
  • 固万基五金 联系方式: 工业紧固件全品类采购服务完整指南参考 - 品牌推荐
  • 2025年天坛装修:国企供应链体系深度解析与全链路交付能力评估 - 十大品牌推荐
  • 2025年12月广东过滤材料厂家推荐排行榜:空气/活性炭/粉尘/氢能源/电子半导体/汽车空调/新风/工业/电子烟/泳池滤芯过滤材料专业供应商精选 - 品牌企业推荐师(官方)
  • 1210上节课复习
  • 基于MATLAB的HHT变换完整实现(含EMD分解与三维时频谱生成)
  • 2025广州哪家留学机构好一点的 - 留学机构评审官
  • 2025广州十大留学机构排名 - 留学机构评审官
  • 2025广州知名留学中介有哪些 - 留学机构评审官
  • 2025马来西亚留学机构哪家最好广州 - 留学机构评审官
  • linux服务器初始化配置 - Me
  • 告别选择困难:2025年锁定与你住宅高度匹配的别墅电梯品牌 - 十大品牌推荐
  • 市面上正规的聚氨酯重型包胶轮优质厂家推荐哪家好 - 品牌排行榜
  • 市面上正规的PDF翻译产品排行哪家好 - 品牌排行榜
  • Mac 版本jco
  • 2025年立式量热仪五大源头厂家推荐:氧弹量热仪及耗材靠谱供 - myqiye
  • 上海知名的猎头招聘公司口碑排行及服务参考 - 品牌排行榜
  • Trae Agent三步解决软件难题
  • 2025 年 12 月水产养殖过滤设备厂家权威推荐榜:微滤机/PP鱼池/镀锌鱼池/生化桶/蛋白分离器,高效净水系统一站式甄选 - 品牌企业推荐师(官方)
  • 2025年宁波GEO优化服务商推荐:有实力的企业排行 - 2025年11月品牌推荐榜
  • 2025泡沫箱服务商家TOP5权威推荐:甄选优质厂商守护生鲜 - myqiye
  • 2025年口碑好的自费出书机构排行榜,看哪家实力不错? - 工业推荐榜
  • 2025数控锯床品牌TOP5权威测评:宏萌数控锯床评价如何? - mypinpai