PR

Angular:モジュール@NgModuleの基本を1からわかりやすく

TypeScript

@NgModuleはAngularでモジュールを作成する際の宣言文のような役割を果たすデコレータです。@NgModuleを用いることで指定したクラスがモジュールであることを明示的に宣言します。

参考 Angularとは?

Q
モジュールとは?
A

モジュールとは関連するコードの集まりのこと。Angularにおけるモジュールは、コンポーネント、サービス、ディレクティブ、パイプなど、アプリケーションを構成する部品をまとめる役割を担います。

// 必要なAngularのコアモジュールをインポート
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

// アプリケーションが使用するコンポーネントをインポート
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent // アプリケーションのコンポーネントを宣言
  ],
  imports: [
    BrowserModule // ブラウザで動作するアプリケーションに必要なモジュールをインポート
  ],
  providers: [], // サービスプロバイダー(ここでは空)
  bootstrap: [AppComponent] // アプリケーションのルートコンポーネントを指定
})
export class AppModule { }

このページでは、Angular初心者の方向けにそもそもモジュールとは何か?という初歩の初歩から解説し、@NgModuleの意味と基本的な使い方を1からわかりやすくサンプルコード付きで解説します。

スポンサーリンク

Angularのモジュールとは?

Angularのモジュールは、レゴブロックのセットのようなものです。

レゴは1つひとつの小さなブロックを組み合わせて様々なものを組み立てていきますよね。たとえば、家を作る時には、窓のブロック、ドアのブロック、屋根のブロックなど、それぞれのパーツを組み合わせることで1つの家を作り上げることができます。レゴブロックに家を組み立てるためのブロックセットがあるように、Webページの一部分を作るために必要な「コンポーネント」や「サービス」などのパーツを1つにまとめたものとして、Angularのモジュールが存在します。

例えば、「プロフィールページ」というモジュールがあるとすると、このモジュールには「ユーザーの写真を表示するパーツ」「ユーザーの名前を表示するパーツ」「連絡先を表示するパーツ」などが含まれるかもしれません。これらのパーツを1つにまとめたものが「プロフィールページモジュール」です。

モジュールの必要性

大きなレゴの城を組み立てるとき、0から100までの全部を一度に組み立てようとすると大変です。(土台から天守閣までの一度に作成しようとすると、作業中に「いまは何をしていたっけ?」というように混乱してしまう・・・)

しかし、城の一部分ごとにセットを分けて、それぞれのセットを別々に組み立ててから、最後に全部をつなげるともっと簡単にできます。まずは、土台を作り、次に1階部分、2階部分として作成し、最後にそれぞれのブロックを連結させて作った方が簡単です。

Angularのモジュールも同じで、Webアプリケーションをいろいろなモジュール(セット)に分けることで、ひとつひとつをシンプルに作っていくことができます。そして、全部のモジュールが完成したら、それをつなげて一つの大きなウェブアプリケーションを完成させるようなイメージ。

このモジュールを作成するために利用するのが@NgModuleです。

Angular:@NgModuleデコレータ

@NgModuleはAngularのデコレータの一種で、指定したクラスをAngularモジュールとして識別します。@NgModuleは、モジュールのメタデータをAngularフレームワークに提供するために使用され、モジュールの振る舞いを定義します。

Q
モジュールのメタデータとは?
A

メタデータには、モジュールに属するコンポーネント、インポートされる他のモジュール、提供するサービス、アプリケーションの起動時に最初にロードするコンポーネントなどが含まれます。@NgModuleを使用することで、アプリケーションの構造をAngularに伝え、依存関係の注入、コンポーネントのスコープ、再利用可能な機能のグループ化などを実現します。

ひとまずここでは「モジュールはいろんな部品をまとめた1つの箱」のようなイメージを持てればOK。

言葉だけで説明されても、中々イメージは湧かないと思いますので、早速モジュールの作成方法~利用方法までをサンプルコード付きで解説していきます。

@NgModuleの構文ルール

@NgModuleデコレータは、クラス定義の直前に配置。デコレータは次のように使用します。

@NgModule({
  // プロパティ: 値
})
export class MyModule {}

@NgModuleデコレータのプロパティ

プロパティ説明
declarationsモジュール内で使用されるコンポーネント、ディレクティブ、パイプを宣言。これらはモジュール内でのみ参照可能。
imports現在のモジュールで必要とされる他のモジュールを指定。→インポートされたモジュールのコンポーネント、ディレクティブなどを使用できるようになる。
exports他のモジュールで使用できるようにするコンポーネント、ディレクティブ、パイプを指定。これらはdeclarationsで宣言されたもののサブセット。
providersモジュールで使用されるサービスのプロバイダーを指定。→サービスがモジュール内のすべてのコンポーネントで利用可能になります。
bootstrapアプリケーションの起動時にインスタンス化されるルートコンポーネントを指定。このプロパティは主にルートモジュールで使用される。
schemasテンプレートで使用されるカスタム要素や属性を許可するために使用。例えば、NO_ERRORS_SCHEMACUSTOM_ELEMENTS_SCHEMAがあります。
idモジュールのIDを指定します。これは通常、遅延ロードされるモジュールに使用されます。

これらのプロパティを使用して、Angularモジュールを定義し、アプリケーションの構造を整理することができます。

サンプルコード Angularモジュールの作成例

// 必要なAngularのコアモジュールをインポート
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

// アプリケーションが使用するコンポーネントをインポート
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent // アプリケーションのコンポーネントを宣言
  ],
  imports: [
    BrowserModule // ブラウザで動作するアプリケーションに必要なモジュールをインポート
  ],
  providers: [], // サービスプロバイダー(ここでは空)
  bootstrap: [AppComponent] // アプリケーションのルートコンポーネントを指定
})
export class AppModule { }

AppModuleはAngularのルートモジュールとして機能し、アプリケーションで最初にロードされるモジュールです。declarationsには、このモジュールが直接使用するAppComponentが含まれています。importsには、アプリケーションがブラウザで動作するために必要なBrowserModuleが含まれています。bootstrapには、アプリケーションの起動時に最初にロードされるコンポーネントが指定されています。

モジュールの使用

ここからは、具体的な例を用いて実際にモジュールを定義する方法を見ていきましょう。

サンプルシナリオ

アプリケーションに「ユーザー管理機能」と「注文管理機能」があるとします。これらの機能をそれぞれ別のモジュールで管理することにしました。UserModuleOrderModuleを作成し、それぞれに関連するコンポーネントやサービスをグループ化します。

ステップ 1: 機能モジュールの作成

UserModuleには、ユーザー一覧を表示するUserListComponentとユーザーの詳細を表示するUserDetailComponentが含めます。

// src/app/user/user.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { UserListComponent } from './user-list.component';
import { UserDetailComponent } from './user-detail.component';

@NgModule({
  declarations: [UserListComponent, UserDetailComponent],
  imports: [CommonModule],
  exports: [UserListComponent] // UserListComponentを外部に公開
})
export class UserModule {}

同様に、OrderModuleには注文一覧を表示するOrderListComponentを含めます。

// src/app/order/order.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OrderListComponent } from './order-list.component';

@NgModule({
  declarations: [OrderListComponent],
  imports: [CommonModule],
  exports: [OrderListComponent] // OrderListComponentを外部に公開
})
export class OrderModule {}

ステップ 2: モジュールの利用

AppModule(ルートモジュール)でUserModuleOrderModuleを利用することにします。これにより、アプリケーション全体でユーザー管理と注文管理の機能が使えるようになります。

// src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { UserModule } from './user/user.module'; // UserModuleをインポート
import { OrderModule } from './order/order.module'; // OrderModuleをインポート

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    UserModule, // AppModuleにUserModuleを追加
    OrderModule // AppModuleにOrderModuleを追加
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

このように、Angularモジュールは「呼び出し」されるものではなく、アプリケーションの構造を定義し、コードを機能単位で整理するために「利用」されます。ルートモジュール(AppModule)または他の機能モジュール内でモジュールをインポートすることにより、そのモジュールが提供する機能(コンポーネント、サービスなど)をアプリケーションの他の部分で使用できるようになります。

まとめ モジュールとは?

  • アプリケーションの一部を機能ごとにまとめたコードの集合体。
  • コンポーネント、サービス、ディレクティブ、パイプなどをグループ化し、機能単位で管理する。
  • アプリケーションの構造を整理し、コードの再利用性とメンテナンス性を向上させる。

まとめ @NgModuleとは?

  • Angularのデコレーターで、クラスをAngularモジュールとして識別する。
  • モジュールのメタデータを定義し、コンポーネントのスコープや依存関係の注入を管理する。
  • アプリケーションの起動時に最初にロードするコンポーネント(bootstrap)、他のモジュールから利用可能にするエクスポート(exports)など、モジュールの振る舞いをAngularに伝える。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
TypeScriptWEBデザイン
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました