Angular の ng generate コマンド詳解

皆様こんにちは、あるいはこんばんは、みじんこきなこです。

CoWaASというサービスを鋭意開発中の私ですが、フロントエンドとしてAngularを使用しています。

Angularは公式マニュアルがしっかりしていて非常に良いのですが、しっかりしすぎていてng generateコマンド一つとっても何ができるか全容を把握するのに少し時間を要するので、自身のチートシート作成も兼ねて記事にします。

今回は、Gemini 1.5pro with Deep Researchさんに敲き台を作っていただきました。


はじめに

Angular は、Google によって開発された、フロントエンドフレームワークです。コンポーネントベースのアーキテクチャを採用し、大規模で複雑なウェブアプリケーションの開発に適しています。

Angular CLI (Command Line Interface) は、Angular アプリケーションの開発を支援する強力なツールであり、その中核をなすのが ng generate コマンドです。

ng generate コマンドは、schematic と呼ばれるテンプレートに基づいて、コンポーネント、サービス、モジュールなど、さまざまなコードを自動生成します。schematic を使用することで、コードスタイルや構造に一貫性を持たせ、保守性の高いプロジェクトを実現できます。

この記事では、Angular 19 の ng generate コマンドで使用できるすべてのオプションと schematic について、詳細な説明と生成されるものの解説、仕様サンプルコード付きで解説します。

ng generate コマンドの概要

ng generate コマンドは、Angular CLI で提供されるコード生成コマンドです。このコマンドを使用することで、Angular アプリケーションの開発に必要なさまざまなファイルを自動的に生成することができます。

ng generate コマンドの基本的な構文は以下のとおりです。

ng generate <schematic> <name> [options]

<schematic> は、生成するファイルの種類を指定します。例えば、コンポーネントを生成する場合は component、サービスを生成する場合は service を指定します。

<name> は、生成するファイルの設定を指定します。例えば、ファイル名やパス、テンプレートの形式などを指定することができます。

[options]は、ng generate コマンドで使用できるオプションを指定します。例えば、テストファイルを生成しない、既存のファイルを上書きする、モジュールに追加するなどのオプションを指定することができます。

ng generate で使用できる schematic 一覧

  • application

    • 新しい Angular アプリケーションを生成します。

  • app-shell

    • サーバーサイドレンダリング用のアプリケーションシェルを生成します。

  • component

    • 新しいコンポーネントを生成します。

  • enum

    • 新しい列挙型を生成します。

  • guard

    • 新しいガードを生成します。

  • interceptor

    • 新しいインターセプターを生成します。

  • interface

    • 新しいインターフェースを生成します。

  • module

    • 新しいモジュールを生成します。

  • pipe

    • 新しいパイプを生成します。

  • service

    • 新しいサービスを生成します。

  • serviceworker

    • サービスワーカーを生成します。

  • webworker

    • 新しい Web Worker を生成します。

  • environments

    • アプリケーションの環境設定ファイルを生成または更新します。

ng generate で使用できるオプション

ng generate コマンドでは、さまざまなオプションを指定することができます。

  • --dry-run

    • 実際にファイルを生成せずに、生成されるファイルの一覧を表示します。このオプションを使用することで、コマンドを実行する前に生成されるファイルを確認し、意図しない変更を防ぐことができます。

ng generate component my-component --dry-run
  • --force

    • 既存のファイルを上書きします。

ng generate component my-component --force
  • --skip-tests

    • テストファイルを生成しません。

ng generate component my-component --skip-tests
  • --minimal

    • spec ファイルを生成せずにコンポーネントを生成します。

ng generate component my-component --minimal
  • --flat

    • 現在のディレクトリにファイルを直接生成します。

ng generate component my-component --flat
  • --module

    • 生成するファイルを指定したモジュールに追加します。

ng generate component my-component --module=app.module.ts
  • --project

    • 生成するファイルのプロジェクトを指定します。

ng generate component my-component --project=my-project

ng generate で使用できる schematic 詳細

application

新しい Angular アプリケーションを生成します。

使用方法:

ng generate application my-app

生成されるファイル:

新しい Angular アプリケーションに必要なファイル一式が生成されます。主なファイルは以下のとおりです。

  • src/app/app.module.ts: アプリケーションのルートモジュール

  • src/app/app.component.ts: アプリケーションのルートコンポーネント

  • src/index.html: アプリケーションの HTML エントリポイント

  • angular.json: アプリケーションの設定ファイル

  • package.json: アプリケーションの依存関係を管理するファイル

ベストプラクティスと注意点:

  • アプリケーション名は、英小文字とハイフン (-) を使用して命名することを推奨します。

  • 生成されたアプリケーションは、ng serve コマンドでローカルサーバーを起動して動作確認することができます。

class

新しいクラスを生成します。

使用方法:

ng generate class my-class

生成されるファイル:

  • my-class.ts: 指定した名前のクラスを定義した TypeScript ファイル

サンプルコード:

// my-class.ts
export class MyClass {
  constructor(public name: string) { }  
}

ベストプラクティスと注意点:

  • クラス名は、PascalCase (単語の先頭を大文字にする) で命名することを推奨します。

  • クラスは、オブジェクト指向プログラミングの基本的な構成要素であり、データとメソッドをカプセル化するために使用されます。

component

新しいコンポーネントを生成します。コンポーネントは、Angular アプリケーションの UI を構成する基本的な要素です。HTML テンプレート、CSS スタイル、TypeScript クラスから構成され、再利用可能な UI 部品として機能します。

使用方法:

ng generate component my-component

生成されるファイル:

  • my-component.component.ts: コンポーネントの TypeScript クラス

  • my-component.component.html: コンポーネントの HTML テンプレート

  • my-component.component.css: コンポーネントの CSS スタイル

  • my-component.component.spec.ts: コンポーネントのテストファイル

サンプルコード:

// my-component.component.ts`  
import { Component } from '@angular/core';

@Component({  
  selector: 'app-my-component',  
  templateUrl: './my-component.component.html',  
  styleUrls: ['./my-component.component.css']  
})  
export class MyComponent {  
  title = 'my-component';  
}
<h1>{{ title }}</h1>

ベストプラクティスと注意点:

  • コンポーネント名は、ケバブケース (英小文字とハイフン (-) を使用) で命名することを推奨します。

  • コンポーネントは、Angular アプリケーションの UI を構築するための基本的なビルディングブロックです。

  • @Component デコレータを使用して、コンポーネントのメタデータを定義します。

  • selector プロパティは、コンポーネントを HTML で使用するためのセレクタを指定します。

  • templateUrl プロパティは、コンポーネントの HTML テンプレートを指定します。

  • styleUrls プロパティは、コンポーネントの CSS スタイルを指定します。

使用例:

ユーザーリストを表示するコンポーネントを生成する場合、以下のようにコマンドを実行します。

ng generate component user-list

directive

新しいディレクティブを生成します。ディレクティブは、DOM 要素の外観や動作を変更するために使用されます。属性ディレクティブと構造ディレクティブの 2 種類があります。

使用方法:

ng generate directive my-directive

生成されるファイル:

  • my-directive.directive.ts: ディレクティブの TypeScript クラス

  • my-directive.directive.spec.ts: ディレクティブのテストファイル

サンプルコード:

// my-directive.directive.ts`  
import { Directive, ElementRef } from '@angular/core';

@Directive({ 
  selector: ''
})
export class MyDirective {
  constructor(private el: ElementRef) {
    el.nativeElement.style.backgroundColor = 'yellow';
  }
}

ベストプラクティスと注意点:

  • ディレクティブ名は、キャメルケース (先頭小文字、以降単語の先頭を大文字) で命名することを推奨します。

  • 属性ディレクティブは、DOM 要素の属性として使用されます。

  • 構造ディレクティブは、DOM 要素の構造を変更するために使用されます。

  • @Directive デコレータを使用して、ディレクティブのメタデータを定義します。

  • selector プロパティは、ディレクティブを HTML で使用するためのセレクタを指定します。

使用例:

要素にハイライト効果を追加する属性ディレクティブを生成する場合、以下のようにコマンドを実行します。

ng generate directive highlight

enum

新しい列挙型を生成します。

使用方法:

ng generate enum my-enum

生成されるファイル:

  • my-enum.ts: 指定した名前の列挙型を定義した TypeScript ファイル

サンプルコード:

// my-enum.ts
export enum MyEnum {
  Value1,  
  Value2,
  Value3
}

ベストプラクティスと注意点:

  • 列挙型名は、PascalCase で命名することを推奨します。

  • 列挙型は、関連する定数の集合を定義するために使用されます。

guard

新しいガードを生成します。ガードは、ルートへのアクセスを制御するために使用されます。

使用方法:

`ng generate guard my-guard`

生成されるファイル:

  • my-guard.guard.ts: ガードの TypeScript クラス

  • my-guard.guard.spec.ts: ガードのテストファイル

サンプルコード:

// my-guard.guard.ts
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})  
export class MyGuard implements CanActivate {
  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    // ここでルートへのアクセスを許可するかどうかを判定するロジックを実装します。
    return true;
  }  
    
}

ベストプラクティスと注意点:

  • ガード名は、PascalCase で命名し、末尾に Guard を付けることを推奨します (例: AuthGuard)。

  • ガードは、CanActivate インターフェースを実装する必要があります。

  • canActivate メソッドは、ルートへのアクセスを許可するかどうかを判定します。

  • ガードは、認証、認可、ルートの保護などに使用されます。

使用例:

ログインユーザーのみがアクセスできるルートを保護するガードを生成する場合、以下のようにコマンドを実行します。

ng generate guard Auth

interface

新しいインターフェースを生成します。

使用方法:

ng generate interface my-interface

生成されるファイル:

  • my-interface.ts: 指定した名前のインターフェースを定義した TypeScript ファイル

サンプルコード:

// my-interface.ts
export interface MyInterface {
  name: string;
  age: number;
}

ベストプラクティスと注意点:

  • インターフェース名は、PascalCase で命名し、先頭に I を付けることを推奨します (例: IUser)。

  • インターフェースは、オブジェクトの構造を定義するために使用されます。

interceptor

新しいインターセプターを生成します。インターセプターは、HTTP リクエストとレスポンスに割り込んで処理を行うために使用されます。例えば、リクエストにヘッダーを追加したり、レスポンスのエラーを処理したりすることができます。

使用方法:

ng generate interceptor my-interceptor

生成されるファイル:

  • my-interceptor.interceptor.ts: インターセプターの TypeScript クラス

  • my-interceptor.interceptor.spec.ts: インターセプターのテストファイル

サンプルコード:

// my-interceptor.interceptor.ts`  
import { Injectable } from '@angular/core';
import {
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable()
export class MyInterceptor implements HttpInterceptor {

  constructor() {}

  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
    // リクエストに認証ヘッダーを追加する例
    const authReq = request.clone({
      setHeaders: { Authorization: 'Bearer <token>' }
    });
    return next.handle(authReq);
  }  
}

ベストプラクティスと注意点:

  • インターセプター名は、PascalCase で命名し、末尾に Interceptor を付けることを推奨します (例: AuthInterceptor)。

  • インターセプターは、HttpInterceptor インターフェースを実装する必要があります。

  • intercept メソッドは、HTTP リクエストをインターセプトして処理を行います。

  • インターセプターは、認証、ロギング、エラー処理などに使用されます。

使用例:

すべての HTTP リクエストに認証ヘッダーを追加するインターセプターを生成する場合、以下のようにコマンドを実行します。

ng generate interceptor Auth

module

新しいモジュールを生成します。モジュールは、Angular アプリケーションを構成する単位です。コンポーネント、サービス、ディレクティブなどをグループ化し、アプリケーションの構造化を促進します。

使用方法:

ng generate module my-module

生成されるファイル:

  • my-module.module.ts: モジュールの TypeScript クラス

サンプルコード:

// my-module.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

@NgModule({
  declarations:,
  imports:
})
export class MyModule { }

ベストプラクティスと注意点:

  • モジュール名は、PascalCase で命名し、末尾に Module を付けることを推奨します (例: UserModule)。

  • モジュールは、@NgModule デコレータを使用して定義します。

  • declarations プロパティは、モジュールに属するコンポーネント、ディレクティブ、パイプを宣言します。

  • imports プロパティは、モジュールが依存する他のモジュールをインポートします。

  • exports プロパティは、モジュールが外部に公開するコンポーネント、ディレクティブ、パイプを宣言します。

使用例:

ユーザー管理機能を扱うモジュールを生成する場合、以下のようにコマンドを実行します。

ng generate module user

pipe

新しいパイプを生成します。パイプは、データの表示形式を変更するために使用されます。例えば、日付を特定の形式で表示したり、数値を通貨記号付きで表示したりすることができます。

使用方法:

ng generate pipe my-pipe

生成されるファイル:

  • my-pipe.pipe.ts: パイプの TypeScript クラス

  • my-pipe.pipe.spec.ts: パイプのテストファイル

サンプルコード:

// my-pipe.pipe.ts
import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'myPipe'
})
export class MyPipe implements PipeTransform {

  transform(value: unknown, ...args: unknown): unknown {
    // ここで値を変換するロジックを実装します。
    return value;
  }

}

ベストプラクティスと注意点:

  • パイプ名は、キャメルケースで命名することを推奨します。

  • パイプは、PipeTransform インターフェースを実装する必要があります。

  • transform メソッドは、値を変換するロジックを実装します。

  • パイプは、テンプレート式で | 記号を使用して適用します。

使用例:

日付を "yyyy年MM月dd日" の形式で表示するパイプを生成する場合、以下のようにコマンドを実行します。

ng generate pipe date-format

service

新しいサービスを生成します。サービスは、Angular アプリケーションでロジックをカプセル化するために使用されます。データの取得、処理、共有など、さまざまなタスクを実行することができます。

使用方法:

ng generate service my-service

生成されるファイル:

  • my-service.service.ts: サービスの TypeScript クラス

  • my-service.service.spec.ts: サービスのテストファイル

サンプルコード:

// my-service.service.ts
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class MyService {

  constructor() { }

  getData() {
    // ここでデータを取得するロジックを実装します。
    return 'data';
  }
}

ベストプラクティスと注意点:

  • サービス名は、キャメルケースで命名し、末尾に Service を付けることを推奨します (例: UserService)。

  • サービスは、@Injectable デコレータを使用して定義します。

  • providedIn: 'root' を指定することで、サービスをアプリケーション全体で利用可能にします。

  • サービスは、コンポーネントから依存性注入によって利用されます。

使用例:

ユーザーデータを取得するサービスを生成する場合、以下のようにコマンドを実行します。

ng generate service user

web-worker

新しい Web Worker を生成します。Web Worker は、バックグラウンドで JavaScript コードを実行するために使用されます。メインスレッドをブロックすることなく、CPU を集中的に使用するタスクを実行することができます。

使用方法:

ng generate web-worker my-worker

生成されるファイル:

  • my-worker.worker.ts: Web Worker の TypeScript クラス

サンプルコード:

// my-worker.worker.ts
/// <reference lib="webworker" />

addEventListener('message', ({ data }) => {
  const response = `worker response to ${data}`;
  postMessage(response);
});

ベストプラクティスと注意点:

  • Web Worker 名は、キャメルケースで命名し、末尾に Worker を付けることを推奨します (例: DataProcessorWorker)。

  • Web Worker は、メインスレッドとは別のスレッドで実行されます。

  • addEventListener('message', ...) を使用して、メインスレッドからのメッセージを受信します。

  • postMessage(...) を使用して、メインスレッドにメッセージを送信します。

使用例:

大量のデータを処理する Web Worker を生成する場合、以下のようにコマンドを実行します。

ng generate web-worker data-processor

environments

Angular アプリケーションの環境設定ファイルを生成または更新します。環境設定ファイルは、開発環境、ステージング環境、本番環境など、異なる環境でアプリケーションを動作させるために使用されます。

使用方法:

ng generate environments

生成されるファイル:

  • src/environments/environment.ts: 開発環境の設定ファイル

  • src/environments/environment.prod.ts: 本番環境の設定ファイル

サンプルコード:

// src/environments/environment.ts
export const environment = {
  production: false,
  apiUrl: 'http://localhost:3000/api'
};
// src/environments/environment.prod.ts
export const environment = {
  production: true,
  apiUrl: 'https://my-api.com/api'
};

ベストプラクティスと注意点:

  • 環境設定ファイルは、src/environments ディレクトリに配置されます。

  • environment.ts はデフォルトの環境設定ファイルであり、開発環境で使用されます。

  • environment.prod.ts は本番環境用の環境設定ファイルです。

  • 環境変数を定義することで、異なる環境で異なる設定を使用することができます。

まとめ

Angular CLI の ng generate コマンドは、Angular アプリケーションの開発を効率化するための強力なツールです。

schematic を使用することで、コードの生成を自動化し、一貫性と保守性を向上させることができます。

この記事では、ng generate コマンドで使用できるすべてのオプションと schematic について解説しました。

これらのオプションと schematic を効果的に使用することで、Angular アプリケーションの開発をよりスムーズに進めることができます。

より詳細な情報については、Angular CLI の公式ドキュメントを参照してください。

いいなと思ったら応援しよう!