Angular 18, veröffentlicht am 22. Mai 2024, führte einen experimentellen Game-Changer ein: zonenlose Angular-Anwendungen. Dadurch wird die Abhängigkeit von Zone.js eliminiert, die Leistung gesteigert, der Overhead reduziert und das Debuggen vereinfacht. Schauen wir uns die zonenlosen Anwendungen, ihre Vorteile und das Experimentieren mit dieser Funktion genauer an.
Änderungserkennung hält das DOM mit den Komponentendaten synchronisiert. Bisher verließ sich Angular auf Zone.js. Die Änderungserkennung wird auf folgende Weise ausgelöst:
setTimeout
, setInterval
, versprochene Auflösungen.ApplicationRef.tick()
, ChangeDetectorRef.detectChanges()
.Zone.js hat die Browser-APIs gepatcht und Angular benachrichtigt, um die Änderungserkennung einzuleiten. Dies war zwar effektiv, verursachte jedoch zusätzlichen Aufwand und verursachte manchmal ExpressionChangedAfterItHasBeenCheckedError
.
Vor der zonenlosen Änderungserkennung verwaltete Zone.js UI-Updates. Dieses StackBlitz-Beispiel veranschaulicht:
ChangeDetectionStrategy.OnPush
wird die Ansicht jedoch durch direkte Array-Mutationen möglicherweise nicht aktualisiert, es sei denn, die Referenzänderungen oder die Änderungserkennung werden manuell ausgelöst.AsyncPipe
vereinfacht die beobachtbare Handhabung, automatisches Abonnieren und Auslösen der Änderungserkennung.Diese Beispiele verdeutlichen die Rolle von Zone.js bei der Änderungserkennung und bereiten die Grundlage für die verbesserte zonenlose Architektur von Angular.
Das Entfernen von Zone.js bietet erhebliche Vorteile:
ExpressionChangedAfterItHasBeenCheckedError
Probleme und zonenbezogene Komplexitäten.Der Wechsel zu zonenlos erfordert Konfigurationsänderungen:
app.config.ts
Folgendes hinzu:<code class="language-typescript">providers: [ provideExperimentalZonelessChangeDetection() ]</code>
Entfernen Sie provideZoneChangeDetection()
, falls vorhanden.
import '*zone.js';
aus Ihren Bewerbungsdateien.angular.json
zone.js
aus dem polyfills
-Array:<code class="language-json">"polyfills": []</code>
<code class="language-bash">npm uninstall zone.js</code>
Dieses Beispiel zeigt die Änderungserkennung ohne Zone.js:
Lassen Sie uns jedes Szenario analysieren:
Funktioniert wie erwartet.
Erfordert this.changeDetectorRef.markForCheck();
oder die Verwendung von Signalen:
Korrigierte Version (mit markForCheck
):
Korrigierte Version (mit Signalen):
Die Ansicht wird nicht automatisch aktualisiert:
Korrigierte Version (mit markForCheck
):
Die Verwendung von async
Pipe wird bevorzugt.
Einfach; Verwenden Sie die Pipe async
:
Verwenden Sie toSignal()
, um Observablen in Signale umzuwandeln:
Zusammenfassung:
markForCheck()
oder Signale.async
-Pipe.Angular 19 hat die zonenlose Anwendungsunterstützung weiter verfeinert, APIs verbessert, serverseitige Rendering-Unterstützung hinzugefügt und Tests verbessert. Die Angular-CLI unterstützt jetzt das Erstellen zonenloser Projekte:
<code class="language-typescript">providers: [ provideExperimentalZonelessChangeDetection() ]</code>
Das obige ist der detaillierte Inhalt vonZoneless in Angular nutzen: Eine neue Ära der Änderungserkennung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!