ck:frontend-development
React/TypeScriptでモダンなフロントエンドを構築し、コンポーネント設計、遅延ロード、MUI v7、TanStack Routerなどを活用して、パフォーマンスを最適化するSkill。
📜 元の英語説明(参考)
Build React/TypeScript frontends with modern patterns. Use for components, Suspense, lazy loading, useSuspenseQuery, MUI v7 styling, TanStack Router, performance optimization.
🇯🇵 日本人クリエイター向け解説
React/TypeScriptでモダンなフロントエンドを構築し、コンポーネント設計、遅延ロード、MUI v7、TanStack Routerなどを活用して、パフォーマンスを最適化するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o ck-frontend-development.zip https://jpskill.com/download/23646.zip && unzip -o ck-frontend-development.zip && rm ck-frontend-development.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/23646.zip -OutFile "$d\ck-frontend-development.zip"; Expand-Archive "$d\ck-frontend-development.zip" -DestinationPath $d -Force; ri "$d\ck-frontend-development.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
ck-frontend-development.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
ck-frontend-developmentフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
フロントエンド開発ガイドライン
目的
本ガイドラインは、Suspenseベースのデータフェッチ、遅延読み込み、適切なファイル構成、パフォーマンス最適化を重視した、モダンなReact開発のための包括的なガイドです。
このスキルを使用するタイミング
- 新しいコンポーネントやページを作成する時
- 新しい機能を構築する時
- TanStack Queryでデータをフェッチする時
- TanStack Routerでルーティングを設定する時
- MUI v7でコンポーネントをスタイリングする時
- パフォーマンス最適化を行う時
- フロントエンドのコードを整理する時
- TypeScriptのベストプラクティスを適用する時
クイックスタート
新規コンポーネントチェックリスト
コンポーネントを作成する際は、このチェックリストに従ってください。
- [ ] TypeScriptで
React.FC<Props>パターンを使用する - [ ] 重いコンポーネントの場合は遅延読み込みする:
React.lazy(() => import()) - [ ] ローディング状態のために
<SuspenseLoader>でラップする - [ ] データフェッチには
useSuspenseQueryを使用する - [ ] インポートエイリアスを使用する:
@/,~types,~components,~features - [ ] スタイル: 100行未満ならインライン、100行以上なら別ファイル
- [ ] 子コンポーネントに渡すイベントハンドラには
useCallbackを使用する - [ ] デフォルトエクスポートはファイルの最後に記述する
- [ ] ローディングスピナーによる早期リターンはしない
- [ ] ユーザー通知には
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' |
~types |
src/types |
import type { User } from '~types/user' |
~components |
src/components |
import { SuspenseLoader } from '~components/SuspenseLoader' |
~features |
src/features |
import { 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を作成するapiClientaxiosインスタンスを使用する- 機能ごとにメソッドを一元化する
- ルート形式:
/form/route(/api/form/routeではない)
📖 完全ガイド: resources/data-fetching.md
📁 ファイル構成
features/ と components/ の違い:
features/: ドメイン固有(投稿、コメント、認証など)components/: 真に再利用可能(SuspenseLoader、CustomAppBarなど)
機能サブディレクトリ:
features/
my-feature/
api/ # APIサービスレイヤー
components/ # 機能コンポーネント
hooks/ # カスタムフック
helpers/ # ユーティリティ関数
types/ # TypeScriptの型
📖 完全ガイド: resources/file-organization.md
🎨 スタイリング
インライン vs 別ファイル:
- 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構文
<Grid xs={12} md={6}> // ❌ 古い構文
📖 完全ガイド: resources/styling-guide.md
🛣️ ルーティング
TanStack Router - フォルダーベース:
- ディレクトリ:
routes/my-route/index.tsx - コンポーネントを遅延読み込みする
createFileRouteを使用する- ローダーにブレッドクラムデータを含める
例:
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
⏳ ローディングとエラー状態
重要なルール: 早期リターンはしない
// ❌ 絶対にしない - レイアウトシフトを引き起こす
if (isLoading) {
return <LoadingSpinner />;
}
// ✅ 常にこれを行う - 一貫したレイアウト
<SuspenseLoader>
<Content />
</SuspenseLoader>
理由: Cumulative Layout Shift (CLS) を防ぎ、UXを向上させます。
エラーハンドリング:
- ユーザーフィードバックには
useMuiSnackbarを使用する react-toastifyは絶対に使用しない- TanStack Queryの
onErrorコールバックを使用する
[📖 完全ガイド: resources/loading-and-error-states.md](resources/loadi
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Frontend Development Guidelines
Purpose
Comprehensive guide for modern React development, emphasizing Suspense-based data fetching, lazy loading, proper file organization, and performance optimization.
When to Use This Skill
- Creating new components or pages
- Building new features
- Fetching data with TanStack Query
- Setting up routing with TanStack Router
- Styling components with MUI v7
- Performance optimization
- Organizing frontend code
- TypeScript best practices
Quick Start
New Component Checklist
Creating a component? Follow this checklist:
- [ ] Use
React.FC<Props>pattern with TypeScript - [ ] Lazy load if heavy component:
React.lazy(() => import()) - [ ] Wrap in
<SuspenseLoader>for loading states - [ ] Use
useSuspenseQueryfor data fetching - [ ] Import aliases:
@/,~types,~components,~features - [ ] Styles: Inline if <100 lines, separate file if >100 lines
- [ ] Use
useCallbackfor event handlers passed to children - [ ] Default export at bottom
- [ ] No early returns with loading spinners
- [ ] Use
useMuiSnackbarfor user notifications
New Feature Checklist
Creating a feature? Set up this structure:
- [ ] Create
features/{feature-name}/directory - [ ] Create subdirectories:
api/,components/,hooks/,helpers/,types/ - [ ] Create API service file:
api/{feature}Api.ts - [ ] Set up TypeScript types in
types/ - [ ] Create route in
routes/{feature-name}/index.tsx - [ ] Lazy load feature components
- [ ] Use Suspense boundaries
- [ ] Export public API from feature
index.ts
Import Aliases Quick Reference
| Alias | Resolves To | Example |
|---|---|---|
@/ |
src/ |
import { apiClient } from '@/lib/apiClient' |
~types |
src/types |
import type { User } from '~types/user' |
~components |
src/components |
import { SuspenseLoader } from '~components/SuspenseLoader' |
~features |
src/features |
import { authApi } from '~features/auth' |
Defined in: vite.config.ts lines 180-185
Common Imports Cheatsheet
// 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';
Topic Guides
🎨 Component Patterns
Modern React components use:
React.FC<Props>for type safetyReact.lazy()for code splittingSuspenseLoaderfor loading states- Named const + default export pattern
Key Concepts:
- Lazy load heavy components (DataGrid, charts, editors)
- Always wrap lazy components in Suspense
- Use SuspenseLoader component (with fade animation)
- Component structure: Props → Hooks → Handlers → Render → Export
📖 Complete Guide: resources/component-patterns.md
📊 Data Fetching
PRIMARY PATTERN: useSuspenseQuery
- Use with Suspense boundaries
- Cache-first strategy (check grid cache before API)
- Replaces
isLoadingchecks - Type-safe with generics
API Service Layer:
- Create
features/{feature}/api/{feature}Api.ts - Use
apiClientaxios instance - Centralized methods per feature
- Route format:
/form/route(NOT/api/form/route)
📖 Complete Guide: resources/data-fetching.md
📁 File Organization
features/ vs components/:
features/: Domain-specific (posts, comments, auth)components/: Truly reusable (SuspenseLoader, CustomAppBar)
Feature Subdirectories:
features/
my-feature/
api/ # API service layer
components/ # Feature components
hooks/ # Custom hooks
helpers/ # Utility functions
types/ # TypeScript types
📖 Complete Guide: resources/file-organization.md
🎨 Styling
Inline vs Separate:
- <100 lines: Inline
const styles: Record<string, SxProps<Theme>> -
100 lines: Separate
.styles.tsfile
Primary Method:
- Use
sxprop for MUI components - Type-safe with
SxProps<Theme> - Theme access:
(theme) => theme.palette.primary.main
MUI v7 Grid:
<Grid size={{ xs: 12, md: 6 }}> // ✅ v7 syntax
<Grid xs={12} md={6}> // ❌ Old syntax
📖 Complete Guide: resources/styling-guide.md
🛣️ Routing
TanStack Router - Folder-Based:
- Directory:
routes/my-route/index.tsx - Lazy load components
- Use
createFileRoute - Breadcrumb data in loader
Example:
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' }),
});
📖 Complete Guide: resources/routing-guide.md
⏳ Loading & Error States
CRITICAL RULE: No Early Returns
// ❌ NEVER - Causes layout shift
if (isLoading) {
return <LoadingSpinner />;
}
// ✅ ALWAYS - Consistent layout
<SuspenseLoader>
<Content />
</SuspenseLoader>
Why: Prevents Cumulative Layout Shift (CLS), better UX
Error Handling:
- Use
useMuiSnackbarfor user feedback - NEVER
react-toastify - TanStack Query
onErrorcallbacks
📖 Complete Guide: resources/loading-and-error-states.md
⚡ Performance
Optimization Patterns:
useMemo: Expensive computations (filter, sort, map)useCallback: Event handlers passed to childrenReact.memo: Expensive components- Debounced search (300-500ms)
- Memory leak prevention (cleanup in useEffect)
📖 Complete Guide: resources/performance.md
📘 TypeScript
Standards:
- Strict mode, no
anytype - Explicit return types on functions
- Type imports:
import type { User } from '~types/user' - Component prop interfaces with JSDoc
📖 Complete Guide: resources/typescript-standards.md
🔧 Common Patterns
Covered Topics:
- React Hook Form with Zod validation
- DataGrid wrapper contracts
- Dialog component standards
useAuthhook for current user- Mutation patterns with cache invalidation
📖 Complete Guide: resources/common-patterns.md
📚 Complete Examples
Full working examples:
- Modern component with all patterns
- Complete feature structure
- API service layer
- Route with lazy loading
- Suspense + useSuspenseQuery
- Form with validation
📖 Complete Guide: resources/complete-examples.md
Navigation Guide
| Need to... | Read this resource |
|---|---|
| Create a component | component-patterns.md |
| Fetch data | data-fetching.md |
| Organize files/folders | file-organization.md |
| Style components | styling-guide.md |
| Set up routing | routing-guide.md |
| Handle loading/errors | loading-and-error-states.md |
| Optimize performance | performance.md |
| TypeScript types | typescript-standards.md |
| Forms/Auth/DataGrid | common-patterns.md |
| See full examples | complete-examples.md |
Core Principles
- Lazy Load Everything Heavy: Routes, DataGrid, charts, editors
- Suspense for Loading: Use SuspenseLoader, not early returns
- useSuspenseQuery: Primary data fetching pattern for new code
- Features are Organized: api/, components/, hooks/, helpers/ subdirs
- Styles Based on Size: <100 inline, >100 separate
- Import Aliases: Use @/, ~types, ~components, ~features
- No Early Returns: Prevents layout shift
- useMuiSnackbar: For all user notifications
Quick Reference: File Structure
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
Modern Component Template (Quick Copy)
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;
For complete examples, see resources/complete-examples.md
Related Skills
- error-tracking: Error tracking with Sentry (applies to frontend too)
- backend-dev-guidelines: Backend API patterns that frontend consumes
Skill Status: Modular structure with progressive loading for optimal context management