问题描述
我正在尝试实现一个插件系统。 插件是包含文件和文件夹的压缩 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 (将#修改为@)