Upgrade auf Angular Version 18
Sterling Store Engagement wurde auf Angular Version 18 aktualisiert. Stellen Sie sicher, dass Sie Ihre Erweiterungen auf die Angular-Version 18 migrieren.
Vorbemerkungen
Hinweis: Wenn Sie nicht auf Angular Version 18 migrieren können, aber Ihre Erweiterungen in Angular Version 15 ändern möchten, können Sie Ihre Anpassungen weiterhin mit dem 24.3.9.2-10.0.2409.2 developer toolkit erstellen. Um die neuesten Funktionen, Verbesserungen und Korrekturen zu erhalten, müssen Sie auf Angular Version 18 aktualisieren.
- Sie müssen Angular Version 15 Workspace von 24.3.9.2-10.0.2409.2 oder ein Angular Version 15 Entwickler-Toolkit haben.
- Vergewissern Sie sich, dass Sie die Version
node.js18.20.0 verwenden.
Informationen zu diesem Vorgang
Hinweis : Führen Sie alle Befehle aus dem Ordner <WORKSPACE>/store-frontend-src aus.
Vorgehensweise
- extensions/libs/styles/package.json Aktualisieren Sie node-sass in den Dateien 8.0.0 und packages/libs/styles/package.json auf Version und führen Sie dann einen der folgenden Befehle aus:
yarn bootstrap - Aktualisieren Sie Angular Core und CLI auf Version 16, indem Sie den folgenden Befehl ausführen:
ng update @angular/core@16 @angular/cli@16 --allow-dirty --force - Aktualisieren Sie Angular Core und CLI auf Version 17, indem Sie den folgenden Befehl ausführen:
ng update @angular/core@17 @angular/cli@17 --allow-dirty --force - Aktualisieren Sie Angular Core und CLI auf Version 18, indem Sie den folgenden Befehl ausführen:
ng update @angular/core@18 @angular/cli@18 --allow-dirty --forceHinweis : Wenn Sie diesen Befehl ausführen, wird eine optionale Migration zur Verwendung des Application Builderuse-application-builderangezeigt. Drücken Sie die Eingabetaste, um fortzufahren - Suchen Sie in allen app.component.ts Konstruktormethoden innerhalb des Erweiterungsverzeichnisses nach dem vorhandenen Code und ersetzen Sie ihn durch den neuen Code. Wenn dieser Codeschnipsel nicht vorkommt, fahren Sie mit Schritt 6 fort.Der folgende Code veranschaulicht den vorhandenen Code:
this.router.events.subscribe((event: RouterEvent) => { this.routingStateService.navigationInterceptor(event); });Der folgende Code veranschaulicht den neuen Code:this.router.events.pipe( filter((event: Event | RouterEvent): event is RouterEvent => event instanceof RouterEvent) ).subscribe((event: RouterEvent) => { this.routingStateService.navigationInterceptor(event); });Importieren Sie dann Event aus @angular/router und filter aus rxjs/operators.import { filter, take } from 'rxjs/operators'; import { Router, RouterEvent, Event } from '@angular/router'; - Wenn Sie extended
packages/libs/common-components/src/lib/components/donut-chart/donut-chart.component.ts haben, suchen Sie den vorhandenen Code und ersetzen Sie ihn durch den neuen Code in der Datei donut-chart.component.ts .Der folgende Code veranschaulicht den vorhandenen Code:
const pie = d3.pie().value((d) => d.count).sort(null);Der folgende Code veranschaulicht den neuen Code:const pie = d3.pie().value((d) => d?.['count']).sort(null); - Suchen Sie in der Datei angular.json nach browserTarget und ersetzen Sie diese durch buildTarget.
- Wechseln Sie im aktuellen Entwickler-Toolkit 25.1.3.0-10.0.2503.0 in das Verzeichnis extensions/libs/styles und kopieren Sie die Dateien package.json und webpack.config.js in Ihren Erweiterungsordner.
- Richten Sie einen neuen Arbeitsbereich aus dem neuesten Entwickler-Toolkit 25.1.3.0-10.0.2503.0 ein, indem Sie die folgenden Schritte ausführen.
- Kopieren Sie die Datei angular.json aus dem vorherigen Arbeitsbereich in den neuen Arbeitsbereich.
- Kopieren Sie die migrierten Erweiterungen aus dem vorherigen Arbeitsbereich in den neuen Arbeitsbereich.
- Führen Sie die folgenden Befehle erneut aus, um die Erweiterungen zu testen:
yarn bootstrapln -s <store-temp>/store-cli/schematics/node_modules <store-temp>/store-cli/node_modulesStellen Sie sicher, dass Sie den absoluten Pfad verwenden, wenn Sie den Befehl davor ausführen.
- Führen Sie eingehende Änderungen aus dem von der Anwendung bereitgestellten Code mit Erweiterungen zusammen, um sicherzustellen, dass Sie mit der neuesten Version des Codes arbeiten und Kompilierungsfehler vermeiden.
- Beachten Sie die nächsten Schritte, während Sie Ihre Änderungen zusammenführen.
- In der neuesten Version von
RxJSzeigtTypeScripteine Fehlermeldung an, wenn das Argument für die nächste Methode nicht angegeben wird. Wenn Sie kein Argument übergeben wollen, deklarieren Sie das Subjekt mit einem void Typ. Wenn das Subjekt Werte aus einer anderen Quelle aussendet und von Beobachtern integriert wird, Sie aber keinen Wert aus einer Quelle senden wollen, können Sie auch null als Argument an die Methode next übergeben. Der folgende Code veranschaulicht den vorhandenen Code:public addToCartSubject = new Subject<any>(); this.refreshParentComponent.next();Der folgende Code veranschaulicht den neuen Code:
public addToCartSubject = new Subject<void>(); this.refreshParentComponent.next(null); - ngbAccordion wird in der Version 16.0.0 von ng-bootstrap von component auf directive geändert. Befolgen Sie das folgende Beispiel, um sicherzustellen, dass alle Vorkommen von ngbAccordion in Erweiterungen auf directive aktualisiert werden.
- Ändern Sie den Akkordeon-Code in der Datei component.html wie im folgenden Beispiel dargestellt. Der folgende Code veranschaulicht den alten Code:
<ngb-accordion #acc="ngbAccordion" activeIds="{{activeIds}}" [attr.tid]="componentId+'filterStatus'"> <ngb-panel id="ngb-panel-assignto"> <ng-template ngbPanelTitle> <span [ngClass]="{' app-icon-open-chevron_down_14': isOpen(acc, 'ngb-panel-assignto'), 'app-icon-collapsed-chevron_right_14': !isOpen(acc, 'ngb-panel-assignto') }" class="app-glyphicons"></span> <span translate> filterOptions.LABEL_FilterGroupDisplayValueAssignTo</span> </ng-template> <ng-template ngbPanelContent> <isf-combo-box [attr.tid]="componentId+'filterAssignTo'" [searchText]="selectedUserName" [items]="userList" [columnName]="'name'" [selectedValues]="[selectedUserName]" [placeholder]="'filterOptions.LABEL_SelectAssociate'" [isItemSelected]="selectedUserName" (applySelection)="onSelection($event)" [resetValue]="resetComboBox"></isf-combo-box> </ng-template> </ngb-panel> </ngb-accordion>Der folgende Code veranschaulicht den neuen Code:
<div ngbAccordion #acc="ngbAccordion" [attr.tid]="componentId+'filterStatus'"> <div ngbAccordionItem="ngb-panel-assignto" id="ngb-panel-assignto" [collapsed]="!activeIds.includes('ngb-panel-assignto')"> <div ngbAccordionHeader> <button ngbAccordionButton> <span [ngClass]="{' app-icon-open-chevron_down_14': isOpen(acc, 'ngb-panel-assignto'), 'app-icon-collapsed-chevron_right_14': !isOpen(acc, 'ngb-panel-assignto') }" class="app-glyphicons"></span> <span translate> filterOptions.LABEL_FilterGroupDisplayValueAssignTo</span> </button> </div> <div ngbAccordionCollapse> <div ngbAccordionBody> <ng-template> <isf-combo-box [attr.tid]="componentId+'filterAssignTo'" [searchText]="selectedUserName" [items]="userList" [columnName]="'name'" [selectedValues]="[selectedUserName]" [placeholder]="'filterOptions.LABEL_SelectAssociate'" [isItemSelected]="selectedUserName" (applySelection)="onSelection($event)" [resetValue]="resetComboBox"></isf-combo-box> </ng-template> </div> </div> </div> </div> - In der Datei component.ts entfernen Sie den Import von NgbAccordion und fügen NgbAccordionDirective aus @ng-bootstrap/ng-bootstrap hinzu.
import { NgbAccordionDirective } from '@ng-bootstrap/ng-bootstrap'; - Ändern Sie in der Datei component.ts die Funktion isOpen wie im folgenden Codebeispiel gezeigt.
public isOpen(acc: NgbAccordion, panelId: string) { return (acc.activeIds.includes(panelId)); }Ändern Sie wie folgt:public isOpen(acc: NgbAccordionDirective, panelId: string) { return acc.isExpanded(panelId) } - Das Ereignis PanelChange wird in der neuesten Version von ngbootsrap entfernt. Fahren Sie mit den nachfolgend genannten Änderungen fort:
- Ersetzen Sie panelChange durch show in der Datei
component.html, wie im folgenden Beispiel gezeigt:(panelChange)="setSelectedLocation($event)"Ersetzen Sie wie folgt:(show)="setSelectedLocation($event)" - Ändern Sie in der Datei component.ts die Funktion panelChange event handler wie im folgenden Beispiel gezeigt:
public setSelectedLocation(event: NgbPanelChangeEvent) { if (UIUtil.isNotVoid(event.nextState)) { if (UIUtil.isNotVoid(event.panelId)) { this.selectedLocationId = event.panelId; this._setDefaultAttributeSet(this.selectedLocationId); } } else { this.selectedLocationId = ''; } }Vorzunehmende Änderungpublic setSelectedLocation(panelId: string) { if (UIUtil.isNotVoid(panelId)) { this.selectedLocationId = panelId; this._setDefaultAttributeSet(this.selectedLocationId); } else { this.selectedLocationId = ''; } }
- Ersetzen Sie panelChange durch show in der Datei
- Ändern Sie den Akkordeon-Code in der Datei component.html wie im folgenden Beispiel dargestellt. Der folgende Code veranschaulicht den alten Code:
- Wenn Sie ngbDropdown in der Bootstrap-Datei navbar verwenden, setzen Sie das Attribut display wie gezeigt auf dynamic .
<div ngbDropdown display="dynamic"></div>
- In der neuesten Version von
- Starten Sie die Anwendung, indem Sie den folgenden Befehl ausführen:
yarn start-appHinweis: Wenn Sie den Befehlyarn start-appausführen und der folgende Fehler auftritt, löschen Sie den Ordner .angular aus dem Arbeitsbereich und führen Sie den Befehl erneut aus.Module not found: Error: node_modules/@angular-devkit/build-angular/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js'Hinweis: Wenn Sie die Instanz dev oder qa cloud als Remote-Server für Entwicklungszwecke verwenden, müssen Sie die unter Konfiguration des lokalen Entwicklungsservers genannten Änderungen vornehmen.