2014-01-03 3 views
2

Вот функция из жасминового 2.0.0 автономного проекта:Свойство модуль не определен при использовании vm.runInThisContext

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

Я думаю, что если я буду использовать стандартный метод требует свойство модуля будет определять. Когда я загрузить этот файл, используя модуль VM следующим образом модуль глобальное свойство не определено:

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

Это ожидаемое поведение модуля ВМ или дефект?

ответ

10

Ожидаемое поведение. Ваш код оценивается в том же контексте, но не в той же области, поэтому 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) 

, но нет особого смысла делать это, потому что это в основном то, что делает require

+1

Так почему бы кто-то использовать метод runInConext, если это делает жизнь трудной? – Ikaso

+0

'runInThisContext' используется как стабильная альтернатива' eval', плюс позволяет устанавливать имя файла. Я не думаю, что это действительно полезно, но используется в ядре узла, так почему бы не разоблачить его? – vkurchatkin

+0

да, если я это сделаю, я получаю такие вещи, как «консоль» не определена. –

Смежные вопросы