mcpField
C
ck:frontend-development

ck:frontend-development

github.com/binjuhor開発10546 回インストール6 日前に更新
リポジトリ

ck:frontend-development について

ReactとTypeScriptのプロジェクトで、コンポーネントやページ、機能を作る開発者向けのフロントエンドスキルです。Suspenseを使うデータ取得、ルーティング、ファイル構成、スタイル、パフォーマンスを扱います。

主な機能

  1. 01Reactコンポーネントとページのパターン
  2. 02Suspenseベースのデータ取得
  3. 03TanStack Routerのルーティング指針
  4. 04機能単位のファイル構成
  5. 05MUI v7のスタイル規約
  6. 06TypeScriptとパフォーマンスの実践

活用シーン

  1. 01遅延読み込みするReactコンポーネントの作成
  2. 02TanStack Queryによるデータ取得
  3. 03新しいフロントエンド機能の構成
  4. 04読み込みとエラー処理の改善

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/binjuhor/shadcn-lar --skill ck:frontend-development

インストール後、Claude Code で/ck:frontend-developmentを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

resources/
styling-guide.md
routing-guide.md
common-patterns.md
file-organization.md
component-patterns.md
performance.md
loading-and-error-states.md
data-fetching.md
complete-examples.md
typescript-standards.md

詳細

フロントエンド開発ガイドライン

目的

Suspense ベースのデータ取得、遅延読み込み、適切なファイル構成、パフォーマンス最適化に重点を置いた、モダンな React 開発の包括的なガイドです。

このスキルを使用するタイミング

  • 新しいコンポーネントやページを作成するとき
  • 新しい機能を構築するとき
  • TanStack Query でデータを取得するとき
  • TanStack Router でルーティングを設定するとき
  • MUI v7 でコンポーネントをスタイリングするとき
  • パフォーマンスを最適化するとき
  • フロントエンドのコードを整理するとき
  • TypeScript のベストプラクティス

クイックスタート

新規コンポーネントのチェックリスト

コンポーネントを作成しますか? 以下のチェックリストに従ってください。

  • TypeScript で React.FC<Props> パターンを使用する
  • 重いコンポーネントは遅延読み込みする: React.lazy(() => import())
  • 読み込み状態のために <SuspenseLoader> でラップする
  • データ取得には useSuspenseQuery を使用する
  • インポートエイリアス: @/、~types、~components、~features を使用する
  • スタイル: 100 行未満ならインライン、100 行超なら別ファイルにする
  • 子コンポーネントに渡すイベントハンドラーには useCallback を使用する
  • 末尾でデフォルトエクスポートする
  • ローディングスピナーを使った早期 return はしない
  • ユーザーへの通知には useMuiSnackbar を使用する
新規機能のチェックリスト

機能を作成しますか? 以下の構造をセットアップしてください。

  • features/{feature-name}/ ディレクトリを作成する
  • サブディレクトリを作成する: api/、components/、hooks/、helpers/、types/
  • API サービスファイルを作成する: api/{feature}Api.ts
  • types/ に TypeScript の型を設定する
  • routes/{feature-name}/index.tsx にルートを作成する
  • 機能のコンポーネントを遅延読み込みする
  • Suspense の境界を使用する
  • 機能の index.ts から公開 API をエクスポートする

インポートエイリアス早見表

エイリアス解決先例
@/src/import { apiClient } from '@/lib/apiClient'
~typessrc/typesimport type { User } from '~types/user'
~componentssrc/componentsimport { SuspenseLoader } from '~components/SuspenseLoader'
~featuressrc/featuresimport { authApi } from '~features/auth'

定義場所: vite.config.ts の 180〜185 行


よく使うインポートのチートシート

// React & Lazy Loading
import React, { useState, useCallback, useMemo } from 'react';
const Heavy = React.lazy(() => import('./Heavy'));

// MUI Components
import { Box, Paper, Typography, Button, Grid } from '@mui/material';
import type { SxProps, Theme } from '@mui/material';

// TanStack Query (Suspense)
import { useSuspenseQuery, useQueryClient } from '@tanstack/react-query';

// TanStack Router
import { createFileRoute } from '@tanstack/react-router';

// Project Components
import { SuspenseLoader } from '~components/SuspenseLoader';

// Hooks
import { useAuth } from '@/hooks/useAuth';
import { useMuiSnackbar } from '@/hooks/useMuiSnackbar';

// Types
import type { Post } from '~types/post';

トピックガイド

🎨 コンポーネントパターン

モダンな React コンポーネントでは次を使用します:

  • 型安全性のための React.FC<Props>
  • コード分割のための React.lazy()
  • 読み込み状態のための SuspenseLoader
  • 名前付き const + デフォルトエクスポートのパターン

主要な概念:

  • 重いコンポーネント(DataGrid、チャート、エディター)は遅延読み込みする
  • 遅延読み込みするコンポーネントは必ず Suspense でラップする
  • SuspenseLoader コンポーネントを使用する(フェードアニメーション付き)
  • コンポーネントの構造: Props → Hooks → Handlers → Render → Export

📖 完全ガイド: resources/component-patterns.md


📊 データ取得

主要パターン: useSuspenseQuery

  • Suspense の境界とともに使用する
  • キャッシュ優先の戦略(API の前にグリッドのキャッシュを確認する)
  • isLoading のチェックを置き換える
  • ジェネリクスで型安全にする

API サービスレイヤー:

  • features/{feature}/api/{feature}Api.ts を作成する
  • apiClient の axios インスタンスを使用する
  • 機能ごとにメソッドを一元化する
  • ルートの形式: /form/route(/api/form/route ではない)

📖 完全ガイド: resources/data-fetching.md


📁 ファイル構成

features/ と components/ の違い:

  • features/: ドメイン固有のもの(posts、comments、auth)
  • components/: 真に再利用可能なもの(SuspenseLoader、CustomAppBar)

機能のサブディレクトリ:

features/
  my-feature/
    api/          # API service layer
    components/   # Feature components
    hooks/        # Custom hooks
    helpers/      # Utility functions
    types/        # TypeScript types

📖 完全ガイド: resources/file-organization.md


🎨 スタイリング

インラインと別ファイルの使い分け:

  • 100 行未満: インラインの const styles: Record<string, SxProps<Theme>>
  • 100 行超: 別の .styles.ts ファイル

主要な方法:

  • MUI コンポーネントには sx プロップを使用する
  • SxProps<Theme> で型安全にする
  • テーマへのアクセス: (theme) => theme.palette.primary.main

MUI v7 Grid:

<Grid size={{ xs: 12, md: 6 }}>  // ✅ v7 syntax
<Grid xs={12} md={6}>             // ❌ Old syntax

📖 完全ガイド: resources/styling-guide.md


🛣️ ルーティング

TanStack Router - フォルダーベース:

  • ディレクトリ: routes/my-route/index.tsx
  • コンポーネントの遅延読み込み
  • createFileRoute を使用
  • パンくずリストのデータは loader で取得

例:

import { createFileRoute } from '@tanstack/react-router';
import { lazy } from 'react';

const MyPage = lazy(() => import('@/features/my-feature/components/MyPage'));

export const Route = createFileRoute('/my-route/')({
    component: MyPage,
    loader: () => ({ crumb: 'My Route' }),
});

📖 完全ガイド: resources/routing-guide.md


⏳ ローディング & エラー状態

重要ルール: 早期リターンを使用しない

// ❌ NEVER - Causes layout shift
if (isLoading) {
    return <LoadingSpinner />;
}

// ✅ ALWAYS - Consistent layout
<SuspenseLoader>
    <Content />
</SuspenseLoader>

理由: Cumulative Layout Shift (CLS) を防ぎ、UX を向上させるため

エラーハンドリング:

  • ユーザーへのフィードバックには useMuiSnackbar を使用
  • react-toastify は絶対に使用しない
  • TanStack Query の onError コールバック

📖 完全ガイド: resources/loading-and-error-states.md


⚡ パフォーマンス

最適化パターン:

  • useMemo: 負荷の高い計算処理(filter、sort、map)
  • useCallback: 子コンポーネントに渡すイベントハンドラー
  • React.memo: 負荷の高いコンポーネント
  • 検索のデバウンス(300〜500ms)
  • メモリリーク防止(useEffect 内でのクリーンアップ)

📖 完全ガイド: resources/performance.md


📘 TypeScript

標準:

  • strict モードを有効にし、any 型は使用しない
  • 関数には戻り値の型を明示する
  • 型のインポート: import type { User } from '~types/user'
  • コンポーネントの props インターフェースには JSDoc を付ける

📖 完全ガイド: resources/typescript-standards.md


🔧 共通パターン

対象トピック:

  • React Hook Form と Zod によるバリデーション
  • DataGrid ラッパーの契約
  • ダイアログコンポーネントの標準
  • 現在のユーザーを取得する useAuth フック
  • キャッシュ無効化を伴うミューテーションのパターン

📖 完全ガイド: resources/common-patterns.md


📚 完全な例

動作する完全な例:

  • すべてのパターンを使ったモダンなコンポーネント
  • 完全な機能のディレクトリ構成
  • API サービス層
  • 遅延読み込みを使ったルート
  • Suspense + useSuspenseQuery
  • バリデーション付きフォーム

📖 完全ガイド: resources/complete-examples.md


ナビゲーションガイド

やりたいこと...参照するリソース
コンポーネントを作成するcomponent-patterns.md
データを取得するdata-fetching.md
ファイル・フォルダーを整理するfile-organization.md
コンポーネントをスタイリングするstyling-guide.md
ルーティングを設定するrouting-guide.md
ローディング・エラーを処理するloading-and-error-states.md
パフォーマンスを最適化するperformance.md
TypeScript の型typescript-standards.md
フォーム・認証・DataGridcommon-patterns.md
完全な例を見るcomplete-examples.md

基本原則

  1. 重い処理はすべて遅延読み込みする: ルート、DataGrid、チャート、エディター
  2. ローディングには Suspense を使用する: 早期リターンではなく SuspenseLoader を使う
  3. useSuspenseQuery: 新しいコードにおける主要なデータ取得パターン
  4. 機能は整理された構造にする: api/、components/、hooks/、helpers/ のサブディレクトリを使う
  5. スタイルはサイズで決める: <100 行はインライン、>100 行は別ファイル
  6. インポートエイリアス: @/、~types、~components、~features を使用する
  7. 早期リターンを使用しない: レイアウトシフトを防ぐため
  8. useMuiSnackbar: すべてのユーザー通知に使用する

クイックリファレンス: ファイル構成

src/
  features/
    my-feature/
      api/
        myFeatureApi.ts       # API service
      components/
        MyFeature.tsx         # Main component
        SubComponent.tsx      # Related components
      hooks/
        useMyFeature.ts       # Custom hooks
        useSuspenseMyFeature.ts  # Suspense hooks
      helpers/
        myFeatureHelpers.ts   # Utilities
      types/
        index.ts              # TypeScript types
      index.ts                # Public exports

  components/
    SuspenseLoader/
      SuspenseLoader.tsx      # Reusable loader
    CustomAppBar/
      CustomAppBar.tsx        # Reusable app bar

  routes/
    my-route/
      index.tsx               # Route component
      create/
        index.tsx             # Nested route

モダンなコンポーネントのテンプレート(すぐにコピー可能)

import React, { useState, useCallback } from 'react';
import { Box, Paper } from '@mui/material';
import { useSuspenseQuery } from '@tanstack/react-query';
import { featureApi } from '../api/featureApi';
import type { FeatureData } from '~types/feature';

interface MyComponentProps {
    id: number;
    onAction?: () => void;
}

export const MyComponent: React.FC<MyComponentProps> = ({ id, onAction }) => {
    const [state, setState] = useState<string>('');

    const { data } = useSuspenseQuery({
        queryKey: ['feature', id],
        queryFn: () => featureApi.getFeature(id),
    });

    const handleAction = useCallback(() => {
        setState('updated');
        onAction?.();
    }, [onAction]);

    return (
        <Box sx={{ p: 2 }}>
            <Paper sx={{ p: 3 }}>
                {/* Content */}
            </Paper>
        </Box>
    );
};

export default MyComponent;

完全な例は resources/complete-examples.md を参照してください。


関連スキル

  • error-tracking: Sentry によるエラートラッキング(フロントエンドにも適用)
  • backend-dev-guidelines: フロントエンドが利用するバックエンド API のパターン

スキルの状態: コンテキストを最適に管理するため、段階的読み込みに対応したモジュール構造

コメント