运行 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);
我在很多模块中看到这段代码:
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);