Warum muss Angular 9 sich selbst Code vorkompilieren?

8

Ich habe gerade mein Projekt auf Angular 9 aktualisiert und als erstes habe ich festgestellt, dass sich die Erstellungszeit in meinem CI erheblich erhöht hat (von 2 Minuten auf 4 Minuten).

Die CLI analysiert die Protokolle jedes Mal, wenn die Tests oder der Build ausgeführt werden, und führt eine Vorkompilierung durch. Dies liegt an der neuen Ivy-Architektur , aber nach meinem Verständnis sollte diese Kompilierung nur Code enthalten, der nicht Ivy-kompatibel ist.

Warum sehe ich Compiling @angular/common : es2015 as esm2015in meinem Build viele (hauptsächlich aus @ Angular-Paketen)? Sollte Angular Code selbst nicht mit Ivy kompatibel sein?

Hinweis: Diese auch geschieht mit einem frischen Projekt (Just mit wenigen Bibliotheken).

Update Dies geschieht mit allen Befehlen, für die ein Build erforderlich ist. Ex:

  • ng test --code-coverage=true --watch=false --browsers=ChromeHeadle
  • ng b -c=staging --aot

Update 2

Ich füge meine Builds zum Vergleich hinzu: vor Winkel 9 und nach Winkel 9-Migration (Der Build schlägt immer noch fehl, aber wir können den Komponententest als Referenz verwenden, von ~ 2 Minuten bis ~ 4 Minuten Gesamtausführung).

André Roggeri Campos
quelle
Mit welchen Befehlen / Argumenten führen Sie Ihr Projekt aus / erstellen es?
Kyler Johnson
@KylerJohnson Ich habe meine Frage aktualisiert
André Roggeri Campos
Angular wird als es2015 kompiliert. Da Ihr Build esm2015 verwendet, muss es neu kompiliert werden.
Roddy der gefrorenen Erbsen
1
@RoddyoftheFrozenPeas, aber selbst ein neues Projekt, das mit der CLI initialisiert wurde, weist dieses Verhalten auf. Ist es möglich, das Build-Ziel zu ändern, um diese Neukompilierung zu vermeiden?
André Roggeri Campos
Ich meine, ich habe angenommen, dass Sie esm2015 aus einem bestimmten Grund verwenden, aber wenn Sie es2015 in Ihrem Projekt verwenden, sollten die vorkompilierten Binärdateien verwendet werden.
Roddy der gefrorenen Erbsen

Antworten:

7

Dieser Artikel erklärt hilfreich, warum Angular 9 Abhängigkeiten mit ngcc und der Roadmap für die Ivy-Kompilierung kompiliert.

Kurz gesagt, da der Ivy-Befehlssatz nur in Angular 10 stabilisiert wird, empfiehlt das Angular-Team, noch keine für Angular 9 Ivy kompilierten Pakete zu veröffentlichen. Nach Angular 10 werden Paketbetreuer aufgefordert, Ivy-Pakete zu veröffentlichen. View Engine-Pakete werden weiterhin unterstützt, aber nicht empfohlen.

Daraus schließe ich einige Zeit nach der Veröffentlichung von Angular 10, dass je nach den von einem bestimmten Projekt verwendeten Paketen deutlich weniger ngcc-Kompilierungen stattfinden werden, in einigen Fällen keine. In Angular 9 ist der ngcc-Kompilierungsschritt ein notwendiger Kompromiss, den Sie nur schwer loswerden können.

In Bezug auf die CI-Geschwindigkeit schlagen die offiziellen Dokumente vor, dass ngcc explizit ausgeführt werden kann. Ich denke, es ist möglich, diesen Schritt in CI zwischenzuspeichern, aber da ich mir Ihres speziellen Setups nicht bewusst bin, kann ich nichts vorschlagen, was über die Forschungsrichtung hinausgeht.

Update: Angular 9.1 verspricht Verbesserungen der ngcc-Build-Geschwindigkeit.

Klaster_1
quelle
1
Ich verstehe, also folgt Angular nur der Empfehlung, keine von Ivy kompilierten Pakete bereitzustellen, oder?
André Roggeri Campos
@ AndréRoggeriCampos das ist es, was ich glaube, basierend auf Ressourcen, auf die ich verwiesen habe.
Klaster_1