Лучший способ требовать расширения с Node.js

14

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

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

Здесь весь транспилятор для справки:

// 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 solutions...

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

  • 1
    В продолжение нашей дискуссии по github, посмотрите эту ветку об этой конкретной проблеме - groups.google.com/forum/#!searchin/nodejs/require.extensions/… Насколько я понимаю, другой альтернативы нет, если вы хотите загрузить перенес JS прямо в линию, как у вас выше. Надеюсь, я исправлюсь, хотя :)
  • 0
    Из документов: «Поскольку система модулей заблокирована, эта функция, вероятно, никогда не исчезнет». Кроме того, вышеуказанная ссылка на документацию больше не действительна. Вы можете заменить его на nodejs.org/api/modules.html#modules_require_extensions .
Теги:
mocha

2 ответа

1

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

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

  • 0
    Из того, что я вижу в коде require.extensions нигде не используются. Только Module._extensions : github.com/nodejs/node/blob/master/lib/internal/modules/cjs/… . require.extensions , вероятно, является просто ссылкой, и если вы дадите ему свежий объект (вместо того, чтобы манипулировать им напрямую), он будет проигнорирован.
0

Я использую node-hook, чтобы заглушить все вызовы .scss в моих тестах.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню