module.exports "Модуль не определен"

Таким образом, я использую RequireJS и React, пытаясь загрузить сторонний компонент, который был установлен с:

npm install react-autocomplete

Структура находится здесь: https://github.com/rackt/react-autocomplete/tree/master/lib

Теперь у меня есть файл main.js, инициированный при загрузке requireJS, который выглядит так:

require.config({
paths: {
      "react" : "react/react",
      "jsx-transformer" : "react/JSXTransformer",
      "react-autocomplete" : "node_modules/react-autocomplete/lib/main"
    }
});

require(["react"], function(react) {
    console.log("React loaded OK.");
});

require(["jsx-transformer"], function(jsx) {
    console.log("JSX transformer loaded OK.");
});

require(['react-autocomplete'], function (Autocomplete) {
    console.log("React autocomplete component loaded OK.");
    var Combobox = Autocomplete.Combobox;
    var ComboboxOption = Autocomplete.Option;
    console.log("Autocomplete initiated OK");
 });

Теперь все загружается нормально, но третий требует, чтобы оператор выдавал "модуль не определен", для файла main.js в стороннем компоненте, который выглядит следующим образом:

module.exports = {
  Combobox: require('./combobox'),
  Option: require('./option')
};

Я читал о том, что это связано с тем, что я пытаюсь использовать модуль стиля CommonJS, но я не могу понять, как его исправить самостоятельно, поскольку я новичок в этом.

У кого-нибудь есть ясный пример того, как я мог обойти это?

Ответы

Ответ 1

RequireJS не может загружать модули CommonJS как есть. Однако есть минимальная модификация, которую вы можете сделать для их загрузки. Вы должны обернуть их в вызове define следующим образом:

define(function (require, exports, module) {

  module.exports = {
    Combobox: require('./combobox'),
    Option: require('./option')
  };

});

Если у вас есть куча модулей, которые вам нужно преобразовать, или если вы используете стороннюю библиотеку, написанную в шаблоне CommonJS, и хотите преобразовать ее как часть процесса сборки, вы можете использовать r.js для выполнения преобразования для вы.

Ответ 2

Проблема в том, что requireJS не поддерживает модули CommonJS только AMD. Так что если сторонняя библиотека не поддерживает AMD, вам придется перепрыгнуть через несколько обручей, чтобы заставить ее работать.

Если у вас есть возможность, я бы предложил использовать browserify или Webpack для загрузки модуля, так как это те инструменты, которые выбрали большинство среагировать сообщества и практически все третьи стороны реагируют компоненты размещаются на НОМ, модулях CommonJS.