Wie schreibe ich ein Modul, das mit Node.js, RequireJS sowie ohne sie arbeitet

8

Ich arbeite an einer JavaScript-Bibliothek für JSON / XML-Verarbeitung . Meine Bibliothek funktioniert sowohl im Browser als auch in Node.js (mit den Modulen xmldom und xmlhttprequest ).

Einer der Benutzer hat kürzlich nach RequireJS-Unterstützung gefragt. Ich habe mir die RequireJS / AMD-Sache angeschaut und denke, dass dies ein guter Ansatz ist, deshalb möchte ich dies bereitstellen.

Allerdings möchte ich die Portabilität beibehalten: Meine Bibliothek muss in Browsern (mit und ohne RequireJS) sowie Node.js funktionieren. Und in der Browserumgebung bin ich nicht von xmldom oder xmlhttprequest abhängig, da diese Dinge vom Browser selbst bereitgestellt werden.

Meine Frage ist: Wie kann ich meine Bibliothek so implementieren, dass sie sowohl in Browsern als auch in Node.js mit einem ohne RequireJS funktioniert?

Ein bisschen Geschichte und meine aktuelle Lösung

Ich habe meine Bibliothek ursprünglich für Browser geschrieben. Es wurde also ein globales Objekt erstellt und alles darin eingefügt:

%Vor%

Später haben Benutzer nach Node.js-Unterstützung gefragt. Also fügte ich hinzu:

%Vor%

Ich musste auch einige der oben genannten Module importieren. Ich habe es bedingt gemacht, je nachdem, ob die Funktion require verfügbar ist oder nicht:

%Vor%

Jetzt gibt es diese Geschichte mit RequireJS. Wenn RequireJS vorhanden ist, ist auch die Funktion require vorhanden. Aber das Laden von Modulen funktioniert anders, ich muss die Funktion define verwenden usw. Ich kann auch nicht nur require sachen, da require in RequireJS eine asynchrone API hat. Außerdem, wenn meine Bibliothek über RequireJS geladen wird, scheint es, den Quellcode zu verarbeiten und require('something') zu erkennen, selbst wenn ich es bedingt mache wie

%Vor%

RequireJS erkennt weiterhin require('xmlhttprequest') versucht die entsprechende JS-Datei zu laden.

Momentan komme ich zu der folgenden Lösung.

%Vor%

Und so prüfe ich jetzt nach Abhängigkeiten:

%Vor%

Wenn ich require aber nicht define habe, dann nehme ich an, dass dies eine Node.js-Umgebung ist. Ich verwende amdefine , um das Modul zu definieren und die erforderlichen Abhängigkeiten zu übergeben.

Wenn ich require und define habe, nehme ich an, dass dies eine RequireJS-Umgebung ist, also verwende ich einfach die Funktion define . Momentan gehe ich auch davon aus, dass es sich um eine Browserumgebung handelt, Abhängigkeiten wie xmldom und xmlhttprequest sind nicht verfügbar und benötigen sie nicht. (Dies ist wahrscheinlich noch richtig.)

Wenn ich die Funktion require nicht habe, nehme ich an, dass dies eine Browser-Umgebung ohne RequireJS / AMD-Unterstützung ist, also rufe ich die Modul-Factory _jsonix direkt auf und exportiere das Ergebnis als globales Objekt.

Also, das ist mein Ansatz bisher. Scheint mir ein bisschen peinlich, und als Neuling zu RequireJS / AMD suche ich Rat. Ist es der richtige Ansatz? Gibt es bessere Möglichkeiten, das Problem anzugehen? Ich wäre dankbar für deine Hilfe.

    
lexicore 12.08.2014, 22:10
quelle

3 Antworten

8

Sehen Sie sich an, wie underscore.js damit umgehen kann.

%Vor%

...

%Vor%     
Timothy Strimple 12.08.2014, 23:21
quelle
4

Das ist, womit ich endete:

%Vor%     
lexicore 17.08.2014 18:34
quelle
-2

Hier ist eine Vorlage, die ich gerade benutze, sie ist sowohl AMD als auch knotenkompatibel, aber nicht direkt ladbar im Browser ...

Der Hauptvorteil dieses Ansatzes besteht darin, dass der domänenspezifische Code im Allgemeinen nicht darauf achten muss, was ihn importiert hat.

%Vor%     
Alex Naanou 20.08.2016 19:17
quelle