I see this code in many modules:
var app = exports = module.exports = {};
But I have some problem executing these modules using Node.js VM in strict mode.
Here a demonstration:
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");
If I run this code I receive a exports is not defined
error.
Without use strict
the above code works fine.
Why a similar declaration works on a standard Node module but not inside a vm script? Should I declare the context in a different way?
As pointed by @mscdex this is probably an issue with node. See github.com/nodejs/node/issues/5344.
A possible workaround that seems to work (I hope without other implications) is to wrap all code inside an iife function:
const iifeCode = `(function(exports){${code}}(module.exports));`;
Then execute iifeCode
instead of code
:
var script = new vm.Script(iifeCode);