Nodejs的require流程

nodejs的require流程

.

一、require简单流程

nodejs的require流程大致如下:

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); //调用原生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)

posted @ 2024-05-20 06:49  麦块程序猿  阅读(20)  评论(0编辑  收藏  举报