3 Stimmen

Der beste Weg, um JS zwischen Browser und node.js zu teilen, wenn Sie Google Closure Compiler verwenden

Ich entwickle eine vernetzte Anwendung zwischen dem Browser und einem Server mit node.js. Ich teile im Moment eine Menge Code, aber wenn ich dies tatsächlich bereitstellen möchte ich den Client nur Client-spezifischen Code zu erhalten. Meine Optionen sind im Moment:

1.) Implementieren Sie alle Browser/Node.js Unterschiede mit Vererbung. Ich habe dies an einigen Stellen ausprobiert, und am Ende habe ich eine Menge Klassen, die sehr, sehr einfache Anpassungen ihrer Eltern sind, die oft nur teilweise eine einzige Funktion spezialisieren. Das ist kein Stil, den ich sehr mag, weil es eine Menge Umwege bedeutet, wenn man versucht, herauszufinden, was eigentlich los ist.

2.) Definieren Sie eine Konstante wie IS_BROWSER auf globaler Ebene und dann überprüfen Sie es, wann immer ich Code-Pfade auf dem Browser gegen node.js ändern müssen. Dann schließen Sie kompilieren alle js mit erweiterten Optimierungen zu entfernen toten Code auf dem Browser (Einstellung IS_BROWSER = true). Gibt es irgendwelche Probleme mit diesem Ansatz vorausgesetzt, ich tun, was ich tun müssen, um erweiterte Optimierungen in Schließung Compiler gehen?

3.) ?? Ich bin offen für Vorschläge.

1voto

ellisbben Punkte 6232

Wenn Sie die erweiterte Kompilierung verwenden, sollte jeglicher ungenutzter Code entfernt werden; wenn Sie das Exportsystem des Compilers korrekt verwenden, wird jeglicher serverseitige Code, den Ihr Client-Code nicht aufruft, nicht in der kompilierten Version des Client-Codes enthalten sein.

Sie könnten Ihren gesamten Code in einen großen Blob schreiben und dann für Ihren Client eine Datei mit Inhalten wie

goog.require('my.client.app');
goog.exportSymbol('my.app.entryPoint', my.client.app.entryPoint);

wird der kompilierte Code nichts enthalten, was nicht in der Aufrufstruktur von my.client.app.entryPoint . Wenn Ihre Kompilierung nur einen Server-Einstiegspunkt exportiert, wird auch der Client-Code ausgeschlossen.

Der obige Stil ist für das Schreiben Ihres Skripts, um eine Funktion bereitzustellen, die dann von einem Inline-Skript aufgerufen wird; um das Ganze in ein einziges Skript zu verwandeln, könnten Sie etwas viel Einfacheres tun:

goog.require('my.client.app');
my.client.app.entryPoint();

Um zu überprüfen, ob Sie nicht eine Menge toten Code in Ihrer Kompilierungsausgabe erhalten, könnten Sie mit etwas wie diesem herumspielen: SkriptCover

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X