| name | web-development |
| description | モダンWeb開発の基礎。React、Vue、Next.jsなどのフレームワーク選定、プロジェクト構成、状態管理、ルーティング、ビルドツールなど、Web開発全般のベストプラクティス。 |
Web Development Skill
📋 目次
基礎編(このファイル)
詳細ガイド(完全版)
- フレームワーク選定完全ガイド - 26,000文字
- 状態管理完全ガイド - 28,000文字
- プロジェクト構成完全ガイド - 26,000文字
概要
このSkillは、モダンWeb開発の基礎をカバーします:
- フレームワーク選定 - React, Vue, Next.js, Remix等
- プロジェクト構成 - ディレクトリ構造、ファイル命名規則
- 状態管理 - Context API, Redux, Zustand, Jotai
- ルーティング - React Router, Next.js App Router
- ビルドツール - Vite, Webpack, Turbopack
- CSS戦略 - Tailwind CSS, CSS Modules, Styled Components
📚 詳細ガイド
プロダクションレベルの開発を学ぶには、以下の完全ガイドを参照してください:
1. フレームワーク選定完全ガイド
26,000文字 | 6大フレームワーク徹底比較 | 実プロジェクト事例10以上
- React・Next.js・Remix・Vue・Nuxt・Astro完全比較
- 10の選定基準(SEO、パフォーマンス、学習コスト等)
- 詳細な判断フローチャート
- ユースケース別推奨(EC、ブログ、SaaS、管理画面等)
- 実プロジェクト選定事例(10以上)
- パフォーマンス実測値(ビルド時間、バンドルサイズ、Lighthouse)
- マイグレーション戦略
2. 状態管理完全ガイド
28,000文字 | Context API・Zustand・Jotai・Redux Toolkit徹底解説
- 4つの主要ライブラリ完全比較
- 状態の種類(ローカル、グローバル、サーバー、URL)
- 使い分けフローチャート
- 完全実装例(ショッピングカート、Todo、認証)
- パフォーマンス実測値
- Zustand(セレクタあり): 再レンダリング -75%、更新時間 1ms
- Context API最適化: 再レンダリング -80%
- よくある15以上の間違いと解決策
3. プロジェクト構成完全ガイド
26,000文字 | スケーラブルなアーキテクチャ・ビルドツール・CSS戦略
- スケーラブルなディレクトリ構造(小・中・大規模別)
- Feature-based vs Layer-based比較
- ビルドツール完全比較(Vite、Webpack、Turbopack)
- Vite: HMR 80ms、ビルド 18秒
- Turbopack: HMR 30ms、ビルド 12秒
- CSS戦略完全比較(Tailwind、CSS Modules、Styled Components等)
- Tailwind CSS: バンドルサイズ 8-30KB(最小)
- パフォーマンス実測値
- 開発環境セットアップ(ESLint、Prettier、Git Hooks)
- モノレポ構成(Turborepo)
合計: 80,000文字 | 50以上の完全実装例 | 実プロジェクトの測定データ
🎓 学習パス
初心者向け
- このファイルで基礎を理解
- フレームワーク選定完全ガイドでフレームワーク選択
- Next.jsまたはReact + Viteでプロジェクト作成
中級者向け
- 状態管理完全ガイドでZustand習得
- プロジェクト構成完全ガイドでスケーラブルな構成習得
- 実プロジェクトで実践
上級者向け
- 全ての詳細ガイドを参照しながら、大規模アプリケーションを構築
- モノレポ構成(Turborepo)導入
- CI/CDパイプライン構築
いつ使うか
🎯 必須のタイミング
- 新規Webプロジェクト開始時(フレームワーク選定)
- プロジェクト構成設計時
- 状態管理戦略決定時
- CSS戦略決定時
🔄 定期的に
- 依存関係更新時
- パフォーマンス最適化時
- 新機能追加時
フレームワーク選定
選定基準
| フレームワーク | 用途 | メリット | デメリット |
|---|---|---|---|
| Next.js | フルスタックWebアプリ | SSR/SSG標準、SEO最適、App Router | 学習コスト高 |
| React (Vite) | SPA、管理画面 | シンプル、柔軟 | SEO対策が必要 |
| Remix | フルスタック | ネストルーティング、UX最高 | エコシステム小 |
| Vue (Nuxt) | フルスタック | 学習容易、日本語情報豊富 | React比でエコシステム小 |
| Astro | コンテンツサイト | 超高速、部分的インタラクティブ | 複雑なアプリには不向き |
判断フローチャート
SEOが最重要?
├─ Yes → サーバーサイドレンダリング必要
│ ├─ React好き → Next.js
│ └─ Vue好き → Nuxt.js
└─ No → SPA OK
├─ 管理画面・内部ツール → React + Vite
└─ コンテンツ中心 → Astro
プロジェクト構成
Next.js App Router(推奨)
project/
├── app/ # アプリケーションルート
│ ├── (marketing)/ # ルートグループ(パスに含まれない)
│ │ ├── layout.tsx
│ │ ├── page.tsx # /
│ │ └── about/page.tsx # /about
│ ├── dashboard/
│ │ ├── layout.tsx
│ │ └── page.tsx # /dashboard
│ ├── api/ # APIルート
│ │ └── users/route.ts # /api/users
│ ├── layout.tsx # ルートレイアウト
│ └── globals.css
├── components/ # 共有コンポーネント
│ ├── ui/ # UIコンポーネント(shadcn/ui等)
│ │ ├── button.tsx
│ │ └── card.tsx
│ └── features/ # 機能別コンポーネント
│ ├── user-profile.tsx
│ └── post-list.tsx
├── lib/ # ユーティリティ、ヘルパー
│ ├── utils.ts
│ ├── api.ts
│ └── db.ts
├── hooks/ # カスタムフック
│ ├── use-user.ts
│ └── use-posts.ts
├── types/ # TypeScript型定義
│ ├── user.ts
│ └── post.ts
├── public/ # 静的ファイル
│ └── images/
├── .env.local # 環境変数
├── next.config.js
├── tailwind.config.ts
└── package.json
React + Vite(SPA)
project/
├── src/
│ ├── pages/ # ページコンポーネント
│ │ ├── Home.tsx
│ │ ├── Dashboard.tsx
│ │ └── Settings.tsx
│ ├── components/ # 共有コンポーネント
│ │ ├── Header.tsx
│ │ ├── Sidebar.tsx
│ │ └── ui/
│ ├── hooks/ # カスタムフック
│ ├── lib/ # ユーティリティ
│ ├── store/ # 状態管理(Zustand等)
│ │ ├── userStore.ts
│ │ └── appStore.ts
│ ├── types/ # 型定義
│ ├── App.tsx
│ ├── main.tsx
│ └── index.css
├── public/
├── index.html
├── vite.config.ts
└── package.json
開発環境
推奨ツールセット
パッケージマネージャー
- pnpm (推奨) - 高速、ディスク効率的
- npm, yarn - 標準的
フォーマット・Lint
{
"devDependencies": {
"eslint": "^8.0.0",
"prettier": "^3.0.0",
"typescript": "^5.0.0"
}
}
.prettierrc
{
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5"
}
.eslintrc.json
{
"extends": [
"next/core-web-vitals",
"plugin:@typescript-eslint/recommended",
"prettier"
],
"rules": {
"@typescript-eslint/no-unused-vars": "error",
"prefer-const": "error"
}
}
Git Hooks(Husky)
pnpm add -D husky lint-staged
# package.json
{
"lint-staged": {
"*.{ts,tsx}": ["eslint --fix", "prettier --write"]
}
}
実践例
Example 1: Next.js新規プロジェクト(App Router)
# プロジェクト作成
pnpm create next-app@latest my-app --typescript --tailwind --app
cd my-app
# 追加パッケージ
pnpm add zustand zod react-hook-form
pnpm add -D @types/node
# shadcn/ui セットアップ
pnpm dlx shadcn-ui@latest init
pnpm dlx shadcn-ui@latest add button card
app/page.tsx
import { Button } from '@/components/ui/button'
export default function Home() {
return (
<main className="flex min-h-screen flex-col items-center justify-center p-24">
<h1 className="text-4xl font-bold">Welcome</h1>
<Button className="mt-4">Get Started</Button>
</main>
)
}
Example 2: React + Vite(SPA)
# プロジェクト作成
pnpm create vite@latest my-app --template react-ts
cd my-app
pnpm install
# 追加パッケージ
pnpm add react-router-dom zustand
pnpm add -D tailwindcss postcss autoprefixer
pnpm dlx tailwindcss init -p
src/main.tsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import App from './App'
import './index.css'
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<BrowserRouter>
<Routes>
<Route path="/" element={<App />} />
</Routes>
</BrowserRouter>
</React.StrictMode>
)
Example 3: 状態管理(Zustand)
// store/userStore.ts
import { create } from 'zustand'
interface User {
id: string
name: string
email: string
}
interface UserStore {
user: User | null
setUser: (user: User) => void
logout: () => void
}
export const useUserStore = create<UserStore>((set) => ({
user: null,
setUser: (user) => set({ user }),
logout: () => set({ user: null }),
}))
使用例
import { useUserStore } from '@/store/userStore'
export function UserProfile() {
const { user, logout } = useUserStore()
if (!user) return <div>Not logged in</div>
return (
<div>
<p>{user.name}</p>
<button onClick={logout}>Logout</button>
</div>
)
}
アンチパターン
❌ 1. 過度なコンポーネント分割
// ❌ 悪い例
function UserName({ name }: { name: string }) {
return <span>{name}</span>
}
function UserEmail({ email }: { email: string }) {
return <span>{email}</span>
}
function UserProfile({ user }: { user: User }) {
return (
<div>
<UserName name={user.name} />
<UserEmail email={user.email} />
</div>
)
}
// ✅ 良い例
function UserProfile({ user }: { user: User }) {
return (
<div>
<span>{user.name}</span>
<span>{user.email}</span>
</div>
)
}
❌ 2. Prop Drilling
// ❌ 悪い例
function App() {
const [user, setUser] = useState<User | null>(null)
return <Dashboard user={user} setUser={setUser} />
}
function Dashboard({ user, setUser }: Props) {
return <Settings user={user} setUser={setUser} />
}
function Settings({ user, setUser }: Props) {
// userとsetUserを使う
}
// ✅ 良い例(Zustand使用)
const useUserStore = create<UserStore>((set) => ({
user: null,
setUser: (user) => set({ user }),
}))
function Settings() {
const { user, setUser } = useUserStore()
// 直接アクセス
}
❌ 3. useEffectの誤用
// ❌ 悪い例
function UserList() {
const [users, setUsers] = useState<User[]>([])
useEffect(() => {
fetch('/api/users')
.then(res => res.json())
.then(setUsers)
}, []) // 依存配列が空 → コンポーネントマウント時のみ
}
// ✅ 良い例(Next.js App Router)
async function UserList() {
const users = await fetch('/api/users').then(res => res.json())
return (
<ul>
{users.map(user => (
<li key={user.id}>{user.name}</li>
))}
</ul>
)
}
Agent連携
📖 Agentへの指示例
新規プロジェクト作成
Next.js App Routerプロジェクトを作成してください。
以下を含めてください:
- TypeScript
- Tailwind CSS
- shadcn/ui
- Zustand(状態管理)
- Prisma(データベース)
コンポーネント生成
ユーザープロフィール編集コンポーネントを作成してください。
以下の機能を含めてください:
- react-hook-formでバリデーション
- zodスキーマ
- 送信時の楽観的UI更新
状態管理の追加
Zustandでショッピングカート機能を実装してください。
addItem, removeItem, clearCartアクションを含めてください。
🤖 Agentからの提案例
このコンポーネントは複雑になっています。
以下に分割することを提案します:
1. UserProfileForm - フォーム部分
2. UserAvatar - アバター表示部分
3. UserActions - アクション部分
分割しますか?
まとめ
Web開発のベストプラクティス
- フレームワーク選定 - 用途に応じた最適な選択
- プロジェクト構成 - スケーラブルな構造
- 状態管理 - 適切な粒度で管理
- 型安全性 - TypeScriptを活用
次のステップ
- フレームワーク選定
- プロジェクト構成設計
- 状態管理戦略決定
- CSS戦略決定
関連Skills
- nextjs-development - Next.js特化ガイド
- react-development - React詳細ガイド
- frontend-performance - パフォーマンス最適化
- web-accessibility - アクセシビリティ対応
Last updated: 2025-12-26