Angular の NgModuleがよくわからなかったので整理した

投稿日:2020年08月25日

Tags: Angular Vue 初心者向け

Vue.js / Nuxt.js をちょこっとだけ触っていた自分が、一身上の都合により Angular を触ることになったものの、わからないことだらけだったので整理します。

NgModule

アプリケーションに必要なコンポーネント、サービスなどをまとめたり、他の NgModule で使えるようにするために @NgModule デコレーターで装飾されたファイルです。
アプリケーションには必ず一つ以上のモジュールが必要です。
規模が小さいアプリケーションなら一つのモジュールで事足りるらしいですが、業務アプリケーションとなると、規模が大きいことがほとんどだと思うので、複数の NgModule で構成されていると思います。

NgModule には下記の5つの重要なプロパティがあります。

  • declarations
  • exports
  • providers
  • imports
  • bootstrap

順を追って説明します。

declarations

モジュールに含まれるそれぞれ自作したコンポーネント、ディレクティブ、パイプを設定します。
ここに追加しておけばモジュール内から参照できます。

コンポーネント

@Component()デコレーターでラップされているクラスのファイル一式。
ビューを定義するHTMLテンプレートとかアプリケーションのロジックを含むクラスが含まれます。

ディレクティブ

属性ディレクティブと構造ディレクティブがあります。
属性ディレクティブはDOMの構造を変更し、属性ディレクティブはページ要素の動作と外観を変更できます。
代表的な構造ディレクティブには ngIf とか ngFor があります。
代表的な属性ディレクティブには ngStylengClassngModel があります。

@Directive() デコレーターを使うことでディレクティブを自作することができます。

Vue.js にもあった v-on とか v-bind もディレクティブです。
html タグにそれぞれのJSフレームワーク独自の属性を渡すのはだいたいディレクティブになります。

構造ディレクティブ Vue => Angular

  • v-if => ngIf
  • v-for => ngFor

属性ディレクティブ Vue => Angular

  • v-model => ngModel
  • v-bind:class => ngClass
  • v-bind:style => ngStyle

パイプ

Vue.js のv2系でいうところの filter にあたると思います。
テンプレート上に表示されるデータを加工整形することができます。

{{ price | currency:'JPY' }}
1

上記の場合 currency がパイプの本体で、JPY がパラメーターにあたります。

exports

モジュールに含まれている declarations 三点セット(コンポーネント、ディレクティブ、パイプ) を他の NgModule で使うときに、コンポーネント、ディレクティブ、パイプを挿入します。

providers

自作したサービスクラスを imports 先で使えるようにします(DIする)。
コンポーネント側に書くこともできます。
DI(依存性の注入)についてはよくわかってないので理解できたらまとめたいと思います。

imports

別のモジュール( NgModule で宣言したクラス)を取り込みます。
取り込んだモジュールの exports および providers に追加したものが取り込まれます。
declarations に追加するだけでは別のモジュールでは使えないです。

bootstrap

アプリケーションのルートコンポーネントを設定します。
基本的に src/app/app.module.ts だけに記載されます。

まとめ

一部、 Vue.js とも通じる部分はありますが、 Angular を触り始めて思ったのは Vue.js ではよしなにやっていてくれていた事でも自分自身でモジュールを import する必要があったりして、三大JSフレームワーク(VueReactAngular)の中では一番敷居が高いのもわかる気がしました。

参考

  • シェア:
Last Updated: 8/25/2020, 1:56:34 PM