Angular CLI でサービスを生成する場合、Injectable デコレータのデフォルトが 'root' である 'provided in' プロパティを使用して追加のメタデータが追加されます。
@Injectable({
providedIn: 'root',
})
providedIn は具体的に何をするのでしょうか? これは、アプリケーション全体に対して「グローバル」タイプのシングルトン サービスのようにサービスを利用できるようにするものだと想定していますが、そのようなサービスを AppModule のプロバイダー配列で宣言する方がきれいではないでしょうか?
ベストアンサー1
providedIn: 'root'
Angular 6 以降、サービスを提供する最も簡単で効率的な方法です。
- このサービスは、モジュールのプロバイダー配列に追加する必要なく、シングルトンとしてアプリケーション全体で利用できるようになります (Angular <= 5 など)。
- サービスが遅延ロードされたモジュール内でのみ使用される場合、そのモジュールとともに遅延ロードされます。
- 一度も使用されない場合は、ビルドには含まれません (ツリーがシェイクされます)。
さらに詳しい情報については、ドキュメントとNgModule FAQを参照してください。
ちなみに:
- アプリケーション全体のシングルトンが必要ない場合は、代わりにプロバイダーのコンポーネントの配列を使用します。
- 特定のモジュールの外部で他の開発者がサービスを使用しないようにスコープを制限する場合は、
providers
代わりに NgModule の配列を使用します。