nextjs-app
Next.js 14 App Routerの機能を活用し、サーバーサイド/クライアントサイドコンポーネント、APIルート、ミドルウェア、データ取得パターンなどを組み込んだアプリケーションの基本構造を自動生成するSkill。
📜 元の英語説明(参考)
生成Next.js 14+ App Router组件,包括服务端组件、客户端组件、API路由、中间件和数据获取模式。
🇯🇵 日本人クリエイター向け解説
Next.js 14 App Routerの機能を活用し、サーバーサイド/クライアントサイドコンポーネント、APIルート、ミドルウェア、データ取得パターンなどを組み込んだアプリケーションの基本構造を自動生成するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o nextjs-app.zip https://jpskill.com/download/16477.zip && unzip -o nextjs-app.zip && rm nextjs-app.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/16477.zip -OutFile "$d\nextjs-app.zip"; Expand-Archive "$d\nextjs-app.zip" -DestinationPath $d -Force; ri "$d\nextjs-app.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
nextjs-app.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
nextjs-appフォルダができる - 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 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Next.js App Skill
説明
サーバー/クライアントパターンを使用した Next.js 14+ App Router コンポーネントを生成します。
トリガー
/nextjsコマンド- ユーザーからの Next.js コードのリクエスト
- ユーザーが App Router パターンを必要としている
プロンプト
あなたは、モダンな App Router アプリケーションを作成する Next.js のエキスパートです。
データフェッチを行うサーバーコンポーネント
// app/users/page.tsx
import { Suspense } from 'react';
interface User {
id: string;
name: string;
email: string;
}
async function getUsers(): Promise<User[]> {
const res = await fetch('https://api.example.com/users', {
next: { revalidate: 60 }, // ISR: 60秒ごとに再検証
});
if (!res.ok) throw new Error('Failed to fetch users');
return res.json();
}
async function UserList() {
const users = await getUsers();
return (
<ul className="space-y-2">
{users.map(user => (
<li key={user.id} className="p-4 bg-white rounded-lg shadow">
<h3 className="font-semibold">{user.name}</h3>
<p className="text-gray-600">{user.email}</p>
</li>
))}
</ul>
);
}
export default function UsersPage() {
return (
<main className="container mx-auto p-4">
<h1 className="text-2xl font-bold mb-4">Users</h1>
<Suspense fallback={<div>Loading users...</div>}>
<UserList />
</Suspense>
</main>
);
}
フォームを持つクライアントコンポーネント
'use client';
import { useState, useTransition } from 'react';
import { useRouter } from 'next/navigation';
import { createUser } from './actions';
export function CreateUserForm() {
const router = useRouter();
const [isPending, startTransition] = useTransition();
const [error, setError] = useState<string | null>(null);
async function handleSubmit(formData: FormData) {
setError(null);
startTransition(async () => {
const result = await createUser(formData);
if (result.error) {
setError(result.error);
} else {
router.push('/users');
router.refresh();
}
});
}
return (
<form action={handleSubmit} className="space-y-4">
{error && <div className="text-red-600">{error}</div>}
<input
name="name"
placeholder="Name"
required
className="w-full p-2 border rounded"
/>
<input
name="email"
type="email"
placeholder="Email"
required
className="w-full p-2 border rounded"
/>
<button
type="submit"
disabled={isPending}
className="w-full p-2 bg-blue-600 text-white rounded disabled:opacity-50"
>
{isPending ? 'Creating...' : 'Create User'}
</button>
</form>
);
}
サーバーアクション
// app/users/actions.ts
'use server';
import { revalidatePath } from 'next/cache';
import { z } from 'zod';
const CreateUserSchema = z.object({
name: z.string().min(1),
email: z.string().email(),
});
export async function createUser(formData: FormData) {
const validated = CreateUserSchema.safeParse({
name: formData.get('name'),
email: formData.get('email'),
});
if (!validated.success) {
return { error: 'Invalid input' };
}
try {
await fetch('https://api.example.com/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(validated.data),
});
revalidatePath('/users');
return { success: true };
} catch {
return { error: 'Failed to create user' };
}
}
ミドルウェア
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('token')?.value;
// ダッシュボードのルートを保護
if (request.nextUrl.pathname.startsWith('/dashboard')) {
if (!token) {
return NextResponse.redirect(new URL('/login', request.url));
}
}
return NextResponse.next();
}
export const config = {
matcher: ['/dashboard/:path*'],
};
タグ
nextjs, react, app-router, server-components, fullstack
互換性
- Codex: ✅
- Claude Code: ✅
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Next.js App Skill
Description
Generate Next.js 14+ App Router components with server/client patterns.
Trigger
/nextjscommand- User requests Next.js code
- User needs App Router patterns
Prompt
You are a Next.js expert that creates modern App Router applications.
Server Component with Data Fetching
// app/users/page.tsx
import { Suspense } from 'react';
interface User {
id: string;
name: string;
email: string;
}
async function getUsers(): Promise<User[]> {
const res = await fetch('https://api.example.com/users', {
next: { revalidate: 60 }, // ISR: revalidate every 60 seconds
});
if (!res.ok) throw new Error('Failed to fetch users');
return res.json();
}
async function UserList() {
const users = await getUsers();
return (
<ul className="space-y-2">
{users.map(user => (
<li key={user.id} className="p-4 bg-white rounded-lg shadow">
<h3 className="font-semibold">{user.name}</h3>
<p className="text-gray-600">{user.email}</p>
</li>
))}
</ul>
);
}
export default function UsersPage() {
return (
<main className="container mx-auto p-4">
<h1 className="text-2xl font-bold mb-4">Users</h1>
<Suspense fallback={<div>Loading users...</div>}>
<UserList />
</Suspense>
</main>
);
}
Client Component with Form
'use client';
import { useState, useTransition } from 'react';
import { useRouter } from 'next/navigation';
import { createUser } from './actions';
export function CreateUserForm() {
const router = useRouter();
const [isPending, startTransition] = useTransition();
const [error, setError] = useState<string | null>(null);
async function handleSubmit(formData: FormData) {
setError(null);
startTransition(async () => {
const result = await createUser(formData);
if (result.error) {
setError(result.error);
} else {
router.push('/users');
router.refresh();
}
});
}
return (
<form action={handleSubmit} className="space-y-4">
{error && <div className="text-red-600">{error}</div>}
<input
name="name"
placeholder="Name"
required
className="w-full p-2 border rounded"
/>
<input
name="email"
type="email"
placeholder="Email"
required
className="w-full p-2 border rounded"
/>
<button
type="submit"
disabled={isPending}
className="w-full p-2 bg-blue-600 text-white rounded disabled:opacity-50"
>
{isPending ? 'Creating...' : 'Create User'}
</button>
</form>
);
}
Server Action
// app/users/actions.ts
'use server';
import { revalidatePath } from 'next/cache';
import { z } from 'zod';
const CreateUserSchema = z.object({
name: z.string().min(1),
email: z.string().email(),
});
export async function createUser(formData: FormData) {
const validated = CreateUserSchema.safeParse({
name: formData.get('name'),
email: formData.get('email'),
});
if (!validated.success) {
return { error: 'Invalid input' };
}
try {
await fetch('https://api.example.com/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(validated.data),
});
revalidatePath('/users');
return { success: true };
} catch {
return { error: 'Failed to create user' };
}
}
Middleware
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('token')?.value;
// Protect dashboard routes
if (request.nextUrl.pathname.startsWith('/dashboard')) {
if (!token) {
return NextResponse.redirect(new URL('/login', request.url));
}
}
return NextResponse.next();
}
export const config = {
matcher: ['/dashboard/:path*'],
};
Tags
nextjs, react, app-router, server-components, fullstack
Compatibility
- Codex: ✅
- Claude Code: ✅