Just-in-Time (JiT) vs Ahead-of-Time-Kompilierung (AoT) in Angular

109

Ich bezog mich auf diese Dokumentation und stieß auf das Kompilierungskonzept. Man kann entweder JIT- oder AOT-Kompilierung verwenden. Ich fand es jedoch sehr kurz und muss die folgenden Punkte im Detail kennen:

  • Unterschiede zwischen diesen beiden Techniken
  • Empfehlung, wann was zu verwenden ist
Gaurang Patel
quelle

Antworten:

146

JIT - Kompilieren Sie TypeScript gerade rechtzeitig zur Ausführung.

  • Im Browser kompiliert.
  • Jede Datei wird separat kompiliert.
  • Sie müssen nach dem Ändern Ihres Codes und vor dem erneuten Laden der Browserseite nicht erstellen.
  • Geeignet für die lokale Entwicklung.

AOT - Kompilieren Sie TypeScript während der Erstellungsphase.

  • Wird von der Maschine selbst über die Befehlszeile (schneller) kompiliert.
  • Der gesamte Code wurde zusammen kompiliert und enthält HTML / CSS in den Skripten.
  • Der Compiler muss nicht bereitgestellt werden (halbe Winkelgröße).
  • Sicherere Originalquelle nicht bekannt gegeben.
  • Geeignet für Produktionsaufbauten.
Benyamin Shoham
quelle
2
Außerdem habe ich bei der Verwendung der Just-in-Time-Kompilierung eine sehr schlechte Leistung festgestellt, insbesondere auf älteren Android-Geräten. Außerdem ist die Renderlücke beim Laden der ersten Seite viel größer (bei älteren Android-Geräten bis zu 10 Sekunden, abhängig von der Größe Ihres Projekts).
Felix Hagspiel
29
Typoskript wird nicht rechtzeitig kompiliert, der Browser kann es nicht. In beiden Fällen wird das Typoskript während des Erstellungsprozesses kompiliert.
Robouste
2
@Robouste: Genau das verwirrt mich. Was wirklich vorzeitig und just in time kompiliert wird. (Wenn TJS sofort kompiliert wird.) Wenn ich eine Seite im Explorer anfordere, wird das Javascript heruntergeladen und im Browser ausgeführt. Muss einer der eingegebenen Js in den Browser gelangen? nein, überhaupt nicht ... Also, was wird vorzeitig und gerade rechtzeitig kompiliert .. ?? Es ist eigentlich der Winkel-Compiler, der gemeint ist. Dieser Link beantwortet alle Fragen: " angle.io/guide/aot-compiler "
Assil
2
Ich bin kein Experte, aber bei Verwendung von JIT werden Angular-Quellen an den Browser gesendet und die Anwendung wird kompiliert. Es ermöglicht Ihnen dynamische Inhalte, die zur Laufzeit kompiliert werden müssen. Mit AOT ist alles vorkompiliert, sodass der Server eine gemeinsame Javascript-Website sendet. Sie erhalten eine schnelle Ausführung und eine geringere Ladezeit.
Robouste
hervorragende Antwort, Kommentare auch hilfreich für mich.
Rakshit Shah
60

Es gibt zwar einige Antworten, aber ich möchte auch einige meiner Ergebnisse hinzufügen, da ich wirklich verwirrt war mit dem, was tatsächlich kompiliert wird, wie in allen Fällen, TS-> JSKonvertierung geschieht. Ich nehme einen Absatz aus Jeffs Blog als Referenz.

JIT

Das TS vom Entwickler geschriebene Code wird zu JSCode kompiliert . Dieser kompilierte jsCode wird nun erneut vom Browser kompiliert, sodass er htmlgemäß der Benutzeraktion dynamisch gerendert werden kann und dementsprechend zur angular Laufzeit auch Codes für (für Komponenten, Änderungserkennung, Abhängigkeitsinjektion) generiert werden.

(Der Browser-Compiler verwendet die Anweisungen und Komponenten einer Anwendung zusammen mit dem entsprechenden HTML- und CSS-Code und erstellt Komponentenfabriken, um Instanzen mit ihrer gesamten Logik zur Erstellung von Ansichten schnell auszumerzen.)

Wenn eine Angular 2-Anwendung im Browser gebootet wird, führt der JIT-Compiler viel Arbeit aus, um die Komponenten in der Anwendung zur Laufzeit zu analysieren und Code im Speicher zu generieren. Wenn die Seite aktualisiert wird, wird die gesamte geleistete Arbeit weggeworfen, und der JIT-Compiler erledigt die Arbeit erneut.

AOT

Der TSvom Entwickler geschriebene Code wird zu JSCode kompiliert , dieser js wurde bereits auch für Angular kompiliert . Dieser kompilierte js Code wird nun erneut vom Browser kompiliert, damit der htmlgerendert werden kann. Aber ist der Haken hier , dass die Funktionen von angularbereits betreut von genommen worden AOTCompiler und damit der Browser haben nicht viel zu befürchten über die Erstellung von Bauteilen, Änderungserkennung, Dependency Injection. Also haben wir :

Schnelleres Rendern

Mit AOT lädt der Browser eine vorkompilierte Version der Anwendung herunter. Der Browser lädt ausführbaren Code, damit er die Anwendung sofort rendern kann, ohne darauf warten zu müssen, dass die App zuerst kompiliert wird.

Weniger asynchrone Anforderungen

Der Compiler fügt externe HTML-Vorlagen und CSS-Stylesheets in das JavaScript der Anwendung ein und eliminiert separate Ajax-Anforderungen für diese Quelldateien.

Kleinere Angular Framework-Downloadgröße

Der Angular-Compiler muss nicht heruntergeladen werden, wenn die App bereits kompiliert ist. Der Compiler ist ungefähr die Hälfte von Angular selbst. Wenn Sie ihn weglassen, wird die Nutzlast der Anwendung drastisch reduziert.

Erkennen Sie Vorlagenfehler früher

Der AOT-Compiler erkennt und meldet Vorlagenbindungsfehler während des Erstellungsschritts, bevor Benutzer sie sehen können.

Bessere Sicherheit

AOT kompiliert HTML-Vorlagen und -Komponenten in JavaScript-Dateien, lange bevor sie dem Client bereitgestellt werden. Ohne zu lesende Vorlagen und ohne riskante clientseitige HTML- oder JavaScript-Auswertung gibt es weniger Möglichkeiten für Injection-Angriffe.


Verbleibende Unterschiede werden bereits in den Aufzählungspunkten von Benyamin, Nisar & Gaurang behandelt.

Fühlen Sie sich frei, mich zu korrigieren

Shashank Vivek
quelle
5
Vielen Dank. Nachdem ich Ihre Antwort gelesen habe, verstehe ich sie endlich und ich habe viele davon gelesen.
Mario Subotic
24

Benyamin und Nisar erwähnten hier einige gute Punkte. Ich werde es hinzufügen.

Während AOT theoretisch für Produktionszwecke eine attraktive Option als JIT darstellt, hatte ich meine Zweifel, ob AOT es wirklich wert ist!

Nun, ich habe nette Statistiken von Jeff Cross gefunden und es beweist, dass AOT die Bootstrapping-Zeit der App erheblich verkürzt. Der folgende Ausschnitt aus Jeff Cross 'Post gibt Ihnen einen schnellen Überblick darüber.

Geben Sie hier die Bildbeschreibung ein

Gaurang Patel
quelle
19

JiT (Just in Time) Zusammenstellung

Der Name selbst beschreibt die Arbeitsweise. Er kompiliert den Code gerade zum Zeitpunkt des Ladens der Seite im Browser. Der Browser lädt den Compiler herunter, erstellt den Anwendungscode und rendert ihn.

Es wird gut für die Entwicklungsumgebung sein.

AoT-Kompilierung (Ahead of Time)

Es kompiliert den gesamten Code zum Zeitpunkt der Erstellung der Anwendung. Der Browser möchte den Compiler also nicht herunterladen und den Code kompilieren. Bei dieser Methode kann der Browser die Anwendung einfach rendern, indem er nur den bereits kompilierten Code lädt.

Kann in der Produktionsumgebung verwendet werden

Wir können die JiT- und AoT-Zusammenstellung wie folgt vergleichen

Geben Sie hier die Bildbeschreibung ein

vivekkurien
quelle
1
Würde dies bedeuten, dass die JiT-Anwendung beim ersten Mal schneller geladen wird, danach jedoch die AoT-Anwendung immer schneller geladen wird?
JKL
Noch nie. JiT lädt langsamer als AoT
vivekkurien
AOT ist langsamer als JIT, da es zur Laufzeit nicht kompatibel ist. Sie müssen jit und aot Titel ändern
Mr.AF
hervorragende Antwort !! : +1 danke!
Mateen
17

JIT (Just-in-Time-Zusammenstellung)

Just-in-Time (JIT) ist eine Art von Kompilierung, die Ihre App zur Laufzeit im Browser kompiliert.

ng build
ng serve

Geben Sie hier die Bildbeschreibung ein

AOT (Ahead-of-Time-Zusammenstellung)

Ahead-of-Time (AOT) ist eine Art von Kompilierung, die Ihre App zur Erstellungszeit kompiliert.

ng build --aot
ng serve --aot

Geben Sie hier die Bildbeschreibung ein

Joby Wilson Mathews
quelle
2
Welcher Unterschied zwischen diesen beiden Figuren? braucht es kein Intro?
Mr.AF
Ahead-of-Time ist also im Grunde eher Ahead-of-Runtime.
Alireza Kahaei
@ Mr.AF hat gerade bemerkt, dass auch jetzt die Bilder gleich sind.
Tiago Martins Peres 6
14

Am Ende des Tages machen AOT (Ahead-of-Time) und JIT (Just-in-Time) die gleichen Dinge. Beide kompilieren Ihren Angular-Code, damit er in einer nativen Umgebung (auch bekannt als Browser) ausgeführt werden kann. Der Hauptunterschied besteht darin, wann die Kompilierung erfolgt. Mit AOT wird Ihr Code kompiliert, bevor die App im Browser heruntergeladen wird. Mit JIT wird Ihr Code zur Laufzeit im Browser kompiliert.

Hier ist Vergleich: Geben Sie hier die Bildbeschreibung ein

Vorteile von AOT:

  • Schnellerer Start als Parsing und Kompilierung im Browser nicht.
  • Vorlagen werden während der Entwicklung überprüft (was bedeutet, dass alle Fehler, die in der Javascript-Konsole in den laufenden Apps angezeigt werden, ansonsten in unseren Erstellungsprozess geworfen werden).
  • Kleinere Dateien als nicht verwendete Features können entfernt werden und der Compiler selbst wird nicht ausgeliefert.
pk_code
quelle
4

Es gibt tatsächlich nur einen Angular-Compiler. Der Unterschied zwischen AOT und JIT hängt vom Timing und den Werkzeugen ab. Mit AOT wird der Compiler einmal zur Erstellungszeit mit einem Satz von Bibliotheken ausgeführt. Mit JIT wird es jedes Mal für jeden Benutzer zur Laufzeit mit einem anderen Satz von Bibliotheken ausgeführt.

Anis Programmierer
quelle
2

JIT-Compiler, den wir während der Entwicklung des Winkelprojekts verwenden. Bei dieser Kompilierung (Konvertierung von TS in JS) erfolgt die Laufzeit der Anwendung. Wenn AOT beim Erstellen des Anwendungscodes für die Bereitstellung der Anwendung in der Produktion verwendet wird und dieses Mal unseren Anwendungscode mit dem Befehl ng build --prod erstellt, der einen Ordner namens webpack generiert, enthält webpack das Bündel aller Dateien (HTML) , CSS und Typoskript) im komprimierten Javascript-Format.

Die Größe des für die Produktion generierten Webpack-Ordners ist weitaus geringer als der für die Entwicklungsumgebung generierte Ordner (mit dem Befehl ... ng build), da der Compiler nicht im Webpack-Ordner enthalten ist. Dies verbessert die Leistung der Anwendung .

user13601355
quelle