运行 node.js 脚本在严格模式下使用 vm 时未定义导出

exports is not defined when running node.js script using vm in strict mode

我在很多模块中看到这段代码:

var app = exports = module.exports = {};

但是我在严格模式下使用 Node.js VM 执行这些模块时遇到了一些问题。

这里演示一下:

var code = `
'use strict'; // Works if I remove this line
var app = exports = module.exports;
`;

var vm = require('vm');
var vmModule = { exports: {} };
var context = vm.createContext({
  exports: vmModule.exports,
  module: vmModule
});
var script = new vm.Script(code);

script.runInContext(context);
console.log("ok");

如果我 运行 此代码,我会收到 exports is not defined 错误。 没有 use strict 上面的代码工作正常。

为什么类似的声明适用于标准 Node 模块,但不适用于 vm 脚本?我应该以不同的方式声明上下文吗?

正如@mscdex 所指出的,这可能是节点的问题。参见 github.com/nodejs/node/issues/5344

一个似乎可行的解决方法(我希望没有其他影响)是将所有代码包装在一个 iife 函数中:

const iifeCode = `(function(exports){${code}}(module.exports));`;

然后执行iifeCode而不是code:

var script = new vm.Script(iifeCode);