Search code examples
node.jsnode-modulesstrict-mode

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


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?


Solution

  • 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);