操纵“require”从“虚拟文件系统”/内存中加载文件

问题描述

我正在尝试实现一个插件系统。 插件是包含文件文件夹的压缩 gzip tarball。 tar 文件提取并存储在内存中。 (文件永远不会写入文件系统)

现在有了内存中文件的所有内容,我加载/编译入口文件内容。为此,我找到了这个解决方案 (https://stackoverflow.com/a/17585470/5781499):

const Module = require("module");

//var Module = module.constructor;
const m = new Module();

m.paths = Module._nodeModulePaths("/tmp/virtal-file/folder/")
m._compile("console.log('Hello from Plugin entry file',__filename);","/tmp/virtal-file/folder/index.js");

现在我需要一个解决方案,require() 还可以从内存中加载其他文件。 (为了能够要求插件提供的其他js文件

我想出了一个这样的解决方案:

const path = require("path");

function isLocal(moduleId) {
    return /^[\/\.]/.test(moduleId);
}

function isNative(moduleId) {
    return process.binding("natives").hasOwnProperty(moduleId);
}

function isThirdParty(moduleId) {
    return !isLocal(moduleId) && !isNative(moduleId);
}

    const Module = require("module");
    const _require = Module.prototype.require;

    // root/index.js module
    const m = new Module();

    // intercept require
    // to resolve virtual files
    // https://stackoverflow.com/a/56203843/5781499
    Module.prototype.require = (id) => {
        try {
            // if (filelist.has(path.resolve(dirname,id))) {
            if (filelist.has(path.resolve(dirname,id)) && isLocal(id)) {

                console.log("Load virtual file '%s'",id);

                // request module is plugin/localy
                let mod = new Module();

                // resolve absolute paths
                id = path.resolve(dirname,id);

                mod.paths = Module._nodeModulePaths(id);
                mod._compile(filelist.get(id),id);

                return mod.exports;

            } else if (isNative(id)) {

                console.log("Load native module '%s'",id);

                return _require(id);

            } else if (isThirdParty(id)) {

                console.log("load third party '%s'",id);

                return _require(require.resolve(id));

            } else {

                console.log("Load file '%s'",id);

                return _require(path.resolve(dirname,id));

            }
        } catch (err) {

            console.log("Could not load module '%s'",id,err);

        }
    };

但这似乎是路径/解析机制的一个大问题。

是否有更好的解决方案从内存中加载文件

感谢任何帮助。 提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)