ionic-angular について
ionic-angularは、IonicとAngularのプロジェクトを開発・保守するためのスキルです。プロジェクト構成を判定し、standaloneとNgModuleに応じてナビゲーション、フォーム、ライフサイクル、状態管理、テストの方法を案内します。
主な機能
- 01Ionic・Angularのバージョンと構成の判定
- 02standaloneとNgModuleの両方に対応
- 03ルーティングとナビゲーションのパターン
- 04ライフサイクル、フォーム、状態管理の案内
- 05性能最適化とテストの解説
活用シーン
- 01既存構成に合うコンポーネントのインポート方法を選択
- 02ルートと遅延読み込みを設定
- 03フォームを構築しページのライフサイクルに対応
- 04サービス、ナビゲーション、ガードをテスト
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ capawesome-team/ skills --skill ionic-angularインストール後、Claude Code で/ionic-angularを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/forms.mdlifecycle.mdnavigation.mdperformance.mdproject-structure.mdservices-and-state.mdstandalone-vs-ngmodules.mdtesting.md詳細
Ionic Angular
Angular を使用した Ionic 開発 — プロジェクト構成、Angular 固有のコンポーネント、ナビゲーション、遅延読み込み、フォーム、ライフサイクルとの統合。
前提条件
@ionic/angularを使用する Ionic Framework 7 または 8。- Angular 16 以降(スタンドアロンアーキテクチャには Angular 17 以降を推奨)。
- Node.js と npm がインストールされていること。
- Ionic CLI がインストールされていること(
npm install -g @ionic/cli)。
エージェントの動作
- アーキテクチャを自動検出します。
src/main.tsを確認し、bootstrapApplication(スタンドアロン)とplatformBrowserDynamic().bootstrapModule(NgModule)のどちらが使われているかを判定します。検出したアーキテクチャに合わせて、すべてのコード例を調整します。 - 手順を追って案内します。 一度に1つのトピックをユーザーに案内します。
- インポートを調整します。 スタンドアロンコンポーネントでは、各 Ionic コンポーネントを
@ionic/angular/standaloneからインポートします。NgModule コンポーネントでは、ページモジュールにIonicModuleをインポートします。
手順
Step 1:プロジェクトを分析する
プロジェクトファイルを読み取り、以下の情報を自動検出します。推測できる情報をユーザーに尋ねてはいけません。
- Ionic のバージョン:
package.jsonから@ionic/angularのバージョンを読み取ります。 - Angular のバージョン:
package.jsonから@angular/coreのバージョンを読み取ります。 - アーキテクチャ:
src/main.tsを確認し、bootstrapApplication(スタンドアロン)とplatformBrowserDynamic().bootstrapModule(NgModule)のどちらが使われているかを判定します。src/app/app.module.tsが存在し、IonicModuleをインポートしている場合は、NgModule であることを確認します。 - Capacitor:
package.jsonに@capacitor/coreがあるか確認します。android/とios/ディレクトリも確認します。 - ルーティング:
src/app/app.routes.ts(スタンドアロン)またはsrc/app/app-routing.module.ts(NgModule)があるか確認します。 - ナビゲーションパターン:
src/app/にtabs/ディレクトリがあるか(タブベース)、またはテンプレートでion-menuが使われているか(サイドメニュー)を確認します。
Step 2:プロジェクト構成を把握する
標準的な Ionic Angular のディレクトリ構成については、references/project-structure.md を読み取ります。
要点:
- スタンドアロンプロジェクトには、
app.config.ts、app.routes.ts、スタンドアロンのページコンポーネントがあります。 - NgModule プロジェクトには、
app.module.ts、app-routing.module.ts、ページごとの*.module.tsファイルがあります。 - Ionic の設定は
ionic.config.jsonにあります。 - テーマ変数は
src/theme/variables.scssにあります。 - グローバルスタイルと Ionic CSS のインポートは
src/global.scssにあります。
Step 3:アーキテクチャの違いを把握する
詳しい違いについては、references/standalone-vs-ngmodules.md を読み取ります。
概要:
| 項目 | スタンドアロン | NgModule |
|---|---|---|
| ブートストラップ | main.ts の bootstrapApplication | platformBrowserDynamic().bootstrapModule |
| Ionic のセットアップ | app.config.ts の provideIonicAngular({}) | app.module.ts の IonicModule.forRoot() |
| コンポーネントのインポート | ファイルごとに Ionic コンポーネントをインポート | IonicModule がすべてをグローバルに提供 |
| インポート元 | @ionic/angular/standalone | @ionic/angular |
| 遅延読み込み | ルート内の loadComponent | ルート内の loadChildren |
| アイコンの登録 | ionicons の addIcons() が必要 | 自動 |
| ツリーシェイキング | はい | いいえ |
ステップ 4:ナビゲーションを設定する
ナビゲーションパターンの詳細は、references/navigation.md をお読みください。
対象トピック:
- ルート設定 — どちらのアーキテクチャでも、遅延読み込みを使用してルートを定義します。
- ルートコンポーネントのレイアウト —
<ion-app>と<ion-router-outlet>。 - テンプレートでのナビゲーション —
routerLinkとrouterDirectionを使用したトランジションアニメーション。 - プログラムによるナビゲーション —
NavController(navigateForward、navigateBack、navigateRoot、back)。 - ルートパラメーター —
ActivatedRouteを使ったパラメーターの読み取り。 - タブナビゲーション —
<ion-tabs>と、各タブの子ルート。 - サイドメニュー —
<ion-menu>、<ion-menu-toggle>、子ルート。 - ルートガード —
CanActivateFnを使った関数型ガード(Angular 15.2 以降)。 - モーダル — データの受け渡しに対応したオーバーレイナビゲーション向けの
ModalController。 - リニアルーティングとノンリニアルーティング — それぞれのパターンを使う場面。
ステップ 5:ライフサイクルフックを実装する
Ionic のページライフサイクルフックの詳細は、references/lifecycle.md をお読みください。
主なルール:
ngOnInitは最初の作成時に 1 回だけ 呼び出されます。一度だけ行う初期設定に使用します。ionViewWillEnterはページを訪れる たびに 呼び出されます。データの更新に使用します。ionViewDidEnterはトランジションアニメーションの後に呼び出されます。アニメーションを妨げる可能性のある負荷の高い処理に使用します。ionViewWillLeaveはページを離れる前に呼び出されます。クリーンアップやサブスクリプションの一時停止に使用します。ngOnDestroyはページがナビゲーションスタックから取り除かれると呼び出されます。最終的なクリーンアップに使用します。@ionic/angularのViewWillEnter、ViewDidEnter、ViewWillLeave、ViewDidLeaveインターフェースを実装します。
ステップ 6:フォームを作成する
Ionic コンポーネントを使ったフォームパターンの詳細は、references/forms.md をお読みください。
対象トピック:
- リアクティブフォーム — Ionic の入力コンポーネントと
FormBuilder、FormGroup、Validators。 - テンプレート駆動フォーム —
FormsModuleと[(ngModel)]。 - Ionic のフォームコンポーネント —
ion-input、ion-textarea、ion-select、ion-checkbox、ion-toggle、ion-radio-group、ion-range、ion-datetime。 - バリデーションの表示 —
errorText(Ionic 7 以降)、または旧バージョン向けの手動による<ion-note>。 - ラベルの配置 —
labelPlacement属性(floating、stacked、fixed)。
ステップ 7:サービスと状態を管理する
サービスと状態管理のパターンの詳細は、references/services-and-state.md をお読みください。
対象トピック:
- インジェクタブルサービス —
@Injectable({ providedIn: 'root' })。 - HTTP によるデータ取得 — スタンドアロンと NgModule 向けの
HttpClient設定、CRUD サービスのパターン。 - リアクティブな状態 — 共有する Observable の状態に
BehaviorSubjectを使用します。 - Angular シグナル — リアクティブな状態に
signal()とcomputed()を使用します(Angular 16 以降)。 - ローディングインジケーター — 非同期処理に
LoadingControllerを使用します。 - エラーのフィードバック — ユーザーに表示するエラー/成功メッセージに
ToastControllerを使用します。 - 環境設定 — API URL に
environment.ts/environment.prod.tsを使用します。
ステップ 8:パフォーマンスを最適化する
パフォーマンス最適化の手法については、references/performance.md をお読みください。
対象トピック:
- 遅延読み込み —
loadComponent(スタンドアロン)とloadChildren(NgModule)。 - trackBy/track —
*ngForと@forによる効率的なリスト描画。 - 仮想スクロール — 大きなリスト向けの Angular CDK
cdk-virtual-scroll-viewport。 - OnPush による変更検出 — 不要な再描画を減らします。
- プリロード戦略 — 2 回目以降のナビゲーションを即座に行うための
PreloadAllModules。 - スケルトンテキスト — 読み込み中の体感パフォーマンスを高める
ion-skeleton-text。
ステップ 9:テストを書く
テストパターンについては、references/testing.md をお読みください。
対象トピック:
- ページの単体テスト — スタンドアロンページと NgModule ページ向けの
TestBed設定。 - サービスのテスト —
HttpTestingControllerを使った基本的なサービスと HTTP サービスのテスト。 - 依存関係のモック — サービスやコントローラーのモックに
jasmine.createSpyObjを使用します。 - ナビゲーションのテスト —
NavControllerをモックします。 - ガードのテスト — 関数型ガード向けの
TestBed.runInInjectionContext。 - E2E テスト — Cypress と Playwright の設定。
エラー処理
NullInjectorError: No provider for IonRouterOutlet:スタンドアロンアプリでは、app.config.tsでprovideIonicAngular({})が呼び出されていることを確認してください。NgModule アプリでは、app.module.tsでIonicModule.forRoot()がインポートされていることを確認してください。- Ionic コンポーネントがレンダリングされない:スタンドアロンコンポーネントでは、各 Ionic コンポーネントが
@ionic/angular/standaloneからインポートされ、imports配列に指定されていることを確認してください。NgModule コンポーネントでは、ページモジュールでIonicModuleがインポートされていることを確認してください。 - アイコンが表示されない(スタンドアロン):
ionicons/iconsの必要なアイコンを指定してaddIcons()が呼び出され、IonIconが@ionic/angular/standaloneからインポートされていることを確認してください。 ionViewWillEnterが呼び出されない:コンポーネントが<ion-router-outlet>経由で直接ルーティングされていることを確認してください。子コンポーネントは Ionic のライフサイクルイベントを受け取りません。- 戻る操作でページのデータが更新されない:データ読み込みには
ngOnInitではなくionViewWillEnterを使用してください。Ionic はページを DOM にキャッシュするため、ngOnInitは一度しか呼び出されません。 - フォームの検証エラーが表示されない:Ionic 7 以降では、
<ion-input>のerrorTextを使用してください。以前のバージョンでは、control.invalid && control.touchedを手動で確認し、<ion-note>を表示してください。 - Ionic コンポーネントで
routerLinkが機能しない:スタンドアロンコンポーネントでは、コンポーネントのimports配列に@angular/routerからRouterLinkをインポートしてください。 - ページ遷移がアニメーションしない:アニメーション付きのナビゲーションには、Angular の
Routerではなく@ionic/angularのNavControllerを使用してください。または、routerLink要素にrouterDirectionを追加してください。 - タブナビゲーションが機能しない:
<ion-tab-button>のtab属性が子ルートのpathと一致していることを確認してください。タブ間をプログラムで移動しないでください。
関連スキル
capacitor-angular— Capacitor 固有の Angular パターン(プラグインサービス、NgZone、ディープリンク、プラットフォーム検出)。ionic-app-development— Ionic 開発全般(コンポーネント、テーマ設定、CLI)。ionic-app-creation— Ionic アプリを新規作成します。ionic-app-upgrades— Ionic を新しいバージョンにアップグレードします。