0

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

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 脚本?我应该以不同的方式声明上下文吗?

4

1 回答 1

0

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

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

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

然后执行iifeCode而不是code

var script = new vm.Script(iifeCode);
于 2017-04-10T21:57:31.073 回答