it-swarm.com.de

module.exports "Modul ist nicht definiert"

Ich verwende also RequireJS und React und versuche, eine Komponente eines Drittanbieters zu laden, die installiert wurde mit:

npm install react-autocomplete

Die Struktur ist hier: https://github.com/rackt/react-autocomplete/tree/master/lib

Jetzt habe ich eine main.js-Datei, die beim Laden von requireJS gestartet wird und folgendermaßen aussieht:

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");
 });

Jetzt wird alles in Ordnung geladen, aber die dritte Anforderung gibt für die Datei main.js in der Drittanbieter-Komponente ein "Modul ist nicht definiert" aus, das wie folgt aussieht:

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

Ich habe darüber gelesen, dass dies damit zu tun hat, dass ich ein CommonJS-ähnliches Modul benötige, aber ich kann nicht herausfinden, wie ich es selbst reparieren kann, da ich neu in diesem Bereich bin.

Hat jemand ein klares Beispiel, wie ich das umgehen könnte?

23
joakimnorberg

RequireJS kann CommonJS-Module nicht wie sie sind laden. Es gibt jedoch eine minimale Änderung, die Sie vornehmen können, um sie zu laden. Sie müssen sie in einen define -Aufruf wie folgt einschließen:

define(function (require, exports, module) {

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

});

Wenn Sie eine Reihe von Modulen konvertieren müssen oder wenn Sie eine im CommonJS-Muster geschriebene Bibliothek eines Drittanbieters verwenden und diese im Rahmen eines Erstellungsprozesses konvertieren möchten, können Sie r.js um die Konvertierung für Sie durchzuführen.

28
Louis

Das Problem ist, dass requireJS keine CommonJS-Module nur AMD unterstützt. Wenn die Bibliothek von Drittanbietern AMD nicht unterstützt, müssen Sie durch einige Rahmen springen, damit es funktioniert.

Wenn Sie die Option haben, würde ich vorschlagen, browserify oder webpack für das Laden von Modulen zu verwenden, da dies die Tools sind, die die Mehrheit der reaktiven Community ausgewählt hat und praktisch alle Drittanbieter reagieren Komponenten werden auf npm als CommonJS-Module veröffentlicht.

6
Brandon Pugh