UNPKG

agent-rules-kit

Version:

Bootstrap of **Cursor** rules (`.mdc`) and mirror documentation (`.md`) for AI agent-guided projects.

368 lines (285 loc) 9.21 kB
--- description: Core architectural concepts for Next.js applications globs: <root>/app/**/*.ts,<root>/app/**/*.tsx,<root>/src/**/*.ts,<root>/src/**/*.tsx,<root>/pages/api/**/*.ts,<root>/tests/**/*.ts,<root>/tests/**/*.tsx alwaysApply: false --- # Next.js Architecture Concepts This document outlines the core architectural concepts and patterns used in Next.js applications in {projectPath}. ## Rendering Paradigms Next.js supports multiple rendering approaches: ### Server-Side Rendering (SSR) - Pages rendered on the server for each request - Better SEO and initial load performance - Implemented with `getServerSideProps()` - Ideal for pages with frequently changing data or user-specific content ```jsx // SSR Example export async function getServerSideProps(context) { const { req, res, query } = context; const data = await fetchData(query.id); return { props: { data }, }; } ``` ### Static Site Generation (SSG) - Pages generated at build time - Fastest performance and optimal caching - Implemented with `getStaticProps()` and optionally `getStaticPaths()` - Ideal for content that doesn't change frequently ```jsx // SSG Example export async function getStaticProps() { const posts = await fetchPosts(); return { props: { posts }, // Re-generate at most once per hour revalidate: 3600, }; } export async function getStaticPaths() { const posts = await fetchPosts(); const paths = posts.map((post) => ({ params: { slug: post.slug }, })); return { paths, fallback: 'blocking', // or true or false }; } ``` ### Incremental Static Regeneration (ISR) - Static generation with time-based revalidation - Combines benefits of SSG and SSR - Uses `revalidate` property in `getStaticProps()` - Ideal for content that changes occasionally ### Client-Side Rendering (CSR) - Components render on client after JavaScript loads - Used for highly interactive parts of the application - Combined with other rendering methods for optimal UX - Implemented with SWR or React Query for data fetching ```jsx // CSR Example with SWR import useSWR from 'swr'; function Profile() { const { data, error } = useSWR('/api/user', fetcher); if (error) return <div>Failed to load</div>; if (!data) return <div>Loading...</div>; return <div>Hello {data.name}!</div>; } ``` ## App Router vs Pages Router Next.js offers two routing systems: ### App Router Architecture (Next.js 13+) - File-system based routing in the `app/` directory - Support for React Server Components - Nested layouts and parallel routes - Server-centric data fetching - Streaming and partial rendering ``` app/ ├── layout.tsx # Root layout (applied to all routes) ├── page.tsx # Homepage ├── blog/ ├── layout.tsx # Blog layout ├── page.tsx # Blog index └── [slug]/ └── page.tsx # Blog post page └── dashboard/ ├── layout.tsx # Dashboard layout └── page.tsx # Dashboard page ``` ### Pages Router Architecture (Traditional) - File-system based routing in the `pages/` directory - API routes in `pages/api/` - Higher-level routing components like `Link` and `router` ``` pages/ ├── index.js # Homepage ├── _app.js # Custom App component ├── _document.js # Custom Document ├── blog/ ├── index.js # Blog index └── [slug].js # Blog post page └── api/ # API Routes └── hello.js ``` ## Server Components vs Client Components ### Server Components - Render on the server - Reduce client-side JavaScript - Direct database/filesystem access - Marked by default in App Router ```jsx // Server Component import { db } from '@/lib/db'; export default async function Posts() { const posts = await db.posts.findMany(); return ( <ul> {posts.map((post) => ( <li key={post.id}>{post.title}</li> ))} </ul> ); } ``` ### Client Components - Render on the client - Support interactivity and React hooks - Marked with 'use client' directive - Hydrated on the client ```jsx 'use client'; import { useState } from 'react'; export default function Counter() { const [count, setCount] = useState(0); return ( <div> <p>Count: {count}</p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); } ``` ## Data Fetching Patterns ### App Router Data Fetching - Fetch data directly in Server Components - Use React Cache for request deduplication - Component-level fetching - Support for parallel data fetching ```jsx // Server Component data fetching async function getData() { const res = await fetch('https://api.example.com/data'); if (!res.ok) throw new Error('Failed to fetch data'); return res.json(); } export default async function Page() { const data = await getData(); return <main>{/* Use data */}</main>; } ``` ### Pages Router Data Fetching - `getServerSideProps` for SSR - `getStaticProps` for SSG - SWR/React Query for client-side data fetching ## Project Structure ### Recommended App Router Structure ``` src/ ├── app/ # App Router routes ├── layout.tsx ├── page.tsx └── [route]/ ├── components/ # Shared components ├── ui/ # UI components └── features/ # Feature components ├── lib/ # Utility functions └── db.ts # Database client ├── models/ # Data models ├── services/ # External services └── styles/ # Global styles ``` ### Recommended Pages Router Structure ``` src/ ├── pages/ # Pages Router routes ├── index.js ├── _app.js └── api/ ├── components/ # Shared components ├── hooks/ # Custom hooks ├── context/ # React context ├── lib/ # Utility functions ├── services/ # External services └── styles/ # Global styles ``` ## State Management in Next.js ### Server-Side State - Fetch data on the server and pass as props - Database queries in Server Components - Server Actions for mutations (App Router) ### Client-Side State - React state and context for local UI state - SWR/React Query for remote state management - Redux/Zustand for complex global state ## API and Backend Integration ### API Routes (Pages Router) ```jsx // pages/api/users.js export default async function handler(req, res) { if (req.method === 'GET') { const users = await db.users.findMany(); res.status(200).json(users); } else { res.setHeader('Allow', ['GET']); res.status(405).end(`Method ${req.method} Not Allowed`); } } ``` ### Route Handlers (App Router) ```jsx // app/api/users/route.js import { NextResponse } from 'next/server'; export async function GET() { const users = await db.users.findMany(); return NextResponse.json(users); } ``` ### Server Actions (App Router) ```jsx 'use server'; export async function createUser(formData) { const name = formData.get('name'); const email = formData.get('email'); await db.users.create({ data: { name, email } }); return { success: true }; } ``` ## Authentication Patterns ### Next.js Authentication Options - **NextAuth.js**: Full-featured auth solution - **Auth.js**: Evolution of NextAuth.js - **Custom Auth**: Roll your own with cookies/JWTs - **Auth Providers**: Firebase, Supabase, Clerk, etc. ### Auth Implementation ```jsx // With Auth.js (NextAuth.js) // pages/api/auth/[...nextauth].js import NextAuth from 'next-auth'; import Providers from 'next-auth/providers'; export default NextAuth({ providers: [ Providers.GitHub({ clientId: process.env.GITHUB_ID, clientSecret: process.env.GITHUB_SECRET, }), // More providers... ], database: process.env.DATABASE_URL, session: { jwt: true, }, // Custom pages, callbacks, etc. }); ``` ## Performance Optimizations 1. **Image Optimization**: Use Next.js `Image` component 2. **Font Optimization**: Built-in font optimization 3. **Script Optimization**: Next.js `Script` component 4. **Route Prefetching**: Automatic with `Link` component 5. **Bundle Analysis**: `@next/bundle-analyzer` ## Deployment Models 1. **Vercel**: Optimized deployment for Next.js 2. **Self-hosted**: Node.js server 3. **Static Export**: Export as static site 4. **Container**: Docker deployment 5. **Edge**: Edge runtime for specific features ## Architecture Decision Framework Consider these factors when making architecture decisions: 1. **Rendering Strategy**: Choose based on content type and update frequency 2. **Routing System**: App Router vs Pages Router based on requirements 3. **State Management**: Choose based on complexity and team familiarity 4. **API Strategy**: API routes, Route Handlers, or external API 5. **Authentication**: Based on security needs and user experience