假设我有一个如下所示的库模块:
module.exports = {
increment: function() {
count++;
}
}
我希望在一个动态生成的脚本中使用它,该脚本看起来像这样:
(function() { lib.increment(); })();
通过在沙盒中传递它:
var sandbox = {
count: 1
lib: require('./lib')
}
var script = new vm.Script('(function() { lib.increment() })();');
script.runInNewContext(sandbox);
我遇到的明显问题是,一方面我不能要求“lib”,因为“lib.js”中未定义“count”;另一方面,如果我在“lib.js”文件的导出之前定义
var count
,则这个新的 count
变量将受到影响而不是沙盒中的变量。以下是我想要遵守的限制:
- 使用vm而不是eval()或在生成的文件上进行require()
- 在外部文件中定义“lib”
- 不修改自动生成的脚本,因此不使用
lib.increment.apply(context)
或类似方法
似乎没有办法在require调用中传递变量上下文。
exports
作为一个返回带有get/set和increment方法的对象的函数呢? - Jed Foxrequire('./lib')({ count: 1 })
,它会返回一个带有increment
函数的对象。 - Mike Cluckglobal.count++
吗? - Bergi