앵귤러 버전 18로 업그레이드

Sterling Store Engagement 이 Angular 버전 18로 업그레이드되었습니다. 확장 프로그램을 Angular 버전 18로 마이그레이션해야 합니다.

시작하기 전에

참고: Angular 버전 18로 마이그레이션할 수 없지만 Angular 버전 15에서 확장 기능을 수정하려는 경우 24.3.9.2-10.0.2409.2 개발자 툴킷을 사용하여 사용자 지정을 계속 빌드할 수 있습니다. 최신 기능, 개선 사항 및 수정 사항을 적용하려면 Angular 버전 18로 업그레이드해야 합니다.
  • 24.3.9.2-10.0.2409.2 또는 Angular 버전 15 개발자 툴킷의 Angular 버전 15 워크스페이스가 있어야 합니다.
  • node.js 버전 18.20.0 을 사용 중인지 확인하세요.

태스크 정보

이주 과정은 세 단계로 이루어져 있습니다. 먼저 Angular 버전 15에서 16으로 업그레이드하고, 그 다음 버전 16에서 17으로 업그레이드하고, 마지막으로 버전 17에서 18로 업그레이드합니다.
참고: <WORKSPACE>/store-frontend-src 폴더에 있는 모든 명령어를 실행해야 합니다.

프로시저

  1. Node-sass를 packages/libs/styles/package.jsonextensions/libs/styles/package.json 파일 모두에서 버전 8.0.0 로 업데이트한 다음, 다음 명령 중 하나를 실행합니다.
    yarn bootstrap
  2. 다음 명령을 실행하여 Angular 코어와 CLI를 버전 16으로 업그레이드하십시오.
    ng update @angular/core@16 @angular/cli@16 --allow-dirty --force
  3. 다음 명령을 실행하여 Angular 코어와 CLI를 버전 17로 업그레이드하십시오.
    ng update @angular/core@17 @angular/cli@17 --allow-dirty --force
  4. 다음 명령을 실행하여 Angular 코어와 CLI를 버전 18로 업그레이드하십시오.
    ng update @angular/core@18 @angular/cli@18 --allow-dirty --force
    참고 : 이 명령을 실행할 때, 애플리케이션 빌더 use-application-builder 를 사용하기 위한 선택적 마이그레이션이 발생합니다. 계속하려면 엔터키를 누르십시오
  5. 확장 디렉터리 내의 모든 app.component.ts 생성자 메서드에서 기존 코드를 검색하여 새 코드로 바꿉니다. 이 코드 조각이 발생하지 않으면 6단계로 진행합니다.
    다음 코드는 기존 코드를 보여줍니다:
    this.router.events.subscribe((event: RouterEvent) => {
        this.routingStateService.navigationInterceptor(event);
    });
    다음 코드는 새로운 코드를 보여줍니다:
    this.router.events.pipe(
        filter((event: Event | RouterEvent): event is RouterEvent => event instanceof RouterEvent)
    ).subscribe((event: RouterEvent) => {
        this.routingStateService.navigationInterceptor(event);
    });
    그런 다음, @angular/router 에서 Event 를, rxjs/operators 에서 filter 를 가져옵니다.
    import { filter, take } from 'rxjs/operators';
    import { Router, RouterEvent, Event } from '@angular/router';
  6. extended packages/libs/common-components/src/lib/components/donut-chart/donut-chart.component.ts 가 있다면, donut-chart.component.ts 파일에서 기존 코드를 새로운 코드로 검색하고 교체하십시오.
    다음 코드는 기존 코드를 보여줍니다:
    const pie = d3.pie().value((d) => d.count).sort(null);
    다음 코드는 새로운 코드를 보여줍니다:
    const pie = d3.pie().value((d) => d?.['count']).sort(null);
  7. angular.json 파일에서 browserTarget 를 검색하고 buildTarget 로 대체하십시오.
  8. 최신 개발자 툴킷 25.1.3.0-10.0.2503.0 에서 extensions/libs/styles 디렉토리로 이동하여 package.jsonwebpack.config.js 파일을 확장 폴더에 복사합니다.
  9. 다음 단계를 완료하여 최신 개발자 도구 키트( 25.1.3.0-10.0.2503.0 )에서 새 워크스페이스를 설정하세요.
    1. 이전 작업 공간에서 새 작업 공간으로 angular.json 파일을 복사합니다.
    2. 이전 작업 공간에서 새로운 작업 공간으로 마이그레이션된 확장 프로그램을 복사합니다.
    3. 확장 기능을 테스트하려면 다음 명령을 다시 실행하십시오.
      yarn bootstrap
      ln -s <store-temp>/store-cli/schematics/node_modules <store-temp>/store-cli/node_modules

      이 전에 명령을 실행하는 동안 절대 경로를 사용해야 합니다.

    4. 애플리케이션 제공 코드에서 들어오는 변경 사항을 확장 프로그램과 병합하여 가장 최신 버전의 코드를 사용하고 있는지 확인하고 컴파일 오류를 방지하세요.
    5. 변경 사항을 병합하는 동안 다음 단계를 고려하세요.
      1. RxJS 의 최신 버전에서는 다음 메서드에 대한 인수가 제공되지 않으면 TypeScript 에 오류 메시지가 표시됩니다. 인수를 전달하지 않으려면 void 유형으로 제목을 선언하세요. 또는 피사체가 다른 소스에서 값을 방출하고 관찰자에 의해 통합되지만 한 소스에서 값을 보내지 않으려는 경우 next 메서드에 null 인자로 전달하세요. 다음 코드는 기존 코드를 보여줍니다:
        public addToCartSubject = new Subject<any>();
        this.refreshParentComponent.next();

        다음 코드는 새로운 코드를 보여줍니다:

        public addToCartSubject = new Subject<void>();
        this.refreshParentComponent.next(null);
      2. ngbAccordion 은 16.0.0 버전에서 component 에서 directive 로 변경되었습니다. 이 후 예제에 따라 확장자에서 ngbAccordiondirective 으로 업그레이드되었는지 확인합니다.
        1. 다음 예시와 같이 component.html 파일에서 아코디언 코드를 변경합니다. 다음 코드는 이전 코드를 보여줍니다:
          <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>

          다음 코드는 새로운 코드를 보여줍니다:

          <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>
        2. component.ts 파일에서 NgbAccordion 가져오기를 제거하고 @ng-bootstrap/ng-bootstrap 에서 NgbAccordionDirective 를 추가합니다.
          import { NgbAccordionDirective } from '@ng-bootstrap/ng-bootstrap';
        3. component.ts 파일에서 다음 코드 샘플에 표시된 대로 isOpen 함수를 변경합니다.
          public isOpen(acc: NgbAccordion, panelId: string) {
              return (acc.activeIds.includes(panelId));
            }
          다음과 같이 변경하십시오
          public isOpen(acc: NgbAccordionDirective, panelId: string) {
            return acc.isExpanded(panelId)
          }
        4. PanelChange 이벤트는 가장 최근의 ngbootsrap에서 제거되었습니다. 다음에 언급된 변경 사항을 진행합니다:
          1. 다음 예와 같이 component.html 파일에서 panelChangeshow 으로 바꿉니다:
            (panelChange)="setSelectedLocation($event)"
            다음과 같이 바꾸십시오:
            (show)="setSelectedLocation($event)"
          2. component.ts 파일에서 다음 예시와 같이 panelChange 이벤트 핸들러 함수를 변경합니다:
            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 = '';
                }
              }
            다음으로 변경
            public setSelectedLocation(panelId: string) {
                if (UIUtil.isNotVoid(panelId)) {
                    this.selectedLocationId = panelId;
                    this._setDefaultAttributeSet(this.selectedLocationId);
                } else {
                  this.selectedLocationId = '';
                }
              }
      3. 부트스트랩의 navbar 에서 ngbDropdown 을 사용하는 경우 그림과 같이 display 속성을 dynamic 으로 설정합니다.
        <div ngbDropdown display="dynamic"></div>
  10. 다음 명령을 실행하여 애플리케이션을 시작합니다:
    yarn start-app
    참고: yarn start-app 명령을 실행할 때 다음 오류가 발생하면 작업 영역에서 .angular 폴더를 삭제하고 명령을 다시 실행하세요.

    Module not found: Error: node_modules/@angular-devkit/build-angular/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js'

    참고: 개발 목적으로 dev 또는 qa cloud 인스턴스를 원격 서버로 사용하는 경우 로컬 개발 서버 구성하기에서 설명한 대로 변경해야 합니다.