nodejs的require流程
.
一、require简单流程
nodejs的require流程大致如下:
原图:https://images.cnblogs.com/cnblogs_com/blogs/668717/galleries/2013323/o_240518085412_require流程探索.png
.
二、hook require的简单模板
function makeRequireFunction(_module_) {const Module = _module_.constructor;const Module_resolveFilename = Module._resolveFilename;/*** require的路径解析* @param args * @returns */Module._resolveFilename = function (...args) {let requestPath = args[0]; //请求路径let parent = args[1]; //父模块return Module_resolveFilename(...args); //调用原生路径解析};/*** require入口* @param requirePath * @returns */const myRequire = function(requirePath) {let _exports = _module_.require(requirePath); //调用原生requirereturn _exports;};/*** 自定义后缀解析* 一般情况下在这里手动读取文件,自定义解析逻辑,然后导出exports对象* @param _module_ 当前模块* @param _filepath_ 当前文件绝对路径*/Module._extensions['.bc'] = function (_module_, _filepath_) { // let myRequire = makeRequireFunction(_module_);// let _exports = myRequire("xxx") //调用自定义require// 解析完毕后的导出_module_.exports={ };};myRequire.main = process.mainModule;myRequire.extensions = Module._extensions;myRequire.cache = Module._cache;return myRequire;
}
参考:
require() 源码解读 - 阮一峰的网络日志 (ruanyifeng.com) 备用链接(https://files.cnblogs.com/files/blogs/668717/require源码解读-阮一峰的网络日志.pdf?t=1716020158&download=true)
通过字节码保护Node.js源码之原理篇 - 知乎 (zhihu.com)