所以我试图使用Node的VM动态加载生成对象的外部脚本。该对象是三个原型深(祖父母 - >父母 - >儿童)。
如果所有三个原型都在同一个文件中,那么一切正常。
使用 child.js 和 parent-grandparent.js ,两个文件中的一切正常。我将“module”和“require”添加到我的VM沙箱中,并提供自定义的requireShim,并看到它正确触发... child.js 正确请求 parent-grandparent.js 一切正常。
但是,使用3个单独的文件时它不起作用。 child.js 仍通过requestShim正确请求 parent.js ,但在下一级别 parent.js 忽略提供的填充程序并使用内部require()for grandparent.js 直接(由于某种原因永远找不到文件)(由于某种原因,只有当所有文件都在应用程序的根文件夹中时才有效,拒绝处理子目录)
这是我的VM代码。它运行外部脚本,并期望在结果中找到新对象。
app.js
var child = getScriptObject("./scripts/child.js")
function getScriptObject(scriptFilename)
{
var sandbox = { "module": module, "result": false,
"require":requireShim, "console":console };
var script = vm.createScript( fs.readFileSync(scriptFilename) );
script.runInNewContext(sandbox);
return sandbox.result;
}
function requireShim (x)
{
console.log("requireShim: "+x);
return require(x);
}
grandparent.js
function Grandparent() {};
module.exports = Grandparent
parent.js
console.log("Parent requiring Grandparent...");
var Grandparent = require('./scripts/grandparent.js');
function Parent() { Grandparent.call(this); };
Parent.prototype = Object.create(Grandparent.prototype);
Parent.prototype.constructor = Parent;
module.exports = Parent
child.js
console.log("Child requiring Parent...");
var Parent = require('./scripts/parent.js');
function Child() { Parent.call(this); };
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
result = new Child();
使用以下输出:
Child requiring Parent...
requireShim: ./scripts/parent.js
Parent requiring Grandparent...
module.js:322
throw err;
^
Error: Cannot find module './scripts/grandparent.js'
at Function.Module._resolveFilename (module.js:320:15)
at Function.Module._load (module.js:262:25)
at Module.require (module.js:349:17)
at require (module.js:368:17)
at Object.<anonymous> (C:\RemHaz2\zone\scripts\parent.js:2:19)
at Module._compile (module.js:444:26)
at Object.Module._extensions..js (module.js:462:10)
at Module.load (module.js:339:32)
at Function.Module._load (module.js:294:12)
at Module.require (module.js:349:17)
请注意,Child-&gt; Parent工作正常,但是Parent-&gt;祖父母忽略了垫片,并且由于某些无法解释的原因无法处理子目录。
答案 0 :(得分:1)
如果parent.js
与child.js
位于同一目录中,则:
var Parent = require('./scripts/parent.js');
应该是:
var Parent = require('../scripts/parent.js');
或者:
var Parent = require('./parent.js');
同样地:
var Grandparent = require('./scripts/grandparent.js');
"./scripts/child.js"
中的app.js
作为app.js
工作,而scripts
目录的兄弟是共享相同的父目录。