GWT reduzieren kompilierte Javascript-Größe

8

Ich habe festgestellt, dass die Größe des kompilierten JavaScript schneller wächst als ich erwartet hatte. Das Hinzufügen einiger Zeilen Java-Code zu meinem Projekt kann die Skriptgröße in mehreren KB erhöhen.

Im Moment wiegt mein kompiliertes Projekt 1 MB. Ich verwende keine externen Bibliotheken außer denen für MVP (Aktivitäten & amp; Places), Testen (JUnit) und Protokollierung.

Ich würde gerne wissen, ob es Kodierungspraktiken / Empfehlungen gibt, um das kompilierte Skript so klein wie möglich zu halten. Ich verweise nicht auf Code-Aufteilung, sondern auf Codiertechniken oder Muster, die das kompilierte JavaScript effektiv verkleinern können.

Vielen Dank

    
Javier Ferrero 23.03.2011, 21:04
quelle

2 Antworten

23

GWT verwendet eine "Pay as you go" -Designphilosophie, und da Sie keine Reflektion verwenden dürfen, kann der Compiler (auf einer Methode-für-Methode-Basis) statisch beweisen, dass ein Codeabschnitt "erreichbar" ist. und eliminiere diejenigen, die es nicht sind. Wenn Sie zum Beispiel nie die Methode remove () in ArrayList verwenden, wird dieser Code nicht in das resultierende JavaScript eingeschlossen.

Wenn Sie einige Kilobyte-Sprünge mit nur ein paar Zeilen sehen, bedeutet dies wahrscheinlich, dass Sie die Verwendung eines neuen Typs (und möglicherweise eines, der von anderen neuen Typen abhängt) eingeführt haben, den Sie noch nicht hatten verwenden. Es kann auch bedeuten, dass Sie eine Änderung vorgenommen haben, um diesen neuen Typ "over the wire" zurück an den Server zu senden. In diesem Fall musste ein GWT-Generator JavaScript zum Marshalling dieses Typs und alle neuen Typen, die über diesen Draht erreichbar sind, enthalten "hat-a" und "ist-a" Referenzen.

Also, wenn ich es wäre, würde ich damit anfangen: Wenn Sie eine 2-Zeilen-Änderung machen, die eine Erhöhung von mehreren Kilobyte macht, beginnen Sie mit den Typen und fragen, ob es ein Typ ist, den Sie vorher benutzt haben und ob Sie senden einen neuen Typ über die Leitung, und ob dieser Typ auch von anderen Typen unter der Haube abhängt.

Ein abschließender Gedanke: In Ray Ryan's Präsentation von 2009 bei Google I / O erwähnte er einen Aberglauben, den er vom GWT-Compiler-Team erhalten hatte, wo er gegen generische Typen empfahl (ich spreche hier nicht von Java Generics, aber Supertypen) als RPC Argumente & amp; Rückgabewerte. Anstatt Ihren RPC-Aufruf eine Map annehmen oder zurückgeben zu lassen, müssen Sie stattdessen stattdessen eine HashMap ausführen oder zurückgeben. Die Annahme ist, dass der GWT-Generator dann die Menge an Serialisierungscode eingrenzen kann, die er zur Kompilierungszeit erzeugen muss (weil er zum Beispiel keinen Serialisierungscode für eine TreeMap erzeugen könnte).

Ich hoffe, das hilft.

    
pohl 23.03.2011, 21:17
quelle
4

GWT erstellt verschiedene Ausgabeversionen für jeden unterstützten Browser. Wenn Sie also sagen, dass die Projektgröße 1 MB beträgt, beziehen Sie sich dann auf die kombinierte Größe dieser Projekte? (Jeder Browser lädt nur den, den er wirklich benötigt).

Ich habe versucht, mit der generierten Ausgabe zu experimentieren, wenn ich verschiedene Vererbungs- / Klassen- / Generik-Konstrukte verwende. Leider überwiegt die hinzugefügte zusätzliche Komplexität bei weitem die kleinen Verbesserungen, die erzielt wurden (wenn fx. Dumping Generika).

Ich war an einigen großen GWT-Projekten (+50.000 Zeilen) beteiligt und habe herausgefunden, dass Verschleierung von Code, gekoppelt mit der Aktivierung der Komprimierung auf dem Webserver, der einfachste und effektivste Weg ist, die Downloads zu minimieren. Wenn dadurch der Code nicht ausreichend verkleinert wird, schauen Sie in den Kompilierungsbericht von GWT, mit dem Sie arbeiten können Ermitteln Sie mögliche problematische Klassen und Orte, um Code-Splitting einzufügen.

    
Lars Tackmann 23.03.2011 21:22
quelle

Tags und Links