使用vm.runInThisContext时,模块属性未定义

Ika*_*aso 3 node.js jasmine jasmine-node

这是jasmine 2.0.0独立项目的一个函数:

function getJasmineRequireObj() {
    if (typeof module !== "undefined" && module.exports) {
        return exports;
    } else {
        window.jasmineRequire = window.jasmineRequire || {};
        return window.jasmineRequire;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想如果我使用标准的require方法,将定义module属性.当我使用VM模块加载此文件时,如下所示模块全局属性是未定义的:

var fs = require('fs');
var vm = require('vm');
var jasmineFile = fs.readFileSync(__dirname + '/jasmine.js');
vm.runInThisContext(src, jasmineFile);
Run Code Online (Sandbox Code Playgroud)

这是VM模块的预期行为还是缺陷?

vku*_*kin 13

这是预期的行为.您的代码在相同的上下文中进行评估,但不在相同的范围内,因此module,exports以及未定义的内容.你可以这样做:

var m = require('module')
var src = 'module.exports = 42'
var res = require('vm').runInThisContext(m.wrap(src))(exports, require, module, __filename, __dirname)
console.log(module.exports)
Run Code Online (Sandbox Code Playgroud)

但这样做没有多大意义,因为它基本上是require做什么的

  • 那么为什么有人会使用runInConext方法,如果它让生活变得困难? (2认同)