Angular 9 ist jetzt verfügbar - Ivy ist angekommen

Version 9 von Angular wurde veröffentlicht. Dies ist die Hauptversion, die die gesamte Plattform abdeckt, einschließlich des Frameworks selbst, des Winkelmaterials und der CLI. In dieser Version wechseln Anwendungen standardmäßig zum Ivy-Compiler und zur Laufzeit und bieten außerdem verbesserte Möglichkeiten zum Testen von Komponenten.

Dies ist eines der größten Angular-Updates seit 3 ​​Jahren. Das Entwicklungsteam ist begeistert von den Möglichkeiten, die es Entwicklern ermöglichen, bessere Anwendungen zu erstellen und zum Angular-Ökosystem beizutragen.

So aktualisieren Sie auf Version 9


Weitere Informationen finden Sie unter update.angular.io . Um einen reibungslosen Ablauf des Updates zu gewährleisten, wird empfohlen, zuerst auf die neueste Version von Angular 8

zu aktualisieren. Upgrade auf die neueste Version 8

ng update @angular/cli@8 @angular/core@8

ng update @angular/cli @angular/core

Informationen zu den wichtigsten Änderungen, die in diesem Update vorgenommen wurden, einschließlich der veralteten APIs, finden Sie unter Aktualisieren auf Version 9 von Angular in der Angular-Dokumentation.

Efeu


Version 9 überträgt standardmäßig alle Anwendungen an den Ivy-Compiler und die Laufzeit. Neben Hunderten von behobenen Fehlern bieten der Ivy-Compiler und die Laufzeit viele Vorteile:

  • Kleinere Bündelgrößen
  • Schnelleres Testen
  • Bestes Debugging
  • Verbesserte CSS-Klassen- und Stilbindungen
  • Verbesserte Typprüfung
  • Verbesserte Build-Fehlermeldungen
  • Verbesserte Erstellungszeit, AOT standardmäßig aktiviert
  • Verbesserung der Internationalisierung

Lassen Sie uns einige Verbesserungen im Detail betrachten

Kleinere Bündelgrößen


Der Ivy-Compiler wurde entwickelt, um Teile von Angular zu entfernen, die nicht für das Baumshaking verwendet werden, und um die Menge an Code zu reduzieren, die für Angular-Komponenten generiert wird.

Dank dieser Verbesserungen können Anwendungen erheblich verkleinert werden.

  • Kleine Anwendungen, die viele der Funktionen des Frameworks nicht nutzen, können am meisten vom Treeshaking profitieren.
  • Große Anwendungen mit vielen Komponenten können von reduzierten Werksgrößen profitieren.
  • Mittelgroße Anwendungen werden ungefähr gleich oder etwas kleiner, da sie weniger vom Baumbau profitieren und nicht viele Komponenten verwenden, um von kleineren Fabriken stark zu profitieren.

Bild

Schnelleres Testen


Die Ivy TestBed-Implementierung wurde ebenfalls aktualisiert und wird effizienter.

Zuvor hat TestBed alle Komponenten zwischen den einzelnen Testläufen neu kompiliert, unabhängig davon, ob Änderungen an den Komponenten vorgenommen wurden (z. B. durch Überschreibungen).
In Ivy kompiliert TestBed keine Komponenten neu, es sei denn, die Komponente wurde manuell überschrieben, wodurch eine Neukompilierung zwischen den meisten Tests vermieden wird.

Mit dieser Änderung bestehen die Kerntests des Frameworks ungefähr 40% schneller. Es wird erwartet, dass Benutzer eine höhere Geschwindigkeit beim Testen ihrer Anwendungen von 40-50% feststellen werden.

Verbessertes Debugging


Ivy bietet zusätzliche Tools zum Debuggen von Anwendungen. Wenn Sie die Anwendung im Entwicklungsmodus mithilfe der Ivy-Laufzeit starten, wird jetzt ein neues Objekt zum Debuggen von ng angeboten.

  • Angular , .
  • , applyChanges

Bild

Ivy verbessert auch die Stapelverfolgung, um Probleme wie ExpressionChangedAfterItHasBeenCheckederror zu debuggen. Bisher war der Stapel nicht sehr nützlich:

Bild

Mit Ivy sehen Sie weitere nützliche Informationen, mit denen Sie mit einem geänderten Ausdruck direkt zur Vorlagenanweisung wechseln können.

Bild

Wenn Sie beispielsweise im obigen Stapel auf AppComponent_Template klicken, wird im generierten Code eine bestimmte Zeile angezeigt, in der der Fehler auftritt:

Bild

Wenn Sie möchten, können Sie auch eine dieser Framework-Anweisungen aufrufen, um zu verfolgen, wie das Framework Ihre Komponenten erstellt oder aktualisiert .

Verbesserte Styling- und CSS-Klassen.


Ivy bietet Verbesserungen für die Handhabung von Stilen. Wenn eine Anwendung zuvor konkurrierende Stildefinitionen enthielt, konnten sich diese Stile gegenseitig ersetzen. Mit Ivy verschmelzen Stile vorhersehbar.

Betrachten Sie die folgenden Vorlagen- und Komponentenfragmente:

<my-component style="color:red;" [style.color]="myColor" [style]="{color: myOtherColor}" myDirective></div>

@Component({
  host: {
    style: "color:blue"
  },...
})
...

@Directive({
  host: {
    style: "color:black",
    "[style.color]": "property"
  },...
})
...

Zuvor wurde die zuletzt berechnete Bindung angewendet. Dies kann von der Zeit abhängen, zu der die Änderungen an diesen Ausdrücken vorgenommen wurden. Wenn myColor und myOtherColor nicht definiert wären, würde der statische „rote“ Stil ignoriert.

In Version 9 können Sie Ihre Stile mit einer klaren Priorität verwalten, die unabhängig von der Zeit ist. Die spezifischsten Stile haben Vorrang. Beispielsweise überschreibt eine Bindung an [style.color] die sich überschneidende Bindung [style].

Aus Gründen der Abwärtskompatibilität haben wir jedoch das Verhalten von [ngStyle] und [ngClass] wie zuvor beibehalten. Beim Aktualisieren von Fangwerten überschreiben die neuen Werte alle überlappenden Fangwerte.

Weitere Informationen zu Stilvorrangregeln finden Sie im Handbuch zur Vorlagensyntax.in der Dokumentation.

Als Nebeneffekt des Stil-Refactorings können Sie jetzt auch an CSS-Variablen (benutzerdefinierte CSS-Eigenschaften) binden.

<div [style.--main-border-color]=" '#CCC' ">
<p style="border: 1px solid var( - -main-border-color)">hi</p>
</div>

Typprüfung verbessert


Der Angular-Compiler kann mehr Anwendungstypen überprüfen und strengere Regeln anwenden. Mithilfe dieser Funktionen können Sie Fehler in frühen Entwicklungsstadien identifizieren.

Zusätzlich zu den Standardflags werden zwei Hauptflags für zusätzliche Typprüfungen unterstützt:

  • fullTemplateTypeCheck - Wenn Sie dieses Flag aktivieren, wird der Compiler angewiesen, alles in Ihrer Vorlage zu überprüfen (ngIf, ngFor, tp-template usw.).
  • strictTemplates - Wenn Sie dieses Flag aktivieren, werden die strengsten Regeln für die Typprüfung angewendet.

Weitere Informationen zur Typprüfung in Vorlagen

Buildfehler behoben


Der neue Ivy-Compiler ist nicht nur schneller und bietet eine höhere Typensicherheit, sondern erleichtert auch das Lesen von Fehlermeldungen.

In Version 8 oder der View Engine

Bild

sieht ein typischer Compilerfehler folgendermaßen aus: In Version 9 mit Ivy sieht der gleiche Fehler folgendermaßen aus:

Bild

Verbesserte Erstellungszeit, AOT-Compiler ist standardmäßig aktiviert.


Dank der Ivy-Architektur hat sich die Compilerleistung erheblich verbessert.
Gemessene Compilerleistung in Bezug auf den Overhead für eine einfache Kompilierung von TypeScript-Anwendungen. Für unser Dokumentationsprojekt (angle.io) verringerte sich der Overhead mit Ivy von 0,8x auf 0x, was einer Verbesserung von fast 40% entspricht.

Dies bedeutet, dass AOT-Builds spürbar schneller sein können. Dank dessen können Sie AOT auch im Dev-Modus verwenden. Dies bedeutet, dass "ng serve" jetzt die gleichen Vorteile wie Release-Builds hat und das Entwicklungserlebnis für Angular verbessert.

Dank Änderungen im Compiler und in der Laufzeit werden entryComponents auch nicht mehr benötigt. Diese Komponenten werden bei ihrer Verwendung automatisch erkannt und kompiliert.

Verstärkte Internationalisierung (i18n)


Die Internationalisierung war eine Funktion von Angular, mit der Sie eine Anwendung einmal für ein Gebietsschema erstellen und hochoptimierte und lokalisierte Anwendungen erhalten konnten. Version 9.0 beschleunigte den Prozess, indem die i18n-Lookups später im Erstellungsprozess verschoben wurden. Diese Änderung machte es 10-mal schneller.

Mehr zum neuen i18n :eckig/ localize und die neue angle.json.

Zuverlässigeres ng Update


Der Betrieb von ng update wurde geändert, um es zuverlässiger und informativer zu machen.

  • Verwenden Sie immer die neueste Version der CLI. Ab 8.3.19 CLI verwenden wir jetzt die CLI aus der Zielversion des Updates. In Zukunft werden Updates immer von der letzten CLI verarbeitet.
  • Besserer Update-Fortschritt. Das ng-Update bietet jetzt weitere Informationen darüber, was unter der Haube passiert. Für jede Migration werden Informationen dazu angezeigt.
  • Einfacheres Debuggen von Updates. Standardmäßig startet ng update alle Migrationen und überlässt die kumulierten Änderungen der Festplatte zur Überprüfung. Das Upgrade auf Version 9 führt auch ein neues Flag ein --create-commits. Wenn Sie ng update --create-commits ausführen, erfasst das Tool nach jeder Migration den Status Ihrer Codebasis, sodass Sie Schritt für Schritt Änderungen vornehmen und debuggen können, die in Ihrem Code veröffentlicht werden.

Neue Funktionen "zur Verfügung gestellt"


Wenn Sie den @ Injectable-Dienst in Angular erstellen, müssen Sie auswählen, wo er dem Injektor hinzugefügt werden soll. Zusätzlich zu den vorherigen Optionen "root" und "module" wurden zwei zusätzliche Optionen angezeigt.

  • Plattform - bereitgestelltIn: Die Anzeige 'Plattform' stellt den Dienst in einem speziellen Singleton-Plattforminjektor zur Verfügung, der von allen Anwendungen auf der Seite gemeinsam genutzt wird.
  • any - bietet eine eindeutige Instanz für jedes Modul (einschließlich Lazy-Modulen).

Mehr über zur Verfügung gestelltIn

Komponentenbindung


Das Testen von Komponenten stützte sich in der Vergangenheit auf die Verwendung von Implementierungsdetails wie CSS-Selektoren, um Komponenten zu finden und Ereignisse auszulösen. Dies bedeutete, dass bei jeder Änderung der Komponentenbibliothek alle auf diesen Komponenten basierenden Tests aktualisiert werden mussten.

In Version 9 wurden Komponentenbindungen eingeführt, die eine alternative Möglichkeit zum Testen bieten. Wenn Sie von Implementierungsdetails abstrahieren, können Sie sicher sein, dass Ihre Tests korrekt definiert und weniger fragil sind.

Die meisten Komponenten von Angular Material können jetzt mit diesen Bindungen getestet werden und stehen auch jeder Autorenkomponente in der Komposition (CDK) zur Verfügung.

Hier ist ein Testbeispiel vor:


it("should switch to bug report template", async () => {
  expect(fixture.debugElement.query("bug-report-form")).toBeNull();
  const selectTrigger = fixture.debugElement.query(
    By.css(".mat-select-trigger")
  );
  selectTrigger.triggerEventHandler("click", {});
  fixture.detectChanges();
  await fixture.whenStable();
  const options = document.querySelectorAll(".mat-select-panel mat-option");
  options[1].click(); // Click the second option, "Bug".
  fixture.detectChanges();
  await fixture.whenStable();
  expect(fixture.debugElement.query("bug-report-form")).not.toBeNull();
});

Und das Gleiche jetzt:


it("should switch to bug report template", async () => {
  expect(fixture.debugElement.query("bug-report-form")).toBeNull();
  const select = await loader.getHarness(MatSelect);
  await select.clickOptions({ text: "Bug" });
  expect(fixture.debugElement.query("bug-report-form")).not.toBeNull();
});

Neue Komponenten


Jetzt können Sie Funktionen von YouTube und Google Maps in Ihre Anwendungen integrieren.

  • Sie können den YouTube-Player mit dem neuen YouTube-Player in Ihre Anwendung einbetten.
  • Wir führen auch Google-Maps-Komponenten ein. Mit diesen Komponenten können Sie Google Maps einfach visualisieren, Markierungen anzeigen und Interaktivität verbinden, sodass es wie eine normale Winkelkomponente funktioniert, sodass Sie die Google Maps-API nicht mehr erlernen müssen.

Verbesserung des IDE- und Sprachdienstes


Die Erweiterung des Angular-Sprachdienstes auf der Visual Studio Marketplace-Plattform wurde erheblich verbessert. Neben größeren architektonischen Reparaturen zur Lösung von Leistungs- und Stabilitätsproblemen wurden viele langjährige Fehler behoben.

  • Mit der TextMate-Grammatik für die Vorlagensyntax können Sie jetzt die Syntax sowohl in eingebetteten als auch in externen Vorlagen hervorheben
  • Gehen Sie zu Definition für templateUrl und styleUrls
  • Geben Sie Informationen und NgModule-Informationen in den Tooltip ein

TypeScript 3.7-Unterstützung


Angular wurde für TypeScript 3.6 und 3.7 aktualisiert, einschließlich der äußerst beliebten optionalen Bindungsfunktion in TypeScript 3.7. Um für das Ökosystem relevant zu bleiben, haben wir auch Versionen anderer Abhängigkeiten wie zone.JS und RxJS aktualisiert.

Source: https://habr.com/ru/post/undefined/


All Articles