8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Angular] ブートストラップ - @NgModuleとは何か (3)

Posted at

@NgModuleとはなんなのかを知るシリーズ3回目です。
今回はBootstrappingの勝手訳です。

今回の記事を理解するのに、以下の知識を前提としています。
JavaScriptのモジュール - @NgModuleとは何か (1)
JavaScriptモジュール vs. NgModule - @NgModuleとは何か (2)

前段

NgModuleは、アプリケーションの各部位がどのように協調するかを記述しています。全てのアプリケーションには、常に最低ひとつのrootモジュールがあります。rootモジュールがアプリケーションを起動するブートストラップです。慣例により、これをAppModuleと名付けます。

Angular CLIを使ってアプリケーションを新規作成すると、デフォルトでは下記のようなファイルができあがります。1

app.module.ts
/*
JavaScriptモジュールをインポートしています。
*/
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';

/*
@NgModule修飾子がついたAppModuleクラスです。
*/
@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

JavaScriptのインポートに続いて、@NgModuleがついたAppModuleクラスがあります。

@NgModule修飾子の存在が、クラスをNgModuleとして認識させます。@NgModule内のメタデータが、アプリケーションがどのようにコンパイルして起動されるかを示します。

  • declarations — このアプリケーションのたったひとつのコンポーネントです。
  • importsBrowserModuleをインポートしています。BrowserModuleは、DOMレンダリング、サニタイズ、locationといったブラウザに特化したサービスを持ちます。
  • providers — サービスプロバイダです。
  • bootstrap — Angularが生成するrootコンポーネントです。index.htmlウェブページに挿入されます。

CLIによって自動生成されたコンポーネントが、declarationsbootstrapに列挙されています。

declarations配列

declarations配列は、Angularにモジュールの支配下にあるコンポーネントがなんであるかを教えます。新しいコンポーネントを作成したら、declarationsに追加しないといけません。

declarationsに記述せずにコンポーネントを使おうとすると、エラーメッセージが出力されます。

declarations配列には、宣言可能なクラスのみを列挙できます。宣言可能なクラスとは、コンポーネント、ディレクティブ、パイプです。宣言可能なクラスが属することができるのは、一つのモジュールだけです。ひとつの宣言可能なクラスを異なるモジュールに追加するとエラーとなります。

宣言可能なクラスは、そのモジュール内からのみ見えます。他のモジュールからは見えません。他のモジュールから見えるようにするには、そのモジュールからエクスポートし、他のモジュールでインポートします。

@NgModuleでディレクティブを使う

ディレクティブ、コンポーネント、パイプを使うには、いくつかやることがあります。

  1. それを書いたファイルからエクスポートする。
  2. 適切なモジュールファイルでインポートする。
  3. @NgModuledeclarationsに追加する。

順番に見ていきます。

クラスをエクスポート

@Directiveを付けたクラスファイルを作成し、エクスポートします。

src/app/item.directive.ts
import { Directive } from '@angular/core';

@Directive({
  selector: '[appItem]'
})
export class ItemDirective {
// code goes here
  constructor() { }

}

クラスをインポート

NgModuleがあるファイルにインポートします。

src/app/app.module.ts
import { ItemDirective } from './item.directive.ts'

declarationsに追加

@NgModule修飾子のdeclarations配列に追加します。

src/app/app.module.ts
  declarations: [
    AppComponent,
    ItemDirective
  ],

imports配列

このモジュール内のコンポーネントから参照されるコンポーネント、ディレクティブ、パイプをエクスポートしているモジュールを列挙します。今回のケースでは、AppComponentBrowserModuleのコンポーネント、ディレクティブ、パイプを参照しています。

provider配列

アプリケーションが必要とするサービスを列挙します。ここで列挙されたサービスは、アプリケーション全体から使うことができます。詳しくはProvidersへ。

bootstrap配列

アプリケーションはroot AppModuleをブートストラップして起動します。ブートストラッププロセスはbootstrap配列に列挙されたコンポーネントを作成し、ブラウザのDOMに挿入します。

各ブートストラップコンポーネントは、そのコンポーネント自身が持つコンポーネントツリーの根元となります。

複数のコンポーネントツリーを配置することもできますが、ほとんどのアプリケーションはただひとつのコンポーネントツリーしか持たず、単一のコンポーネントをブートストラップします。

  1. Angular CLI 6.0.6で生成

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?