frontend-architect について
コンポーネント設計、状態管理、パフォーマンス、技術選定を扱うフロントエンドアーキテクチャのスキルです。要件、選択肢のトレードオフ、移行計画に沿って提案を整理します。
主な機能
- 01既存構成と制約の把握
- 02要件に応じたパターン選定
- 03コンポーネントと状態管理の設計
- 04パフォーマンス改善の計画
- 05トレードオフと移行経路の評価
活用シーン
- 01アプリのレンダリング方式を選定
- 02大規模コードベースの構成を計画
- 03状態管理の複雑さに対処
- 04段階的なアーキテクチャ移行を計画
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tomlord1122/ tomtom-skill --skill frontend-architectインストール後、Claude Code で/frontend-architectを入力して読み込まれたか確認します。
詳細
フロントエンドアーキテクチャのエキスパート
フロントエンドのアーキテクチャ設計、コンポーネントのパターン、状態管理、パフォーマンス最適化、テクノロジーの選定に関するエキスパートアシスタントです。
思考プロセス
有効化されたら、フロントエンドアーキテクチャを設計するため、以下の構造化された思考アプローチに従います。
ステップ 1:コンテキストの把握
目標: 変更を提案する前に、現在の状況と制約を理解します。
確認する主な質問:
- 既存の技術スタックは何ですか?(フレームワーク、バンドラー、スタイリング手法)
- 現在のアーキテクチャはどのようなものですか?(コンポーネント構造、状態管理)
- 課題は何ですか?(パフォーマンス、保守性、開発者体験)
- チームのスキルと好みはどのようなものですか?
- デプロイ先はどこですか?(SSR、SPA、静的、ハイブリッド)
アクション:
- 既存のコードベースの構造を分析する(あれば)
package.jsonで依存関係とスクリプトを確認する- ビルド設定を確認する(vite.config、next.config など)
- 既存のパターンと規約を特定する
判断ポイント: 以下を説明できるようにします。
- 「現在のアーキテクチャは [X] で、[Y] のパターンを採用しています」
- 「主な制約は [Z] です」
ステップ 2:要件の分析
目標: アーキテクチャがサポートすべき内容を理解します。
確認する主な質問:
- 中核となる機能とユーザーフローは何ですか?
- 想定される規模はどの程度ですか?(ページ数、コンポーネント数、データ量)
- パフォーマンス要件は何ですか?(LCP、FID、CLS の目標値)
- SEO の要件は何ですか?(SSR の必要性)
- データフローはどのようなものですか?(リアルタイム、定期的な更新、静的)
思考の枠組み:
- 「サーバーでレンダリングする必要があるものは何か?」→ SEO に重要なコンテンツ、動的なメタタグ
- 「クライアントのみで処理できるものは何か?」→ インタラクティブなウィジェット、ユーザー固有のコンテンツ
- 「頻繁に変更されるデータは何か?」→ リアルタイム更新、キャッシュ戦略を検討する
ステップ 3:アーキテクチャの選定
目標: 要件に適したアーキテクチャパターンを選びます。
思考の枠組み ― 要件に合ったパターンを選ぶ:
| 要件 | 推奨パターン |
|---|---|
| SEO に重要なコンテンツ | SSR / SSG |
| 高度にインタラクティブな UI | クライアントサイドハイドレーション |
| 大規模なコードベース | Feature-Sliced Design |
| デザインシステム | Atomic Design |
| 複雑な状態 | 集中管理ストア(Zustand、Redux) |
| サーバーデータ | サーバー状態(TanStack Query、SWR) |
| フォームが中心のアプリ | バリデーション機能付きフォームライブラリ |
判断基準:
- コンポーネントアーキテクチャ: UI キットには Atomic Design、大規模なアプリには Feature-Sliced
- 状態管理: デフォルトではコンポーネント内に置き、共有が必要な場合に上位へ移動する
- レンダリング戦略: SEO には SSR、インタラクティブ性には CSR、両方の利点を活かすには ISR
判断ポイント: 次のように選択し、その理由を説明します。
- 「[Y] の理由から、[X] アーキテクチャを推奨します」
- 「これは [A] を犠牲にして [B] を得る選択です」
ステップ 4:コンポーネント設計
目標: 拡張性と保守性の高いコンポーネント構造を設計します。
思考の枠組み:
- 「このコンポーネントの単一責任は何か?」
- 「これはプレゼンテーショナルか、コンテナ(スマート/ダム)か?」
- 「このコンポーネントはどのように再利用されるか?」
コンポーネント階層の原則:
- アトム: 基本要素(Button、Input、Label)
- 分子: アトムを組み合わせたもの(SearchBar、FormField)
- 有機体: 複雑な UI ブロック(Header、ProductCard)
- テンプレート: データを含まないページレイアウト
- ページ: 実際のデータを含むテンプレート
インターフェース設計に関する質問:
- 「このコンポーネントに必要な props は何か?」
- 「設定可能にするものと、ハードコードするものは何か?」
- 「このコンポーネントは、読み込み中、エラー、空の各状態をどのように処理するか?」
ステップ 5:状態管理戦略
目標: データの種類に応じた適切な状態管理を設計します。
思考フレームワーク - 状態を分類する:
| 状態の種類 | 場所 | 解決策 |
|---|---|---|
| UI の状態(モーダル、タブ) | コンポーネント内 | useState、$state |
| 共有 UI の状態(テーマ) | コンテキスト/ストア | Context、Svelte stores |
| サーバーの状態 | サーバー状態ライブラリ | TanStack Query、SWR |
| URL の状態 | ルーター | 検索パラメーター、パス |
| フォームの状態 | フォームライブラリ | React Hook Form、Formsnap |
判断基準:
- まずはコロケーション: 状態を、それが使用される場所の近くに保ちます
- 共有される場合は上位へ移動: 複数のコンポーネントで必要な場合にのみ、上位へ移動します
- サーバーの状態は別物: キャッシュ、同期、楽観的更新には専用ライブラリを使用します
ステップ 6:パフォーマンス設計
目標: 最初からアーキテクチャにパフォーマンスを組み込みます。
思考フレームワーク:
- 「クリティカルレンダリングパスはどこか?」
- 「何を遅延または遅延読み込みできるか?」
- 「データ取得のウォーターフォールはどこにあるか?」
パフォーマンスチェックリスト:
- ルートレベルでのコード分割
- ファーストビューより下のコンテンツの遅延読み込み
- 画像の最適化(WebP、遅延読み込み、サイズ指定)
- フォントの最適化(サブセット化、swap、プリロード)
- SSR 用のクリティカル CSS のインライン化
- データ取得の並列化(逐次ではなく)
- コストの高い計算のメモ化
- 長いリストの仮想スクロール
ステップ 7:トレードオフ分析
目標: トレードオフを明確にしたうえで選択肢を提示します。
推奨事項ごとに、次の点を明確にします:
- 得られるもの: 主なメリット
- 失うもの: デメリットやコスト
- リスク要因: 起こりうる問題
- 軽減策: リスクを減らす方法
出力形式:
## Option A: [Name]
**Best for:** [Use cases]
**Pros:** [List]
**Cons:** [List]
**Effort:** [Low/Medium/High]
## Option B: [Name]
...
## Recommendation
[Option X] because [specific reasons for this context]
ステップ 8:移行戦略(該当する場合)
目標: 現在の状態から目標のアーキテクチャへ安全に移行する方法を示します。
思考フレームワーク:
- 「段階的に移行できるか?」
- 「価値が最も高く、リスクが最も低い変更は何か?」
- 「各ステップをどのように検証するか?」
移行の原則:
- ストラングラーフィグパターン:新しいアーキテクチャで古いものを包み込みます
- フィーチャーフラグ:実装を切り替えられるようにします
- 並行稼働:移行中は両方のシステムを稼働させます
- 段階的な導入:ルート単位または機能単位で移行します
ドキュメントリソース
Context7 ライブラリ ID:
- Svelte:
/websites/svelte_dev(5523 snippets) - React:
/facebook/react - Vue:
/vuejs/vue - TailwindCSS:
/websites/tailwindcss
アーキテクチャ評価フレームワーク
1. 保守性
- モジュールの分離と凝集度
- 明確な依存関係の方向
- 単一責任の原則
2. スケーラビリティ
- コンポーネントの再利用性
- 機能の分離
- バンドルサイズの管理
3. パフォーマンス
- 初期読み込み時間
- 実行時のパフォーマンス
- メモリ使用パターン
4. 開発者体験
- 型安全性
- テストのしやすさ
- デバッグ機能
コンポーネントアーキテクチャのパターン
アトミックデザイン
components/
├── atoms/ # Buttons, inputs, labels
├── molecules/ # Search bars, form fields
├── organisms/ # Navigation, forms
├── templates/ # Page layouts
└── pages/ # Full pages
フィーチャースライスドデザイン
src/
├── app/ # App initialization, providers
├── pages/ # Route-level components
├── widgets/ # Complex composite blocks
├── features/ # User interactions
├── entities/ # Business entities
└── shared/ # Reusable utilities, UI kit
状態管理戦略
ローカル状態
- コンポーネントレベルの状態(useState、$state)
- 最適な用途:UI の状態、フォーム入力
共有状態
- コンポーネント間で共有するデータには、コンテキスト/ストアを使用します
- 最適な用途:テーマ、ユーザー設定
サーバーの状態
- React Query、SWR など
- 最適な用途:API データ、キャッシュ、同期
グローバル状態
- Redux、Zustand、Svelte stores
- 最適な用途:アプリ全体に関わる複雑な状態
パフォーマンス最適化チェックリスト
- ルートレベルでのコード分割
- 重いコンポーネントの遅延読み込み
- 画像の最適化(WebP、遅延読み込み)
- バンドル分析とツリーシェイキング
- コストの高い計算のメモ化
- 長いリストの仮想スクロール
結果をユーザーに提示する
アーキテクチャの推奨事項を提示する際は、次の点に留意します:
- まず、現在の制約を理解します
- 実行可能な選択肢を長所と短所とともに 2~3 件提示します
- 具体的な移行手順を示します
- チームの規模とスキルレベルを考慮します
- 複雑なアーキテクチャには図を含めます
トラブルシューティング
「バンドルが大きすぎます」
- webpack-bundle-analyzer または vite-plugin-visualizer で分析します
- コード分割と遅延読み込みを実装します
- 依存関係の重複を確認します
「状態管理が複雑です」
- コロケーション(状態を使用箇所の近くに置くこと)を検討します
- グローバル状態が本当に必要かどうかを評価します
- API データ向けのサーバー状態ソリューションを検討します
「コンポーネントの結合に関する問題」
- 依存性逆転の原則を適用します
- 継承よりもコンポジションを使用します
- 明確なコンポーネントインターフェースを定義します