Was ist der Unterschied zwischen Produktions- und Entwicklungsmodus in Angular2?

Antworten:

76

Im Entwicklungsmodus führt die Änderungserkennung unmittelbar nach dem ersten Lauf einen zweiten Lauf durch und erzeugt einen Fehler, wenn sich ein gebundener Wert zwischen dem ersten und dem zweiten Lauf geändert hat. Dies hilft beim Auffinden von Fehlern, bei denen das Überprüfen von Werten Nebenwirkungen hat oder Felder oder Funktionen bei nachfolgenden Aufrufen nicht denselben Wert zurückgeben, was die Änderungserkennung von Angular untergräbt.

Im Entwicklungsmodus führt Angular während des zweiten Änderungserkennungslaufs auch einige tiefgreifende Objektvergleiche durch, die in der Produktion nicht durchgeführt werden, um unzulässige Modelländerungen zu erkennen.

Aktualisieren:

Im Entwicklungsmodus wird auch ein Hinweis auf die Konsole gedruckt, wenn der HTML-Bereinigungsdienst Werte aus Bindungen [innerHTML]="..."oder entfernt [ngStyle]="...". Siehe auch: In RC.1 können einige Stile nicht mithilfe der Bindungssyntax hinzugefügt werden

Günter Zöchbauer
quelle
5
Wie erkenne ich, ob ich im Produktions- oder Entwicklungsmodus bin?
Ich habe gesehen, dass dies bereits gefragt wurde, aber ich habe keine Antwort gesehen. Sie müssen den Produktionsmodus explizit aktivieren und können auch eine globale Variable festlegen, wenn Sie prodMode aktivieren, der in Ihrem Code überprüft werden kann, um festzustellen, welcher Modus aktiv ist.
Günter Zöchbauer
6
Wenn Sie im Entwicklungsmodus arbeiten und die Konsole in Ihrem Browser öffnen, wird die Meldung "Angular 2 wird im Entwicklungsmodus ausgeführt. Rufen Sie enableProdeMode () auf, um den Produktionsmodus zu aktivieren." Wenn Sie sich bereits im Produktionsmodus befinden, wird hier nichts angezeigt.
c.dunlap
36

In den Dokumenten für ApplicationRef.tick () heißt es :

Führt im Entwicklungsmodus tick()auch einen zweiten Änderungserkennungszyklus (TTL = 2) durch, um sicherzustellen, dass keine weiteren Änderungen erkannt werden. Wenn während dieses zweiten Zyklus zusätzliche Änderungen erfasst werden, haben Bindungen in der App Nebenwirkungen, die nicht in einem einzigen Änderungserkennungsdurchlauf behoben werden können. In diesem Fall gibt Angular einen Fehler aus, da eine Angular-Anwendung nur einen Änderungserkennungsdurchlauf haben kann, während dessen die gesamte Änderungserkennung abgeschlossen sein muss.

Der Grund dafür, dass wir keine zusätzlichen Änderungen vornehmen können, ist, dass die Änderungserkennung im Produktionsmodus nur einmal ausgeführt wird. Dies bedeutet, dass jede Komponente im Komponentenbaum einmal untersucht wird (TTL = 1) ... von oben in der Tiefe zuerst Auftrag. Wenn beispielsweise eine Änderung der Eingabeeigenschaft einer untergeordneten Komponente eine Änderung einer anderen Eigenschaft bewirkt, die die übergeordnete Komponente in einer Ansicht / Vorlage gebunden hat, wird die Ansicht der übergeordneten Komponente nicht aktualisiert (da die Änderungserkennung die nicht erneut aufruft übergeordnete Komponente im Produktionsmodus ... aufgrund der Baumdurchquerung "One Pass"). Es wird erst aktualisiert, wenn das nächste Mal ein Ereignis eintritt und die Änderungserkennung erneut ausgeführt wird - aber das ist zu spät!

Hier ist ein Plunker , der gegen die Regel verstößt : Eine untergeordnete Komponente verfügt über eine setMethode für eine Eingabeeigenschaft, mit der eine andere Eingabeeigenschaft geändert wird . Ja, es ist ein erfundenes Beispiel, aber es ist leichter zu verstehen als das nächste:

Ein weiteres Szenario, in dem dieses Problem auftreten kann, sind Stateful Pipes. Schauen Sie sich diese Antwort an, wenn dies Ihr Problem ist.

Sie sollten Ihr Problem beschreiben (in einer anderen SO-Frage). Es sollte einen Weg geben, dies zu beheben.

Mark Rajcok
quelle