Machen Sie sich bereit: Angular 8 ist nah

Der Autor des Materials, dessen Übersetzung wir veröffentlichen, schlägt vor, über Angular 8 zu sprechen. Hier werden einige besonders wichtige Themen erörtert, die auf den Veranstaltungen von NgConf und Google I / O 2019 angesprochen wurden. Wenn Sie sich für Angular interessieren, aber aus irgendeinem Grund keine Berichte von gesehen haben Wir glauben, dass Sie neugierig sein werden, was Sie von Angular 8 erwarten können.



Wichtige Punkte


Ich bin sicher, dass Sie sich jetzt auf die Veröffentlichung von Angular 8 freuen. Sie erleben die gleichen Gefühle, die ich nach der NgConf 2019 erlebt habe. Der Bericht von Igor Minar berührte viele erwartete Innovationen - von Werkzeugen bis zu Technologien wie Differenzialbelastung und vielen anderen wunderbaren Dingen.

Lassen Sie uns diskutieren, wie sich all dies auf Ihre Projekte auswirken kann. Wir werden nämlich neue Möglichkeiten in Betracht ziehen und darüber sprechen, ob ihr Auftreten dazu führen wird, dass veraltete bestehende Mechanismen erkannt werden oder dass das Neue mit dem Alten unvereinbar sein wird.

Neue Funktionen


▍ Differenzbelastung


Mithilfe der Differentialladetechnologie kann Angular während des Erstellungsprozesses eines Projekts ein separates Bündel für Polyfills erstellen. browserlist hängt von der browserlist . So wird es allgemein aussehen.


Oben ist eine neue Möglichkeit, Projekte zu packen ( Quelle )

Durch die Verwendung dieser Funktion wird die Größe von Bundles reduziert.


Einsparungen durch Differenzbelastung ( Quelle )

Wie funktioniert das?

Angular sammelt zusätzliche Polyfill-Dateien und diese werden mithilfe von Nomodule- Attributen in den Code eingebettet :

 <body> <pp-root></pp-root> <script type="text/javascript" src="runtime.js"></script> <script type="text/javascript" src="es2015-polyfills.js" nomodule></script> <script type="text/javascript" src="polyfills.js"></script> <script type="text/javascript" src="styles.js"></script> <script type="text/javascript" src="vendor.js"></script> <script type="text/javascript" src="main.js"></script> </body> 

Das nomodule Attribut boolean verhindert, dass das Skript in Browsern nomodule und ausgeführt wird, die ES6-Module unterstützen. Solche Browser ignorieren solche Skripte. Ältere Browser laden sie herunter und führen sie aus.

▍SVG-Vorlagen


Jetzt können SVG-Dateien als Vorlagen verwendet werden. Bisher konnte eingebettetes oder externes HTML als Vorlage verwendet werden.

 @Component({ selector: "app-icon", templateUrl: "./icon.component.svg", styleUrls: ["./icon.component.css"] }) export class AppComponent {...} 

Ich Ivy experimentelle Rendering-Engine


Der Ivy-Motor befindet sich noch in einem experimentellen Stadium. Nach der Veröffentlichung von Angular 8 können Sie es testen, indem --enable-ivy beim Erstellen einer neuen Anwendung das --enable-ivy . Der entsprechende Code wird unten angezeigt. Denken Sie daran, dass Ivy noch nicht ganz fertig ist (es befindet sich noch im Status "Opt-In-Vorschau"). Wie Igor Minar auf der NgConf 2019 sagte, wird weiterhin empfohlen, die View Engine beim Erstellen neuer Anwendungen zu verwenden.

Um die Verwendung von Ivy in einem vorhandenen Projekt zu aktivieren, müssen Sie den enableIvy option angularCompilerOptions in angularCompilerOptions in der angularCompilerOptions auf true angularCompilerOptions :

 "angularCompilerOptions": {"enableIvy": true} 

Sie können eine neue Anwendung erstellen, in der Ivy verwendet wird:

 $ ng new my-app --enable-ivy 

Ivy bietet die folgenden nützlichen Funktionen, von denen die ersten drei in Angular 9 erwartet werden:

  1. Schnellere Zusammenstellung.
  2. Verbesserte Typprüfung für Vorlagen.
  3. Reduzierung der Bündelgröße. Wenn Sie es noch nicht gesehen haben, eine Demonstration einer 4,3-KB-Anwendung mit Google I / O 19.
  4. Abwärtskompatibilität.
  5. Und meine Lieblingsfunktion ist das Debuggen von Vorlagen. Ich bin mir sicher, dass viele Entwickler wie ich dies brauchen.

▍Unterstützen Sie Bazel


Bazel ist ein weiteres Tool, das Google auf den Open Source-Markt verlagert hat. Laut Igor Minar wird Bazel seit langem für die internen Anforderungen des Unternehmens verwendet und steht nun allen zur Verfügung. Weitere Informationen zu diesem Projekt-Builder finden Sie in der Dokumentation und in der Verwendung von Bazel mit Angular .

Vielleicht fragen Sie sich jetzt, ob Bazel für den praktischen Gebrauch bereit ist. Beantworten Sie diese Frage kurz - sie ist noch nicht fertig. Jetzt befindet er sich im Status "Opt-In-Vorschau". Lassen Sie mich Alex Eagle zitieren, der das Angular-Tool-Entwicklungsteam bei Google leitet: „Wenn Sie bereits zuvor in die Bazel-Gewässer eingetreten sind, müssen Sie feststellen, dass es viele Haie gab ... Jetzt haben wir die Haie bereits verwaltet, aber das Wasser kann es immer noch sein kalt. "

Bazel wird noch ausgearbeitet, es wird erwartet, dass es in Version 9 in @angular/cli .

Hier sind einige nützliche Funktionen, die Bazel uns bieten kann:

  1. Beschleunigung der Projektaufbauzeit. Der erste Build dauert einige Zeit, aber parallele Builds sind viel schneller. Angular verwendet bereits Bazel, und jetzt sind die CI-Routinen in 7,5 Minuten abgeschlossen, nicht in einer Stunde wie vor Bazel.
  2. Inkrementelle Projektmontage. Es wird möglich sein, nicht die gesamte Anwendung zu erfassen und bereitzustellen, sondern nur das, was sich daran geändert hat.
  3. Möglichkeit, mit Bazel-Dateien zu arbeiten, die standardmäßig ausgeblendet sind.

Sie können einem vorhandenen Projekt wie folgt Bazel-Unterstützung hinzufügen:

 ng add @angular/bazel 

Sie können mit Bazel eine neue Anwendung erstellen:

 $ npm install -g @angular/bazel $ ng new my-app --collection=@angular/bazel 

▍API Builder


Mit der neuen Version von Angular können Sie die API Builder verwenden, die auch als Architect bezeichnet werden. Angular verwendet Builder, um grundlegende Vorgänge auszuführen: serve , build , test , lint und e2e . Hier ist ein Beispiel mit Assemblern aus der Datei angular.json :

 ... "projects": { "app-name": {   ...   "architect": {     "build": {       "builder": "@angular-devkit/build-angular:browser",       ...     },     "serve": {       "builder": "@angular-devkit/build-angular:dev-server",       ...     },     "test": {       "builder": "@angular-devkit/build-angular:karma",       ...     },     "lint": {       "builder": "@angular-devkit/build-angular:tslint",       ...     },     "e2e": {       "builder": "@angular-devkit/build-angular:protractor",       ...     }   } } } 

Jetzt können Sie Ihre eigenen Sammler erstellen. Ich sehe sie ähnlich wie die Schluck- / Grunzbefehle, die früher verwendet wurden.

Im Allgemeinen ist der Kollektor nur eine Funktion mit einer Reihe von Befehlen, die aus dem Paket @angular-devkit/architect an die Methode createBuilder() werden:

 import { createBuilder } from '@angular-devkit/architect'; function customBuild(options, context) { return new Promise((resolve, reject) => {   //   }) } createBuilder(customBuild); 

Hier können Sie einen Blick auf die integrierten Angular Builder werfen. Hier sind großartige Dinge über sie im Angular-Blog.

▍Ändert sich beim faulen Laden


Die neue Version von Angular wird auch eine neue Version des Systems des verzögerten Ladens von Modulen enthalten, deren Erscheinungsbild dazu führt, dass die vorhandene Syntax loadChildren:string veraltet ist.

Bisher sah es so aus:

 loadChildren: './lazy/lazy.module#LazyModule'; 

Mit der Veröffentlichung von Angular 8 - so:

 loadChildren: () => import('./lazy/lazy.module').then(m => m.LazyModule) 

Wenn Sie bei der Arbeit viele Module haben, mit denen der Lazy-Loading-Mechanismus verwendet wird, und deren Übersetzung in eine neue Betriebsart automatisieren möchten, schauen Sie sich dieses Material an.

▍Unterstützungs-API $ location AngularJS


Das Angular-Entwicklungsteam ist bestrebt, die Benutzer von AngularJS zu unterstützen und ihnen bei der Umstellung auf Angular zu helfen. Infolgedessen wurde dem System im Paket angular/common/upgrade Unterstützung für den Dienst $location hinzugefügt. Wir sprechen über die folgenden Funktionen:

  1. Abrufen des Status vom $location Dienst.
  2. Adressänderungen verfolgen.
  3. Abrufen der gleichen Informationen zu den Komponenten der Adresse, die in AngularJS abgerufen werden konnten ( hostname , protocol , port , search ).
  4. Testen des Dienstes mithilfe der MockPlatformLocation-API.

EbWeb Worker


Angular 8 bietet Unterstützung für Web-Worker. Mit ihrer Hilfe können Sie die Hintergrundausführung von ressourcenintensivem Code organisieren. Um einen neuen Web Worker zu erstellen, können Sie den folgenden Befehl für die Angular-Befehlszeilenschnittstelle verwenden:

 ng g webWorker <name> 

▍Service Workers


Seit vor kurzem hat die Popularität progressiver Webanwendungen stark zugenommen, und es wurden viele Verbesserungen für Servicemitarbeiter vorgenommen. Eine dieser Verbesserungen war insbesondere das Hinzufügen des Parameters SwRegistrationOptions . Eine weitere Verbesserung war die Unterstützung mehrerer Anwendungen in derselben Domäne.

Weitere Informationen zu Servicemitarbeitern finden Sie in diesem Abschnitt der Angular-Dokumentation.

▍ Formularverbesserungen


Die Methode markAllAsTouched wurde markAllAsTouched , mit der Sie alle Elemente in einer FormGroup als touched markieren können. Dies ist sehr nützlich, wenn Sie die Validierung aller Steuerelemente in einer FormGroup . Vorher wurde dasselbe wie folgt gemacht:

 validateFormAndDisplayErrors(form: FormGroup) { Object.keys(form.controls).map((controlName) => {   form.get(controlName).markAsTouched({onlySelf: true}); }); } 

Im neuen Winkel können Sie mit der Methode clear FormArray , wodurch alle Elemente daraus entfernt werden. Zuvor war es erforderlich, die folgende Konstruktion zu verwenden und das erste Element in jeder Iteration der Schleife zu entfernen:

 while (formArray.length) { formArray.removeAt(0); } 

Sie müssen dies nicht mehr tun. Jetzt reicht es aus, eine einzelne Methode aufzurufen:

 formArray.clear() 

▍Einstellen des Zeitpunkts des Empfangs einer Antwort bei Verwendung der ViewChild- und ContentChild-Anweisungen


Diese neue Funktion impliziert die Verwendung des static Flags, mit dem Sie angeben können, wann die Anforderung aufgelöst wird, definiert durch die ViewChild oder ContentChild Direktive.

Möglicherweise sind Sie auf die folgenden Beispiele für inkonsistentes Systemverhalten gestoßen. Manchmal sind Suchergebnisse in der ngOnInit Lebenszyklusmethode verfügbar, und manchmal sind sie nicht vorhanden, bevor ngAfterContentInit oder ngAfterViewInit . So verwenden Sie das static Flag:

 //          @ContentChild('foo', { static: false }) foo!: ElementRef; //          ngOnInit @ViewChild(TemplateRef, { static: true }) foo!: TemplateRef; 

Es ist zu beachten, dass diese Funktionen für die ViewChildren und ContentChildren Anweisungen nicht verfügbar sind. Die entsprechenden Suchanfragen für Elemente werden ausgeführt, nachdem die Änderungserkennung durchgeführt wurde.

Wenn Sie static: true sollten static: true vorsichtig sein, da Sie mit diesem Flag keine Ergebnisse aus dynamischen Vorlagen (d. H. * NgIf) abrufen können. Dem System wurde eine Schaltplanregel hinzugefügt, mit der Sie vorhandenen Code unter Verwendung der neuen Syntax übersetzen können. Diese Syntax wird mit Ivy verwendet.

→ Details zu dieser Funktion finden Sie hier .

▍Unterstützungs-Typoskript 3.4.x


Angular verwendet jetzt TypeScript 3.4 (die siebte Version von Angular verwendet TypeScript 3.2.x). Es gibt nicht so viele wichtige Änderungen in der neuen Version von TS. Sie werden wahrscheinlich nicht zu unangenehmen Konsequenzen führen.

→ Details zu den Innovationen von TS 3.4 finden Sie hier .

▍ Leistungsverbesserung


Unter den aktuellen Bedingungen erstellt ServerRendererFactory2 für jede Anforderung eine neue Instanz von DomElementSchemaRegistry , was in Bezug auf Ressourcen recht teuer ist. Jetzt wird die gemeinsame Nutzung der globalen Instanz von DomElementSchemaRegistry organisiert.

▍ Bereitstellen von Angular-Anwendungen auf Firebase-Hosting


Wenn Sie Firebase-Hosting zum Bereitstellen von Angular-Anwendungen verwenden, wird Ihnen diese Innovation auf jeden Fall gefallen. Der Punkt ist, dass es jetzt in der Angular CLI einen speziellen Befehl gibt, um diese Operation auszuführen:

 ng run [PROJECT_NAME]:deploy 

Hier erfahren Sie mehr über diese Funktion.

Veraltete APIs


▍Verwenden Sie bei der Arbeit mit TesBed.get einen beliebigen Typ


Die TesBed.get Methode hatte zwei Signaturen. Einer wird eingegeben, der zweite ist der empfangende und zurückgebende Typ. Jetzt ist die Methodensignatur, die die Verwendung des Typs any vorsieht, veraltet. Sie können diese Methode nur mit Angabe eines bestimmten Typs verwenden. Dies wirkt sich beispielsweise auf Fälle aus, in denen mit Zeichenfolgentoken (die nicht unterstützt werden) und mit einigen anderen Token gearbeitet wird.

Zuvor verwendete solche Designs:

 TestBed.configureTestingModule({ providers: [{ provide: "stringToken", useValue: new Service() }], }); let service = TestBed.get("stringToken"); //  any 

Nun wird der folgende Ansatz angewendet:

 const SERVICE_TOKEN = new InjectionToken<Service>("SERVICE_TOKEN"); TestBed.configureTestingModule({ providers: [{provide: SERVICE_TOKEN, useValue: new Service()}], }); let service = TestBed.get(SERVICE_TOKEN); //  Service 

▍Entfernen des DOKUMENTS aus dem Winkel- / Plattformbrowser


DOCUMENT aus dem Paket @angular/platform-browser . Wenn Sie DOCUMENT aus diesem Paket verwenden, sollten Sie es aus @angular/common importieren.

▍Deinstallieren Sie das Angular / http-Paket


Das @angular/http Paket war in Angular 5 veraltet, aber weiterhin verfügbar, da @angular/platform-server abhängig war. Jetzt wird dieses Paket aus der Liste der Pakete entfernt.

Kritische Veränderungen


▍Auto Code Fix


Nur wenige wissen, dass Angular Fehler bei der Verwendung der HTML-Elemente tr und col automatisch korrigiert.

Im Fall von tr Korrekturen vorgenommen, wenn sich das entsprechende Element nicht innerhalb des tbody , tfoot oder thead . Korrekturen bestanden in der automatischen Platzierung eines Elements in tbody .

Im Fall von col Korrekturen an Code vorgenommen, in dem sich dieses Element nicht innerhalb des colgroup Tags befindet.

Angular überlässt die Korrektur dieser Fehler nun dem Ermessen der Entwickler. Dies geschieht, um Konflikte und Fehler zu vermeiden. Daher müssen sich diejenigen, die an diese Funktion gewöhnt sind, selbst um die Richtigkeit des Codes kümmern.

→ Details dazu finden Sie hier .

▍ Winkelmaterial umbenennen


Das Angular Material-Projekt wurde in Angular Components umbenannt. Paketnamen haben sich nicht geändert.

Zusammenfassung


Angular 8 wird sehr bald veröffentlicht. Das Angular-Entwicklungsteam leistet hervorragende Arbeit. Die Ergebnisse ihrer Bemühungen erleichtern die Arbeit und das Leben derjenigen, die Angular verwenden. Insbesondere wird es beispielsweise mit jeder neuen Version des Frameworks immer einfacher, von der vorherigen Version zu diesem zu wechseln. So sieht es zum Beispiel bei Air France aus.


Zeitaufwand für das Upgrade auf neue Versionen von Angular ( Quelle )

Infolgedessen können wir hoffen, dass der Übergang von Angular 7 zu Angular 8 nicht viel Zeit in Anspruch nimmt und keine ernsthaften Anstrengungen erfordert.

Hier finden Sie schrittweise Anleitungen zum Upgrade auf neue Versionen von Angular.

Vor ungefähr einem Monat sagte Igor Minar , dass alles darauf hindeutet, dass Angular 8.0.0 möglicherweise Ende Mai herauskommt. Angular 8.0.0-rc.5 wurde am 24. Mai veröffentlicht.

Die Zukunft von Angular sieht recht optimistisch aus. Alles andere liegt bei uns.

Liebe Leser! Was erwarten Sie von Angular 8?

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


All Articles