Отложенная загрузка модулей Angular Material и оптимизация пакетов

Я создаю приложение Angular с версией 17, и после объединения его размер превышает бюджет. На рисунке показано, что в проводнике исходной карты имеется несколько модулей Angular Material, которые не загружаются отложенно, например поле формы, CDK и список. Из руководства по автономной реализации я настроил ленивые маршруты и ленивые компоненты, но эти модули материалов все еще находятся в исходных пакетах.

Поскольку я использую Nx, сценарий сборки:

"build-ng-frontend": "nx build ng-frontend --configuration production --optimization --base-href ./",

Вот скрипт для генерации исходной карты:

"bundle-ng-frontend-report": "nx build ng-frontend --configuration production --source-map && source-map-explorer dist/apps/ng-frontend/browser/*.js",

Вот пример,

// app routes
export const APP_ROUTES: Route[] = [
  {
    path: 'topics',
    loadChildren: () =>
      import('./modules/help-center/routes').then((m) => m.HELP_CENTER_ROUTES),
  },
  {
    path: 'projects/:projectSlug',
    loadChildren: () =>
      import('./modules/project/routes').then((m) => m.PROJECT_ROUTES),
  },
  {
    path: '',
    loadChildren: () =>
      import('./modules/entry/routes').then((m) => m.ENTRY_ROUTES),
  },
];

// help center routes
export const HELP_CENTER_ROUTES: Routes = [
  {
    path: '',
    loadComponent: () =>
      import('./views/help-center-view.component').then(
        (m) => m.HelpCenterViewComponent
      ),
    children: [
      {
        path: ':name',
        loadComponent: () =>
          import('./components/main-content/main-content.component').then(
            (m) => m.MainContentComponent
          ),
      },
    ],
  },
];

Неизбежен ли больший первоначальный размер пакета или я что-то неправильно понимаю в сборке? Вот мой репозиторий, если вам нужно дальнейшее расследование.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я предполагаю, что зависимости исходят из панели инструментов. Однако в компоненте приложения нет заполненных Inputs, поэтому я не уверен, следует ли использовать панель инструментов с богатой бизнес-логикой в ​​компоненте приложения.

Если да, то я бы рассмотрел возможность использования @defer с условием when, чтобы отложить загрузку условных данных, присутствующих на панели инструментов.

@defer (when this.snav && this.settings && this.projects)
 // the if condition needs to be present only if
 // the `when` condition could became falsy again.
 @if (this.snav && this.settings && this.projects) {
        <mat-form-field
          appearance = "outline"
          style = "margin-left: 1rem; margin-top: 20px"
        >

Использование @defer также можно рассмотреть даже в app-component:

@defer(on immediate) {
  <app-toolbar></app-toolbar>
} @loading {
  <div style = "height: 60px (match toolbar hegiht)"></div>
}

Это загрузит панель инструментов при первой визуализации приложения. Я предлагаю добавить прозрачный/цветной элемент div по высоте панели инструментов в качестве заполнителя загрузки, который предотвращает «перескакивание» содержимого.

Цените помощь. Чтобы решить эту проблему, мне следует знать о новом @defer, When и других связанных функциях для оптимизации размера пакета. Я займусь остальными проблемами пользовательского интерфейса.

Woden 07.05.2024 01:46

Когда вы придумаете окончательное решение, вы также можете поделиться им в качестве ответа здесь! Это может быть полезным «тематическим исследованием».

kvetis 07.05.2024 10:39

Спасибо. Я предоставлю больше контекста и информации, которую поисковая система AI также может использовать.

Woden 07.05.2024 15:27

Я ценю помощь от @kvetis, который прочитал мой репозиторий и предоставил решение. Вот контекст приложения на случай, если через какое-то время не будет кода или ссылки на репозиторий, на которую можно было бы ссылаться.

Как уже упоминалось, я уже настроил ленивую маршрутизацию , далее с ленивыми компонентами. Однако, согласно карте исходного кода, есть некоторые библиотеки, которые не используют ленивую фрагментацию. Вот код в моем app.comComponent.ts:

@Component({
  standalone: true,
  imports: [RouterOutlet, ToolbarComponent],
  selector: 'app-root',
  template: `
    <app-toolbar></app-toolbar>
    <router-outlet></router-outlet>
  `,
})
export class AppComponent {}

Есть только одно место, которое может привести к тому, что модули Angular Material не будут лениво разбиваться на фрагменты, — это компонент <app-toolbar>. Посмотрите на код:

@Component({
  selector: 'app-toolbar',
  standalone: true,
  imports: [
    NgIf,
    MatToolbarModule,
    MatIconModule,
    MatButtonModule,
    RouterLink,
    MatMenuModule,
    MatSelectModule,
    MatFormFieldModule,
  ],
  templateUrl: './toolbar.component.html',
  styleUrl: './toolbar.component.scss',
})
export class ToolbarComponent {
// inputs and outputs
}

Судя по скриншоту поста, действительно, MatFormFieldModule импортируется.

Поэтому возникает вопрос, как я могу использовать синтаксис @defer Angular версии 17, что означает отложенный просмотр , чтобы сделать панель инструментов загружаемой отложенно. После использования условия включения немедленно:

@Component({
  standalone: true,
  imports: [RouterOutlet, ToolbarComponent],
  selector: 'app-root',
  template: `
    @defer(on immediate) {
    <app-toolbar></app-toolbar>
    } @loading {
    <div style = "height: 60px"></div>
    }
    <router-outlet></router-outlet>
  `,
})
export class AppComponent {}

После очередной попытки объединения упомянутые модули Angular Material лениво удаляются. Дайте мне знать, если будет что-то неясно. Я изменю опубликованный ответ и добавлю дополнительную информацию.

Другие вопросы по теме