node.js需要虚拟机脚本中的模块
我正在创build一个运行外部脚本的node.js的命令行界面
> myapp build "path/to/script.js"
myapp是执行作为命令行parameter passing的脚本的node.js应用程序。
为了保持简短,基本上这样做:
var vm = require("vm"); var fs = require("fs"); var code = fs.readFileSync(scriptPath, { encoding: "utf8" }); // read "path/to/script.js" var script = vm.createScript(code, scriptPath); var context = vm.createContext({ require: require }); script.runInNewContext(context);
“path / to / script.js”的内容如下所示:
var fs = require("fs"); // this works var date = require("./date.js"); // supposed to load "path/to/date.js" but fails
我的问题是require()
在外部脚本中无法正常工作。 它适用于像fs
这样的“本地”模块,但在本地文件上失败,可能是因为它不知道在哪里查找模块。
我已经考虑只使用下面的代码:
require(scriptPath);
但后来我不能注入我自己的脚本上下文。
我可以写我自己的require
函数,模拟内置的需求,但开始寻找模块在scriptPath
但似乎有点乏味…
我用沙箱模块来解决类似的问题。
var Sandbox = require('./sandboxed-module') Sandbox.require(scriptPath);
Sandbox.require
从磁盘加载代码并在新的上下文中运行它。 它提供了一个沙盒特定的require
function,可以让你调整require
工作方式。