前回作成したコンポーネントがAppModule
に登録されているので、SharedModule
を作成してそちらに登録するように変更します。
これは後からモジュールを作成するパターンになりますが、一般的には先にモジュールを作成する方が多いため、今後使用するUserModule
も作成しておきます。
モジュールとは
Angularのモジュールは、アプリケーションの一部を構成し、関連するコンポーネント、ディレクティブ、パイプ、サービスなどをグループ化するコンテナです。モジュールはアプリケーションの機能を整理し、再利用しやすくする役割を果たします。
特に、Angularのモジュールは@NgModule
デコレータを使用して定義され、以下の主要なメタデータプロパティを持ちます:
declarations
: モジュール内で使用されるコンポーネント、ディレクティブ、パイプを宣言します。imports
: 他のモジュールがエクスポートしたクラスを使用できるように、このモジュールが他のモジュールに依存していることを指定します。exports
: 他のモジュールで使用できるように、宣言されたクラスの一部をエクスポートします。providers
: アプリケーション全体で使用できるサービスのプロバイダーを登録します。bootstrap
: アプリケーションの起点となるルートコンポーネントを指定します。
モジュールを作成する
モジュールを作成するにはng generate module
コマンドを使用します。
--dry-run
オプション
モジュールを作成する前に--dry-run
オプションについて確認しておきましょう。
--dry-run
オプションはコマンドを実行せずに、コマンドで作成・更新される内容を確認できるオプションです。前回のようにコンポーネントを指定する際に、app
から指定すればいいのかapp
の下から指定すればいいのか迷うことがあると思います。このような場合には、--dry-run
オプションでどんなファイルが作成されてどんなファイルが更新されるかを確認するとよいでしょう。
$ ng generate module shared --dry-run
CREATE src/app/shared/shared.module.ts (192 bytes)
NOTE: The "--dry-run" option means no changes were made.
実際に実行してみると、作成されるモジュールのパスと名前が確認でき、「NOTE: The “–dry-run” option means no changes were made.」と変更がなかった旨のメッセージ表示されています。
SharedModule
はルーティングを必要としない共通コンポーネント・サービス等をまとめたモジュールですので、--routing
オプションなしで実行します。
では、--dry-run
なしで実行しましょう。
$ ng generate module shared
CREATE src/app/shared/shared.module.ts (192 bytes)
気づいたかもしれませんが、コンポーネントのときとは違ってモジュールクラスのファイルが作成された以外に更新されたファイルなどはありません。すなわち、作成したモジュールが自動的にどこかのモジュールに自動登録されることはありません。
まずはSharedModule
を修正します。まずは修正前の状態を確認しておきましょう。
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
@NgModule({
declarations: [],
imports: [
CommonModule
]
})
export class SharedModule { }
前回作成したTitleComponent
を追加していきます。モジュールに属するコンポーネント、ディレクティブ、パイプはdeclarations
に記載します。加えて、他のモジュールに公開するためにexports
に記載します。
修正後のモジュールが以下のようになります。
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { TitleComponent } from './components/title/title.component';
@NgModule({
declarations: [TitleComponent],
imports: [CommonModule],
exports: [TitleComponent],
})
export class SharedModule {}
次にAppModule
を修正します。これまではTitleComponent
をapp.component.html
で使用するためにAppModule
に登録していました。
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { TitleComponent } from './shared/components/title/title.component';
@NgModule({
declarations: [AppComponent, TitleComponent],
imports: [BrowserModule],
providers: [],
bootstrap: [AppComponent],
})
export class AppModule {}
今後は、SharedModule
をインポートすることでTitleComponent
を使用できるようにします。まずはdeclarations
からTitleComponent
を削除し、その代わりにimports
にTitleComponent
が登録されているSharedModule
を追加します。
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { SharedModule } from './shared/shared.module';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, SharedModule],
providers: [],
bootstrap: [AppComponent],
})
export class AppModule {}
実際に動作するか確認してみましょう。http://localhost:4200/にアクセスし、これまでどおり
のように表示されれば正しく修正できています。
UserModuleを作成する
次に今後使用するUserModule
を作成します。
モジュール名は単数形か複数形か
結論からいうと、チームによって異なります。これは個人的な見解となりますが、単数形と複数形で意味が異なる単語もあるため、単数形で書くことを基本にして複数形の意味を使いたい場合は複数形を使用する、というのがよいのではないかと考えています。
モジュールを作成する
ではUserModule
を作成します。今回はルーティングを伴うモジュールとするため、--routing
オプションを使用します。また、今回は省略形であるng g m
コマンドで実行します。--dry-run
オプションをつけて確認しましょう。
$ ng g m user --routing --dry-run
CREATE src/app/user/user-routing.module.ts (247 bytes)
CREATE src/app/user/user.module.ts (272 bytes)
NOTE: The "--dry-run" option means no changes were made.
app
ディレクトリの下にuser
ディレクトリが作成され、user.module.ts
が作成されます。加えて、ルーティングモジュールであるuser-routing.module.ts
も作成されることが確認できます。
期待したとおりに作成されることを確認できたので、--dry-run
オプションを外して実行します。
$ ng g m user --routing
CREATE src/app/user/user-routing.module.ts (247 bytes)
CREATE src/app/user/user.module.ts (272 bytes)
UserModuleは現時点ではコンポーネントなど何も属していないのでこのままにしておきます。とりあえず作成したコードだけ確認しておきます。
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { UserRoutingModule } from './user-routing.module';
@NgModule({
declarations: [],
imports: [
CommonModule,
UserRoutingModule
]
})
export class UserModule { }
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class UserRoutingModule { }
これまでに作成したモジュールとは異なり、user-routing.module.ts
にはroutes
という定数があります。使い方については今後確認していきます。
変更をコミット&プッシュする
毎度のことですが、ここまでの変更をコミット&プッシュします。
$ git add .
$ git commit -m 'create SharedModule and UserModule'
✔ Preparing lint-staged...
✔ Running tasks for staged files...
✔ Applying modifications from tasks...
✔ Cleaning up temporary files...
[main ed5311a] create SharedModule and UserModule
4 files changed, 33 insertions(+), 3 deletions(-)
create mode 100644 src/app/shared/shared.module.ts
create mode 100644 src/app/user/user-routing.module.ts
create mode 100644 src/app/user/user.module.ts
$ git push
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 10 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (10/10), 1.12 KiB | 1.12 MiB/s, done.
Total 10 (delta 5), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (5/5), completed with 4 local objects.
To github.com:t0k0sh1/angular-tutorial.git
90cd6c9..ed5311a main -> main
まとめ
今回はSharedModule
を作成し、TitleComponent
をAppModule
からSharedModule
に移しました。今後は共通コンポーネントはSharedModule
に登録していくことにします。
また、今後に備えてルーティング設定をもったUserModule
も作成しました。こちらは今後使用していきます。
次回は画面にメッセージを表示するコンポーネントの作成を通じてサービスを使ったコンポーネント間のデータの受け渡しについて見ていきます。