![]()
Ng generate Component (standalone) の使い方と手順
Angular CLI を使用してスタンドアロンコンポーネントを生成する方法
このガイドでは、Angular CLI の ng generate component コマンドを使用してスタンドアロンコンポーネントを簡単に作成する方法を解説します。スタンドアロンコンポーネントは、特定のモジュールに依存せずに再利用できる強力な構成要素であり、アプリケーションの構造を簡素化するのに役立ちます。一般的な手順やオプション、およびその利点について詳しく説明します。
手順
スタンドアロンコンポーネントを作成するための基本的な手順は以下の通りです。
- Angular プロジェクトを作成または既存のプロジェクトを開きます。
 - ターミナルを開き、以下のコマンドを実行します。
 
ng generate component component-name --standalone
- 生成されたコンポーネントが 
src/appフォルダーに追加されることを確認します。 
コマンドの詳細
上記のコマンドには、以下のようなオプションを追加することができます。
| オプション | 説明 | 
|---|---|
--inline-template | 
テンプレートをインラインで作成します。 | 
--inline-style | 
スタイルをインラインで作成します。 | 
--style | 
使用するスタイルシートの言語を指定します(例: css, scss, sass, less)。 | 
スタンドアロンコンポーネントとは
スタンドアロンコンポーネントは、@Component.standalone フラグを true に設定したコンポーネントのことです。これにより、通常のコンポーネントと異なる点がいくつかあります。スタンドアロンコンポーネントは、以下の特徴を持っています。
主な特徴
- 宣言の不要性: スタンドアロンコンポーネントは 
@NgModule.declarationsプロパティで宣言する必要がありません。 - 依存関係の管理: 
@Component.importsプロパティでテンプレートの依存関係を管理できます。 - 相互インポート: 他のスタンドアロンコンポーネントや NgModule からインポート可能です。
 
コンパイルの仕組み
従来のコンポーネントでは、コンポーネントが自身のテンプレートをコンパイル可能かどうかは、宣言されている NgModule に依存します。しかし、スタンドアロンコンポーネントでは、テンプレートの依存関係を自身の @Component.imports プロパティで管理するため、テンプレートのコンパイルがより直感的に行えます。
@Component({
  selector: 'some-comp',
  standalone: true,
  template: `...`,
})
class SomeComp {}
@Component({
  selector: 'my-app',
  standalone: true,
  imports: [SomeComp],
  template: ` <some-comp></some-comp> `,
})
class AppComponent {}
仮想的な NgModule の理解
スタンドアロンコンポーネントは自身の依存関係を @Component.imports プロパティで管理し、他のコンポーネントや NgModule からもインポート可能です。スタンドアロンコンポーネントは、仮想的な NgModule を含むと考えると理解しやすいでしょう。つまり、スタンドアロンコンポーネントはコンポーネントであると同時に、そのコンポーネントだけを宣言した NgModule としても機能します。
依存関係の管理例
以下のコードスニペットは、スタンドアロンコンポーネントがどのように依存関係を管理できるかを示しています。
@Component({
  standalone: true,
  imports: [CommonModule],
})
class CompA {}
@Component({
  standalone: true,
  imports: [CompA],
})
class CompB {}
@NgModule({
  imports: [CompB],
})
class AppModule {}
スタンドアロンディレクティブ・パイプの定義
スタンドアロンコンポーネントと同様に、スタンドアロンディレクティブやパイプも定義できます。スタンドアロンディレクティブは @Directive.standalone プロパティを使用して定義します。
スタンドアロンディレクティブの例
@Directive({
  selector: '[some-dir]',
  standalone: true,
})
class SomeDir {}
スタンドアロンパイプも同様に定義できます。
スタンドアロンパイプの例
@Pipe({
  name: 'some-pipe',
  standalone: true,
})
class SomePipe implements PipeTransform {
  transform(value: any) {
    return value;
  }
}
実装例: リストコンポーネント
ここでは、スタンドアロンコンポーネントを使用した実装例として、リストコンポーネントを作成します。HTML 標準の <ul> と <li> タグのように、入れ子になった <app-list> タグと <app-list-item> タグを使用してリストを表現します。
HTML 構造
<app-list>
  <app-list-item>
    <span>Foo</span>
  </app-list-item>
  <app-list-item>
    <span>Bar</span>
  </app-list-item>
</app-list>
スタンドアロンコンポーネントの実装
@Component({
  selector: 'app-list-item',
  standalone: true,
  template: `<ng-content></ng-content>`,
})
class ListItemComponent {}
@Component({
  selector: 'app-list',
  standalone: true,
  template: `<ng-content select="app-list-item"></ng-content>`,
})
class ListComponent {}
使用例
これらのコンポーネントを使用する AppComponent は、次のように実装します。
@Component({
  selector: 'my-app',
  standalone: true,
  imports: [ListComponent, ListItemComponent],
  template: `
    <app-list>
      <app-list-item>
        <span>Foo</span>
      </app-list-item>
      <app-list-item>
        <span>Bar</span>
      </app-list-item>
    </app-list>
  `,
})
export class AppComponent {}
スタンドアロン宣言をまとめる方法
ListComponent と ListItemComponent は常にセットで使われるため、これらを直接インポートするのは手間です。スタンドアロン宣言をまとめるための2つの方法を紹介します。
1. スタンドアロン宣言を配列にまとめる
@Component.imports に配列を渡すことができます。
const appList = [ListComponent, ListItemComponent] as const;
@Component({
  selector: 'my-app',
  standalone: true,
  imports: [CommonModule, appList],
  template: `...`,
})
export class AppComponent {}
2. NgModule を利用した再エクスポート
スタンドアロン宣言を再エクスポートする NgModule を作成することもできます。
@NgModule({
  imports: [ListComponent, ListItemComponent],
  exports: [ListComponent, ListItemComponent],
})
class ListModule {}
@Component({
  selector: 'my-app',
  standalone: true,
  imports: [CommonModule, ListModule],
  template: `...`,
})
export class AppComponent {}
スタンドアロンコンポーネントの利点
スタンドアロンコンポーネントには以下のような利点があります:
- 依存性が少なく、容易に再利用可能。
 - アプリケーションの構造をシンプルに保てる。
 - モジュール間の結合度を減らし、テストが容易になる。
 
参考文献
さらに学びたい方には以下のリンクをお勧めします:
よくある質問 (FAQ)
- 質問1: スタンドアロンコンポーネントとは何ですか?
 - スタンドアロンコンポーネントは、特定のモジュールに依存せずに再利用可能で、独立して機能するコンポーネントです。
 - 質問2: スタンドアロンコンポーネントを作成するメリットは何ですか?
 - その利点にはモジュール間の結合度を減らし、依存性が少なくなることが含まれます。
 - 質問3: どのようにスタンドアロンコンポーネントを生成できますか?
 - Angular CLI の 
ng generate componentコマンドを使用して、--standaloneオプションを追加することで生成します。 
その他の参考記事:angular コンポーネント 追加