Angular AOT скомпилированное приложение не трясет дерево, как ожидалось
У меня есть модуль (MyCommonModule
) с общими компонентами, службами и т. д., которые я планирую разделить между различными угловыми приложениями.
Это пример простого приложения, которое только импортирует MyCommonModule
(но не ссылается ни на что из этого в AppComponent
еще):
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { MyCommonModule } from "../common";
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
MyCommonModule.forRoot()
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
MyCommonModule
определяется так:
import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
// Components
import { SomeComponent } from "./components/some.component";
export * from "./components/some.component";
// Directives
import { SomeDirective } from "./directives/some.directive";
export * from "./directives/some.directive";
// Services
import { SomeService } from "./services/some.service";
export * from "./services/some.service";
// Models
export * from "./models/some.model";
@NgModule({
imports: [
CommonModule
],
declarations: [
SomeComponent,
SomeDirective
],
providers: [],
exports: [
SomeComponent,
SomeDirective
]
})
export class MyCommonModule {
public static forRoot(): ModuleWithProviders {
return {
ngModule: MyCommonModule,
providers: [
SomeService
]
};
}
}
Когда я бегу ng build --environment=prod --target=production
Я получаю сборку, которая является AOT:d. Если я проанализирую вывод с помощью source-map-explorer
Я вижу, что в результате main.*.bundle.js
а также vendor.*.bundle.js
содержит все услуги и компоненты (и их ссылки) в MyCommonModule
хотя я не использовал ничего из этого в своем приложении.
Это ожидаемое поведение? Дрожание дерева даже включено для приложений angular cli?
2 ответа
"шейкер дерева" просматривает граф зависимостей сверху вниз и вытряхивает неиспользуемый код, как мертвые листья в дереве. Если ваш AppModule импортирует MyCommonModule, "шейкер дерева" не может знать, действительно ли вы его используете (в терминах JavaScript вы используете этот код)
Кроме того, попробуйте следующее, как только вы решили свою проблему:
ng build -prod --build-optimizer=true
(пока не могу добавлять комментарии, но это может быть полезно)