# rsc-data-optimizer > Optimize Next.js App Router data fetching by converting slow client-side fetching to fast server-side fetching using React Server Components (RSC). Use when: - User reports slow initial page load with loading spinners - Page uses useEffect + useState for data fetching - StoreContext/useStore pattern causes waterfall fetching - Need to improve SEO (content not in initial HTML) - Converting "use client" pages to Server Components Triggers: "slow loading", "optimize fetching", "SSR data", "RSC optimization", "remove loading spinner", "server-side fetch", "convert to server component", "data fetch lambat", "loading lama" - Author: Microck - Repository: Microck/ordinary-claude-skills - Version: 20251204231419 - Stars: 126 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/Microck/ordinary-claude-skills - Web: https://mule.run/skillshub/@@Microck/ordinary-claude-skills~rsc-data-optimizer:20251204231419 --- --- name: rsc-data-optimizer description: | Optimize Next.js App Router data fetching by converting slow client-side fetching to fast server-side fetching using React Server Components (RSC). Use when: - User reports slow initial page load with loading spinners - Page uses useEffect + useState for data fetching - StoreContext/useStore pattern causes waterfall fetching - Need to improve SEO (content not in initial HTML) - Converting "use client" pages to Server Components Triggers: "slow loading", "optimize fetching", "SSR data", "RSC optimization", "remove loading spinner", "server-side fetch", "convert to server component", "data fetch lambat", "loading lama" --- # RSC Data Fetching Optimizer Optimize slow client-side data fetching to instant server-side rendering. ## Quick Diagnosis Search for these anti-patterns in the codebase: ```bash # Find client-side fetching patterns rg -n "useEffect.*fetch|useState.*loading|useStore\(\)" --type tsx rg -n '"use client"' app/ --type tsx ``` **Red flags:** - `"use client"` + `useEffect` + `fetch()` = slow initial load - `useState(true)` for `isLoading` = user sees spinner - `useStore()` or `useContext` for initial page data = waterfall fetching ## 3-Step Conversion Workflow ### Step 1: Identify Data Requirements Determine what data the page needs on initial render: - Static/rarely-changing data → **Server Component** (SSR) - User-interactive data (filters, search) → **Client Component** ### Step 2: Extract Interactive Sections Move sections with `useInView`, `useState`, `onClick` to separate Client Components: ```tsx // components/data-section.tsx "use client"; interface DataSectionProps { data: Item[]; // Receive data as props } export function DataSection({ data }: DataSectionProps) { const [ref, inView] = useInView(); // Client-side animation OK return