--- name: nextjs-optimization description: Optimize Next.js 15 applications for performance, Core Web Vitals, and production best practices using App Router patterns version: 1.0.0 author: AI-Vibe-Prompts tags: [nextjs, performance, optimization, react, app-router] framework: nextjs auto_invoke: true --- # Next.js 15 Optimization Skill ## Objective Optimize Next.js applications to achieve: - Perfect Core Web Vitals scores (LCP < 2.5s, FID < 100ms, CLS < 0.1) - Fast page load times and optimal rendering strategies - Efficient data fetching and caching - Production-ready build configuration - SEO and accessibility excellence ## When to Use This Skill Auto-invoke when: - Project uses Next.js (detected by `next` in dependencies) - User mentions "optimize", "performance", "slow", or "Core Web Vitals" - Before production deployment - After adding new features or pages - User requests Next.js-specific improvements ## Prerequisites Check **Tools**: Read, Grep 1. **Verify Next.js version**: ```bash # Read package.json # Check for "next": "^15.0.0" or higher ``` 2. **Detect App Router** (Next.js 13+): - Check for `app/` directory - Check for `layout.tsx`, `page.tsx` files 3. **Detect Pages Router** (Legacy): - Check for `pages/` directory - Suggest migration to App Router ## Optimization Categories ### 1. Rendering Strategy Optimization **Goal**: Choose optimal rendering for each page/component **Tools**: Read, Grep, Edit #### 1.1 Server Components (Default in App Router) **When to use**: - Data fetching from APIs/databases - Heavy computation - Access to backend resources **Pattern**: ```typescript // app/dashboard/page.tsx export default async function DashboardPage() { const data = await fetchData(); // Runs on server return ; } ``` **Check for violations**: ```bash # Search for "use client" in components that don't need it grep -r "use client" app/ | grep -v "onClick\|useState\|useEffect" ``` #### 1.2 Client Components **When to use**: - Interactive UI (onClick, forms) - Browser APIs (window, localStorage) - React hooks (useState, useEffect) **Pattern**: ```typescript // app/components/Counter.tsx 'use client'; export default function Counter() { const [count, setCount] = useState(0); return ; } ``` **Optimization**: Keep client components small and leaf nodes #### 1.3 Static Generation (SSG) **When to use**: - Content that rarely changes - Marketing pages, blogs, documentation **Pattern**: ```typescript export const revalidate = 3600; // Revalidate every hour export default async function BlogPost({ params }) { const post = await getPost(params.slug); return
; } ``` #### 1.4 Dynamic Rendering with ISR **When to use**: - Content that changes periodically - E-commerce products, user profiles **Pattern**: ```typescript export const revalidate = 60; // Revalidate every minute export async function generateStaticParams() { const products = await getProducts(); return products.map((p) => ({ slug: p.slug })); } ``` ### 2. Image Optimization **Goal**: Optimize images for performance and Core Web Vitals **Tools**: Grep, Read, Edit #### 2.1 Use Next.js Image Component **Find unoptimized images**: ```bash grep -rn "Hero image ``` #### 2.2 Configure Image Domains **Read next.config.js**: ```javascript module.exports = { images: { remotePatterns: [ { protocol: 'https', hostname: 'example.com', }, ], formats: ['image/avif', 'image/webp'], // Modern formats }, }; ``` #### 2.3 Lazy Loading Strategy - **priority**: Above-the-fold images (LCP candidates) - **loading="lazy"**: Below-the-fold images (default) ### 3. Font Optimization **Goal**: Eliminate FOUT/FOIT and improve font loading **Tools**: Read, Edit #### 3.1 Use next/font **Pattern**: ```typescript // app/layout.tsx import { Inter } from 'next/font/google'; const inter = Inter({ subsets: ['latin'], display: 'swap', // Prevent FOIT variable: '--font-inter', }); export default function RootLayout({ children }) { return ( {children} ); } ``` #### 3.2 Self-Hosted Fonts ```typescript import localFont from 'next/font/local'; const customFont = localFont({ src: './fonts/CustomFont.woff2', display: 'swap', variable: '--font-custom', }); ``` ### 4. Data Fetching Optimization **Goal**: Minimize waterfalls and optimize cache **Tools**: Read, Grep, Edit #### 4.1 Parallel Data Fetching **Anti-pattern** (Sequential): ```typescript const user = await getUser(); const posts = await getPosts(user.id); // Waits for user ``` **Optimized** (Parallel): ```typescript const [user, posts] = await Promise.all([ getUser(), getPosts(), ]); ``` #### 4.2 Streaming with Suspense **Pattern**: ```typescript import { Suspense } from 'react'; export default function Page() { return ( <>
}>