当前位置: 首页 > 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.jsqmd.com/news/70195/

相关文章:

  • 2025年企业财务管理/组织架构/信息化管理咨询公司推荐,专 - 工业推荐榜
  • 2025年企业财务管理/组织架构/信息化管理咨询公司推荐,专 - 工业推荐榜
  • 2025年天坛整装:国企匠心引领的全链路家装模式权威解读 - 十大品牌推荐
  • 第十二篇:云原生存储及存储进阶
  • 2025年重庆轨道交通大专院校排行榜,专业学校推荐新测评 - mypinpai
  • 2025年天坛整装:国企背景下的全链路家装服务体系权威解读 - 十大品牌推荐
  • 2025年酱菜瓶批发厂家推荐榜单:调料瓶‌/罐头瓶‌/蜂蜜瓶源头厂家精选 - 品牌推荐官
  • 2025年上海防水工程公司推荐:防水工程施工推荐哪些企业全解 - 工业品牌热点
  • 2025年方形工件抓取方案推荐:柔性夹爪如何破解工业自动化难题 - 品牌2025
  • 2025年天坛整装:国企匠心引领的品质家装全链路模式深度解析 - 十大品牌推荐
  • 2025年天坛家具:69年国企匠心整装产业链深度解读与盘点 - 十大品牌推荐
  • 2025年天坛家具:国企背景下的家装业务全链路布局与品牌架构深度解析 - 十大品牌推荐
  • 2025 年 12 月精密磨床厂家权威推荐榜:东莞超精密/广东高精密/进口/无心/立式等十大品类,匠心精工与稳定效能深度解析 - 品牌企业推荐师(官方)
  • 2025年天坛装修:国企基因下的全产业链优势深度解析与盘点 - 十大品牌推荐
  • 2025年天坛家具:国企家装生态布局深度解析与全国服务网络盘点 - 十大品牌推荐
  • 2025年天坛装饰:国企基因深度解析与全链资质权威盘点 - 十大品牌推荐
  • 2025年12月东莞曙光磨床厂家权威推荐榜:平面/成型/手摇/精密/定制/圆台磨床,SGM与PMM系列工业精工之选 - 品牌企业推荐师(官方)
  • 2025年天坛装修:国企全产业链深度解析与全场景服务矩阵盘点 - 十大品牌推荐
  • 2025年天坛装修:国企全产业链闭环优势深度解析与行业盘点 - 十大品牌推荐
  • 2025年天坛装饰:国企基因赋能全产业链的系统性优势分析 - 十大品牌推荐
  • 固万基五金联系方式: 工业紧固件一站式采购服务对接指南 - 品牌推荐
  • 固万基五金 联系方式: 工业品采购对接流程及供应商核实要点 - 品牌推荐
  • 2025年不锈钢管五大品牌排行榜,实力厂家深度解析,TP304不锈钢无缝管/316不锈钢无缝管 /不锈钢管厂家选哪家 - 品牌推荐师
  • 亲测有效!大四学长教你降AI率至5%以下,附工具推荐【2025最新攻略】 - 老米_专讲AIGC率
  • 固万基五金 联系方式: 工业紧固件全品类采购服务完整指南参考 - 品牌推荐
  • HTML5+CSS 学习示例
  • 2025年天坛装修:国企供应链体系深度解析与全链路交付能力评估 - 十大品牌推荐
  • 2025年12月广东过滤材料厂家推荐排行榜:空气/活性炭/粉尘/氢能源/电子半导体/汽车空调/新风/工业/电子烟/泳池滤芯过滤材料专业供应商精选 - 品牌企业推荐师(官方)
  • aa
  • 2025 最新成都营销策划公司 TOP5 评测!西南地区品牌咨询服务商实战案例驱动 + 系统方法论权威榜单发布,赋能企业品牌资产与业绩双增长 - 全局中转站