У меня есть модуль (MyCommonModule
) с общими компонентами, службами и т. Д., Который я планирую использовать в разных приложениях angular.
Это пример простого приложения, которое импортирует только 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?
MyCommonModule
вAppModule
, аMyCommonModule
импортируете все свои службы и компоненты. Если я правильно понимаю, встряхивание дерева работает на уровне модуля ES6, а не на уровне Angular - если вы куда-то импортируете модуль, его не вытряхнут. Будет удалено только то, что не импортировано в ваш код. - person Joe Clay   schedule 27.06.2017