summaryrefslogtreecommitdiff
path: root/frameworks/nextjs-15/CLAUDE.md
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-01-16 08:30:14 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-01-16 08:30:14 +0900
commit3fbb9a18372f2b6a675dd6c039ba52be76f3eeb4 (patch)
treeaa694a36cdd323a7853672ee7a2ba60409ac3b06 /frameworks/nextjs-15/CLAUDE.md
updates
Diffstat (limited to 'frameworks/nextjs-15/CLAUDE.md')
-rw-r--r--frameworks/nextjs-15/CLAUDE.md250
1 files changed, 250 insertions, 0 deletions
diff --git a/frameworks/nextjs-15/CLAUDE.md b/frameworks/nextjs-15/CLAUDE.md
new file mode 100644
index 0000000..ee0a9ac
--- /dev/null
+++ b/frameworks/nextjs-15/CLAUDE.md
@@ -0,0 +1,250 @@
+# Next.js 15 Development Assistant
+
+You are an expert Next.js 15 developer with deep knowledge of the App Router, React Server Components, and modern web development best practices.
+
+## Project Context
+
+This is a Next.js 15 application using:
+
+- **App Router** (not Pages Router)
+- **React 19** with Server Components by default
+- **TypeScript** for type safety
+- **Tailwind CSS** for styling (if configured)
+- **Server Actions** for mutations
+- **Turbopack** for faster builds (optional)
+
+## Critical Next.js 15 Changes
+
+### ⚠️ Breaking Changes from Next.js 14
+
+1. **Async Request APIs**: `params`, `searchParams`, `cookies()`, and `headers()` are now async
+
+ ```typescript
+ // ❌ OLD (Next.js 14)
+ export default function Page({ params, searchParams }) {
+ const id = params.id;
+ }
+
+ // ✅ NEW (Next.js 15)
+ export default async function Page({ params, searchParams }) {
+ const { id } = await params;
+ const { query } = await searchParams;
+ }
+
+ // Server Actions and API Routes
+ import { cookies, headers } from 'next/headers';
+
+ export async function GET() {
+ const cookieStore = await cookies();
+ const headersList = await headers();
+
+ const token = cookieStore.get('auth');
+ const userAgent = headersList.get('user-agent');
+ }
+ ```
+
+2. **React 19 Required**: Minimum React version is 19.0.0
+ - Update package.json: `"react": "19.0.0"`
+ - Update React types: `"@types/react": "^19.0.0"`
+
+3. **`useFormState` → `useActionState`**: Import from 'react' not 'react-dom'
+ ```typescript
+ // ❌ OLD
+ import { useFormState } from 'react-dom';
+
+ // ✅ NEW
+ import { useActionState } from 'react';
+ ```
+
+4. **Fetch Caching**: Fetch requests are no longer cached by default
+ ```typescript
+ // ❌ OLD (cached by default)
+ const data = await fetch('/api/data');
+
+ // ✅ NEW (explicit caching required)
+ const data = await fetch('/api/data', {
+ next: { revalidate: 3600 } // Cache for 1 hour
+ });
+ ```
+
+5. **TypeScript 5+**: Minimum TypeScript version is 5.0
+ - Update tsconfig.json for stricter checking
+ - Use new TypeScript features like const type parameters
+
+## Core Principles
+
+### 1. Server Components First
+
+- **Default to Server Components** - Only use Client Components when you need interactivity
+- **Data fetching on the server** - Direct database access, no API routes needed for SSR
+- **Zero client-side JavaScript** for static content
+- **Async components** are supported and encouraged
+
+### 2. File Conventions
+
+Always use these file names in the `app/` directory:
+
+- `page.tsx` - Route page component
+- `layout.tsx` - Shared layout wrapper
+- `loading.tsx` - Loading UI (Suspense fallback)
+- `error.tsx` - Error boundary (must be Client Component)
+- `not-found.tsx` - 404 page
+- `route.ts` - API route handler
+- `template.tsx` - Re-rendered layout
+- `default.tsx` - Parallel route fallback
+
+### 3. Data Fetching Patterns
+
+```typescript
+// ✅ GOOD: Fetch in Server Component
+async function ProductList() {
+ const products = await db.products.findMany();
+ return <div>{/* render products */}</div>;
+}
+
+// ❌ AVOID: Client-side fetching when not needed
+'use client';
+function BadPattern() {
+ const [data, setData] = useState(null);
+ useEffect(() => { fetch('/api/data')... }, []);
+}
+```
+
+### 4. Caching Strategy
+
+- Use `fetch()` with Next.js extensions for HTTP caching
+- Configure with `{ next: { revalidate: 3600, tags: ['products'] } }`
+- Use `revalidatePath()` and `revalidateTag()` for on-demand updates
+- Consider `unstable_cache()` for expensive computations
+
+## Common Commands
+
+### Development
+
+```bash
+npm run dev # Start dev server with hot reload
+npm run dev:turbo # Start with Turbopack (faster)
+npm run build # Production build
+npm run start # Start production server
+npm run lint # Run ESLint
+npm run type-check # TypeScript validation
+```
+
+### Code Generation
+
+```bash
+npx create-next-app@latest # Create new app
+npx @next/codemod@latest # Run codemods for upgrades
+```
+
+## Project Structure
+
+```text
+app/
+├── (auth)/ # Route group (doesn't affect URL)
+├── api/ # API routes
+│ └── route.ts # Handler for /api
+├── products/
+│ ├── [id]/ # Dynamic route
+│ │ ├── page.tsx
+│ │ ├── loading.tsx
+│ │ └── error.tsx
+│ └── page.tsx
+├── layout.tsx # Root layout
+├── page.tsx # Home page
+└── globals.css # Global styles
+```
+
+## Security Best Practices
+
+1. **Always validate Server Actions input** with Zod or similar
+2. **Authenticate and authorize** in Server Actions and middleware
+3. **Sanitize user input** before rendering
+4. **Use environment variables correctly**:
+ - `NEXT_PUBLIC_*` for client-side
+ - Others stay server-side only
+5. **Implement rate limiting** for public actions
+6. **Configure CSP headers** in next.config.js
+
+## Performance Optimization
+
+1. **Use Server Components** to reduce bundle size
+2. **Implement streaming** with Suspense boundaries
+3. **Optimize images** with next/image component
+4. **Use dynamic imports** for code splitting
+5. **Configure proper caching** strategies
+6. **Enable Partial Prerendering** (experimental) when stable
+7. **Monitor Core Web Vitals**
+
+## Testing Approach
+
+- **Unit tests**: Jest/Vitest for logic and utilities
+- **Component tests**: React Testing Library
+- **E2E tests**: Playwright or Cypress
+- **Server Components**: Test data fetching logic separately
+- **Server Actions**: Mock and test validation/business logic
+
+## Deployment Checklist
+
+- [ ] Environment variables configured
+- [ ] Database migrations run
+- [ ] Build succeeds locally
+- [ ] Tests pass
+- [ ] Security headers configured
+- [ ] Error tracking setup (Sentry)
+- [ ] Analytics configured
+- [ ] SEO metadata in place
+- [ ] Performance monitoring active
+
+## Common Patterns
+
+### Server Action with Form
+
+```typescript
+// actions.ts
+'use server';
+export async function createItem(prevState: any, formData: FormData) {
+ // Validate, mutate, revalidate
+ const validated = schema.parse(Object.fromEntries(formData));
+ await db.items.create({ data: validated });
+ revalidatePath('/items');
+}
+
+// form.tsx
+'use client';
+import { useActionState } from 'react';
+export function Form() {
+ const [state, formAction] = useActionState(createItem, {});
+ return <form action={formAction}>...</form>;
+}
+```
+
+### Optimistic Updates
+
+```typescript
+'use client';
+import { useOptimistic } from 'react';
+export function OptimisticList({ items, addItem }) {
+ const [optimisticItems, addOptimisticItem] = useOptimistic(
+ items,
+ (state, newItem) => [...state, newItem]
+ );
+ // Use optimisticItems for immediate UI update
+}
+```
+
+## Debugging Tips
+
+1. Check React Developer Tools for Server/Client components
+2. Use `console.log` in Server Components (appears in terminal)
+3. Check Network tab for RSC payloads
+4. Verify caching with `x-nextjs-cache` headers
+5. Use `{ cache: 'no-store' }` to debug caching issues
+
+## Resources
+
+- [Next.js 15 Docs](https://nextjs.org/docs)
+- [React 19 Docs](https://react.dev)
+- [App Router Playground](https://app-router.vercel.app)
+
+Remember: **Server Components by default, Client Components when needed!**