我需要使用vm.createScript / script.runInNewContext在节点应用程序(沙盒中)中执行节点代码/模块。主机节点应用程序在heroku上运行,因此没有本地文件系统可以说。我能够下载并运行没有外部依赖关系的代码,但是要求是能够包含其他节点模块。 (作为构建/包装步骤将是理想的)
有许多现有的解决方案(浏览器是我花费最多的时间),它们已经接近......但它们不可避免地会生成一个代码块(是的!),意味着要在浏览器中执行(嘘! )。例如,Browserify会在窗口等上生成依赖项
有没有人知道一个工具会读取一个package.json依赖项{}(或查看源代码中的所有require())并生成一个适合节点runInNewContext的单一blob?
答案 0 :(得分:1)
我不认为您正在寻找的解决方案是正确的解决方案。基本上你想要抓住一堆require('lib')
,将它们组合成一个Javascript上下文,将该上下文序列化为源代码,然后将该序列化表单传递给runInNewContext
函数以反序列化并重建为一个Javascript上下文,然后反序列化您的自定义沙盒代码,最后运行整个事情。
仅仅创建一个包含所需require('lib')
的上下文对象并将该对象直接传递到VM中会不会更有意义?基于documentation的代码:
var vm = require('vm'),
initSandbox = {
async: require('async'),
http: require('http')
},
context = vm.createContext(initSandbox);
vm.runInContext("async.forEach([0, 1, 2], function(element) { console.log(element); });", context);
现在您可以通过上下文访问所需的库,而无需经过昂贵的序列化/反序列化过程。