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

时间:2014-01-03 08:55:08

标签: 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;
    }
}

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

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

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

1 个答案:

答案 0 :(得分:12)

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

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)

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