Как вы, наверное, знаете, когда мы добавляем службу в объявление @NgModule(), это будет Синглтон. Это означает, что он будет жить, пока живет наше приложение. Например:

export class AdminService {
  data = Array(10000).fill(dummy);
}
@NgModule({
  providers: [AdminService, AdminDataService]
})

Я вижу много людей, чье первое желание - просто поместить все свои услуги в @NgModule() объявления, не задумываясь о последствиях. Проблема в том, что:

Вы не освобождаете память

Хотя, наверное, тебе эта память больше не нужна. Давайте остановимся на секунду и подумаем, действительно ли нам нужен этот сервис, чтобы быть широким синглтоном приложения?

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

Нам не нужно, чтобы этот сервис был синглтоном. Нам не нужен слой кеширования, и никому из этой вкладки не нужны данные с него.

Единственная цель службы - обмен данными между дочерними компонентами и предоставление нескольких вспомогательных методов.

Итак, мы вставляем его в поставщиков компонентов и делаем его не-одиночным сервисом.

@Component({
  selector: 'admin-tab',
  providers: [AdminService, AdminDataService]
})

Преимущество заключается в том, что когда Angular уничтожает компонент, Angular также уничтожает службу и освобождает память, которая занята им.

Крюк OnDestroy

Многие разработчики этого не знают, но у не-одиночных сервисов также есть ngOnDestroy() крючок жизненного цикла. Вы можете использовать его для чистки.

export class AdminService implements OnDestroy {
  ngOnDestroy() {
    // Clean subscriptions, intervals, etc
  }  
}

Также, если мы вызываем NgModuleRef.destroy() или PlatformRef.destroy(), то метод ngOnDestroy одноэлементных провайдеров также будет выполнен. Спасибо Алексею Зуеву за комментарий.

Подпишитесь на меня в Medium или Twitter, чтобы узнать больше об Angular, Vue и JS!

👂🏻 И последнее, но не менее важное: слышали ли вы об аките?

Акита - это модель управления государством, которую мы разработали здесь, в Datorama. Он успешно используется в среде производства больших данных более семи месяцев, и мы постоянно добавляем в него функции.

Акита поощряет простоту. Он избавляет вас от хлопот по созданию шаблонного кода и предлагает мощные инструменты с умеренной кривой обучения, подходящие как для опытных, так и для неопытных разработчиков.

Я очень рекомендую это проверить.