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从磁盘加载代码并在新的上下文中运行它。 它提供了一个沙盒特定的requirefunction,可以让你调整require工作方式。