Warum ist entryComponents im Angular 9 / ivy-Compiler nicht mehr erforderlich?

17

Kann jemand eine klare Erklärung geben, warum im IVY-Compiler die API für Eintragskomponenten nicht mehr erforderlich ist? Mit anderen Worten, was intern geändert wurde, sodass Angular plötzlich keine Heads-Ups mehr benötigt, die Sie dynamisch erstellen werden

Ariel Henryson
quelle

Antworten:

37

ViewEngine

Vor Ivy führte der ViewEngine-Compiler die gesamte Programmanalyse basierend auf NgModule-Konfigurationen und HTML-Vorlagen durch und erstellte dann Modul- und Komponentenfabriken basierend auf diesen globalen transitiven Informationen.

Dies bedeutet, dass wenn Sie eine Komponente haben, auf die Sie in der Vorlage nicht verweisen und die Sie nicht zum entryComponentsArray von NgModule hinzugefügt haben, diese Komponente nicht kompiliert wird und Sie sie nicht dynamisch rendern können, da Angular es nicht weiß Wo bekomme ich die Fabrik für diese Komponente?

Sobald Sie es hinzugefügt haben, erstellt der Compiler eine dedizierte Factory und fügt diese Factory auch der internen HashMap hinzu, damit sie aufgelöst werden kann ComponentFactoryResolver.

Efeu

Ivy stellte einen völlig neuen ngtsc-Compiler vor, dessen mentales Modell darin besteht, dass der Dekorateur der Compiler ist .

Mit anderen Worten, die Gesamtarchitektur von ngtsc besteht aus einer Reihe von TypeScript-Transformatoren : für Komponenten, Pipe, ngModule usw.

Diese Transformatoren senden statische Funktionen aus AppComponent.ɵfac, AppComponent.ɵcmpdh, dass sich transpilierter Code in derselben Datei befindet, in der sich die ursprüngliche Komponente / Pipe / ngModule befindet. Wir haben also Fabriken (der gesamte Code, der zum Instanziieren von Angular-Komponenten / Rohren / Modulen erforderlich ist) am selben Ort, auf die diese statischen Eigenschaften leicht zugreifen können.

Mit einfachen Worten, wenn in der TypeScript-Kompilierung eine Datei enthalten ist, die eine Klasse mit einem @ComponentDekorator enthält, gibt der ngtsc-Compiler die Factory für diese Klasse in derselben Datei aus.

Wie Sie sich vorstellen können, können Sie diese Komponente anhand statischer Eigenschaften leicht erkennen, wenn Sie diese Komponente in eine beliebige Datei importieren.

Siehe auch:

Yurzui
quelle
1
Was ist mit Webkomponenten / Winkelelementen? Behalte ich es bei, wenn ich meine Komponenten als benutzerdefinierte Elemente exportieren möchte? Die Dokumentation sagt immer noch, dass sie in den Eintragskomponenten
hinzugefügt werden sollen
@ user2010955 Nein. Ich denke, Sie müssen keine Elemente bei entryComponents in NgModules registrieren.
Yurzui