2015-03-05 3 views
14

Я тестирую группу компонентов React JSX. Все они должны быть переделаны с помощью React или Babel или что-то еще, но у нас есть особые потребности в требованиях на stubbing, поэтому я пытаюсь переопределить требования со специальным компилятором, который запускается с Mocha. Решение ниже работает хорошо, но вы заметите, что мы используем require.extensions [] для захвата всех файлов .jsx. Меня беспокоит, что require.extensions заблокировано и устарело. Есть ли лучший способ сделать это?Лучший способ require.extensions с Node.js

// Install the compiler. 
require.extensions['.jsx'] = function(module, filename) { 
    return module._compile(transform(filename), filename); 
}; 

Вот вся transpiler для справки:

// Based on https://github.com/Khan/react-components/blob/master/test/compiler.js 
var fs = require('fs'), 
    ReactTools = require('react-tools'); 

// A module that exports a single, stubbed-out React Component. 
var reactStub = 'module.exports = require("react").createClass({render:function(){return null;}});'; 

// Should this file be stubbed out for testing? 
function shouldStub(filename) { 
    if (!global.reactModulesToStub) return false; 

    // Check if the file name ends with any stub path. 
    var stubs = global.reactModulesToStub; 

    for (var i = 0; i < stubs.length; i++) { 
     if (filename.substr(-stubs[i].length) == stubs[i]) { 
      console.log('should stub', filename); 
      return true; 
     } 
    } 
    return false; 
} 

// Transform a file via JSX/Harmony or stubbing. 
function transform(filename) { 
    if (shouldStub(filename)) { 
     delete require.cache[filename]; 
     return reactStub; 
    } else { 
     var content = fs.readFileSync(filename, 'utf8'); 
     return ReactTools.transform(content, {harmony: true}); 
    } 
} 

// Install the compiler. 
require.extensions['.jsx'] = function(module, filename) { 
    return module._compile(transform(filename), filename); 
}; 

И некоторые ссылки simalar решения ...

Решения может быть раздвоенным здесь: https://github.com/danvk/mocha-react

+1

В продолжение нашей дискуссии о github см. Эту тему относительно этой точной проблемы. Https://groups.google.com/forum/#!searchin/nodejs/require.extensions/nodejs/QsOEWvptQpA/G6xYTm52N60J. Я понимаю, что нет другой альтернативы, если вы хотите загрузить переданные js прямо в линию, как вы уже выше. Надеюсь, я буду исправлен хотя :) –

+0

Из документов: «Поскольку система модулей заблокирована, эта функция, вероятно, никогда не исчезнет». Кроме того, вышеуказанная ссылка на документацию больше не действительна. Вы можете заменить его https://nodejs.org/api/modules.html#modules_require_extensions. –

ответ

0

Я использую node-hook незавершенный все .scss вызовов в моих тестах.

Вы увидите из документов, что, когда требуется соответствующий файл, он будет исполнять содержащую строку вместо этого и действительно достаточно мощный, так как он также передает вам исходный источник.

Надеюсь, это то, что вы ищете.

0

Нет другого способа сделать это, и так все передают (babel и т. Д.). @ Ответ uni_nake - использование узла-крючка - в порядке, в котором он скрывает это от вас, но он по существу использует тот же механизм: просмотр в его коде показывает, что он использует Module._extensions, но это то же самое, что и require.extensions , как показал тест, я написал: https://github.com/giltayar/playing/blob/1f04f6ddc1a0028974b403b4d1974afa872edba4/javascript/node/test/is-module-extensions-same-as-require-extensions.test.js

Итак, окончательный ответ - я бы предположил, что никто в Узде не сломает Вавилон, и если они это сделают, они, вероятно, дадут другое решение для той же проблемы. Я бы без колебаний использовал его!

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