Nodejs的require流程

麦块程序猿發表於2024-05-20

nodejs的require流程

.

一、require簡單流程

nodejs的require流程大致如下:

require流程

原圖:https://i.iter01.com/images/1d38b49874ebd89b2c1913e50278be8373a6dd1cbd66bda08cbb60c4cc41ad07.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)

相關文章