Вопрос или проблема
Я использую Angular 18, и у меня есть проблема с одним из моих модулей.
Я проверил исходные бандлы с помощью плагина ‘source-map-explorer’ и вижу, что 3 компонента (все из них являются автономными компонентами) из одного модуля помещены в исходный бандл. Они используются только в этом модуле.
У вас есть предложения, что я могу проверить, чтобы решить эту проблему?
Определение маршрутизации приложения
provideRouter(
{..},
{
path: 'news',
loadChildren: () => import('./news/news.module').then((m) => m.NewsModule),
canMatch: [() => enabledFeatures.newsSection],
canActivate: [authGuardCanActivate],
}
)
Определение модуля
@NgModule({
imports: [NewsRoutingModule, NgxsModule.forFeature(newsStateObjects)],
})
export class NewsModule {}
Маршрутизация модуля:
@NgModule({
imports: [RouterModule.forChild(
{ path: '', component: NewsDashboardComponent },
)],
exports: [RouterModule],
})
export class NewsRoutingModule {}
Определение компонента
@Component({
selector: 'app-news-item',
templateUrl: './news-item.component.html',
styleUrls: ['./news-item.component.scss'],
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
NgOptimizedImage, MiddleClickDirectiveDirective, NgClass, NewsItemUserLabelsComponent, DatePipe,
TranslateModule, TimeAgoPipe, MatCard, MatCardTitle, MatCardSubtitle,
MatCardContent, MatTooltip, MatCardActions, MatButton, MatIcon,
],
})
export class NewsItemComponent {}
Ответ или решение
Постановка проблемы: Компоненты, не подлежащие загрузке в начальный пакет
При работе с Angular 18 ключевым аспектом оптимизации производительности является уменьшение объема начального пакета (initial bundle). При использовании плагина source-map-explorer
вы заметили, что три компонента, все из которых являются отдельными (standalone) компонентами вашего модуля, попадают в начальный пакет, несмотря на то, что они используются исключительно внутри этого модуля. Это соответствует правильной работе ленивой загрузки (lazy loading), но проблема все же остается.
Возможные причины и решения
-
Проблемы с ленивой загрузкой (Lazy Loading):
- Убедитесь, что
NewsModule
действительно загружается лениво. Для этого проверьте настройки вашего маршрутизатора и убедитесь, что путь к модулю настроен корректно. Если модуль загружается в начальный пакет, возможно, маршруты выполняются некорректно.
- Убедитесь, что
-
Импорт компонентов в модули:
- Проверяйте, как вы импортируете компоненты в вашем модуле. Если вы используете
@NgModule
вместе с компонентами, убедитесь, что они не включены вdeclarations
. Для отдельного компонента эта практика не требуется, если он используется только через роутер.
- Проверяйте, как вы импортируете компоненты в вашем модуле. Если вы используете
-
Обновления и баги Angular:
- Поскольку используется Angular 18, проверьте наличие последних обновлений или известных ошибок в рамках версии. Иногда проблемы с оптимизацией пакетов могут быть связаны с конкретными версиями. Сложите свои зависимости в
package.json
, затем выполнитеnpm update
, чтобы обновить все библиотеки.
- Поскольку используется Angular 18, проверьте наличие последних обновлений или известных ошибок в рамках версии. Иногда проблемы с оптимизацией пакетов могут быть связаны с конкретными версиями. Сложите свои зависимости в
-
Обратите внимание на импорт и использование:
- Убедитесь, что компоненты действительно используются в шаблонах и не включены в случайные импорты других компонентов, которые могут их тянуть в начальный пакет. Если компонент используется внутри других компонентов, но не является их первоначальным зависимым компонентом, он может быть загружен.
-
Проверьте использование Directive:
- В вашем компоненте
NewsItemComponent
используется директиваMiddleClickDirectiveDirective
. Проверьте, не организует ли эта директива какой-либоdeclaration
, который может повлиять на загрузку. Если директива является штатной и не используется напрямую в других местах приложения, это может привести к ненужной загрузке.
- В вашем компоненте
-
Профилирование с использованием Angular DevTools:
- Используйте инструменты для профилирования, такие как Angular DevTools, чтобы проанализировать, какие именно компоненты загружаются. Это даст более глубокое понимание структуры вашего приложения и поможет установить, какие именно зависимости входят в начальный пакет.
Заключение
Оптимизация начального пакета является критически важной для производительности приложений на Angular. Обратите внимание на способы импорта и использование маршрутов, а также на их взаимодействие с компонентами, чтобы минимизировать ненужные зависимости и достижения. Регулярно профилируйте ваше приложение, особенно при внесении изменений, чтобы избежать ненужной нагрузки при загрузке страниц. Успехов в оптимизации вашего Angular приложения!