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:
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
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.
Sehen Sie sich an, wie underscore.js damit umgehen kann.
%Vor%...
%Vor%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%Tags und Links javascript requirejs node.js js-amd amd