Tree-Shakable Providers — это современный способ регистрации сервисов в Angular, который позволяет сборщику (Webpack/Rollup) исключать неиспользуемый код из финального бандла через механизм tree-shaking.
Классический способ регистрации сервисов:
@NgModule({
providers: [MyService] // или { provide: MyService, useClass: MyService }
})
export class AppModule {}
Недостатки:
Angular предоставляет два современных подхода:
@Injectable({
providedIn: 'root' // или конкретный модуль
})
export class MyService {}
Принцип работы:
export const APP_CONFIG = new InjectionToken<Config>('app.config');
bootstrapApplication(AppComponent, {
providers: [
provide(MyService, {
useClass: MyServiceImpl
}),
{ provide: APP_CONFIG, useValue: config }
]
});
Автоматическое tree-shaking:
Улучшенная инжекция зависимостей:
Оптимизация производительности:
До (традиционный подход):
@NgModule({
providers: [LoggerService] // Всегда в бандле
})
export class AppModule {}
@Component(...)
export class MyComponent {
constructor(private logger: LoggerService) {} // Используется
}
После (tree-shakable):
@Injectable({ providedIn: 'root' })
export class LoggerService {} // Только если используется
// Если ни один компонент не инжектит LoggerService - его не будет в бандле
Условия для tree-shaking:
@Injectable()
"module": "esnext"
Когда не сработает:
injector.get()
)Scope варианты:
providedIn: 'root'
- Singleton на все приложениеprovidedIn: MyModule
- Локальный для модуляprovidedIn: 'platform'
- Для мульти-приложенийTree-Shakable Providers — это:
@Injectable({providedIn: 'root'})
Используйте этот подход для:
Переход на tree-shakable providers может уменьшить размер вашего бандла на 10-30% в зависимости от количества неиспользуемых сервисов!