nodejs的require流程
.
一、require簡單流程
nodejs的require流程大致如下:
![require流程](https://images.cnblogs.com/cnblogs_com/blogs/668717/galleries/2013323/o_240518085412_require流程探索.png)
原圖: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); //呼叫原生require
return _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)