69. NgModule — スタンドアロン以前のアプリの骨組み
ここからのセクションは、これまでと目的が少し違います。書けるようになるためではなく、読めるようになるためのレッスンです。スタンドアロンコンポーネントが標準になる前、Angularには長い「NgModule時代」があり、現場で動いている既存コードや検索で出てくる記事の多くは、いまもその時代の書き方です。まずはその中心にあるNgModuleから読み解きます。当時は、コンポーネントもパイプもサービスも、必ずどこかのNgModuleに登録しないと使えませんでした。
@NgModule デコレータを付けたクラスがモジュールです。読み方のコツは4つの配列に注目すること。declarations は「このモジュールが所有するコンポーネント・ディレクティブ・パイプ」、imports は「他のモジュールから機能を借りる」、providers は「DIに登録するサービス」、exports は「他のモジュールへ貸し出すもの」です。あるコンポーネントがテンプレートで使っている部品の出どころを探すときは、自分が declarations されているモジュールの imports をたどる、というのが基本の追跡ルートになります。
スタンドアロンとの対応も押さえましょう。standalone なコンポーネントの imports 配列は、NgModule が担っていた「使う部品の宣言」を各コンポーネントが自分で持つようにしたものです。移行中のプロジェクトでは両者が混在し、NgModule 側から standalone コンポーネントを imports することもその逆もできます。「declarations に見つからない部品は standalone かもしれない」と知っていれば、混在コードでも迷子になりません。
サンプルコード(フレームワーク環境が必要なため表示のみ)
// 典型的な NgModule 時代のコード(読めればOK、新規では書かない)
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { CommonModule } from '@angular/common';
@NgModule({
// このモジュールが所有する部品(ここに無ければ他モジュールか standalone)
declarations: [AppComponent, UserListComponent, YenPipe],
// 他から機能を借りる(CommonModule は *ngIf などの提供元)
imports: [BrowserModule, CommonModule, UserRoutingModule],
// DIへの登録(現代の providedIn: 'root' が主流になる前の形)
providers: [UserService],
// アプリの起動起点(AppModule にだけある)
bootstrap: [AppComponent],
})
export class AppModule {}
学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。
公式ドキュメントで詳しく ↗