cra-to-next-migration

Comprehensive guide for migrating Create React App (CRA) projects to Next.js. Use when migrating a CRA app, converting React Router to file-based routing, or adopting Next.js patterns like Server Components, App Router, or image optimization.

By vercel-labs · 739 installs

npx skills add vercel-labs/migration-skills --skill cra-to-next-migration

Source repository · Upstream listing

CRA to Next.js Migration Guide Comprehensive migration guide for converting Create React App projects to Next.js, covering routing, data fetching, components, styling, and deployment. Contains 148 rules across 17 categories, prioritized by migration impact. After a successful migration the application should work the same as it did before the migration. When to Apply Reference these guidelines when: Migrating an existing CRA application to Next.js Converting React Router routes to file based routing Adopting Server Components in a client heavy app Moving from client side rendering to SSR/SSG Updating environment variables for Next.js Optimizing images and fonts with Next.js built ins Version Policy Use Next.js 16.x or later. Do NOT use Next.js 14.x or 15.x. Before starting migration, check the current latest version: Use the latest version in your package.json with a caret for minor/patch updates. The minimum supported version for this migration guide is ^16.0.0 . Rule Categories by Priority Priority Category Impact Prefix Rules 1 Project Setup CRITICAL setup 6 2 Dependencies CRITICAL deps 1 3 Routing CRITICAL routing 17 4 Data Fetching CRITICAL data 11 5 Components HIGH components 9 6 Environment Variables HIGH env 6 7 Styling HIGH styling 12 8 Public Assets MEDIUM assets 5 9 Images MEDIUM images 8 10 Fonts MEDIUM fonts 6 11 SEO & Metadata MEDIUM seo 9 12 API Routes MEDIUM api 9 13 State Management MEDIUM state 8 14 Integrations MEDIUM integrations 1 15 Testing LOW testing 9 16 Build & Deploy LOW build 7 17 Common Gotchas HIGH gotchas 24 Quick Reference 1. Project Setup (CRITICAL) setup initial structure Convert CRA folder structure to Next.js App Router setup package json Update dependencies and scripts setup next config Create and configure next.config.js setup typescript Migrate TypeScript configuration setup eslint Update ESLint for Next.js setup gitignore Update .gitignore for Next.js 2. Dependencies (CRITICAL) deps react19 compatibility Upgrade dependencies for React 19 compatibility 3. Routing (CRITICAL) routing basic pages Convert components to file based routes routing dynamic routes Use [param] syntax for dynamic segments routing catch all routes Use [...slug] for catch all routes routing optional catch all Use [[...slug]] for optional catch all routing route groups Use (group) folders for organization routing parallel routes Use @slot for parallel routes routing intercepting routes Use (..) for intercepting routes routing link component Replace react router Link with next/link routing programmatic navigation Replace useNavigate with useRouter routing use params Replace useParams with Next.js params routing use search params Replace useSearchParams properly routing nested layouts Convert nested routes to layouts routing loading states Add loading.tsx for suspense routing error boundaries Add error.tsx for error handling routing not found Add not found.tsx for 404 pages routing hash based Handle hash based routing for client only apps routing protected routes Implement protected route patterns 4. Data Fetching (CRITICAL) data useeffect to rsc Convert useEffect fetches to Server Components data useeffect to ssr Convert useEffect to getServerSideProps data useeffect to ssg Convert useEffect to getStaticProps data client fetch Keep client fetches with proper patterns data server actions Use Server Actions for mutations data revalidation Configure data revalidation strategies data streaming Use Suspense for streaming data data parallel fetching Fetch data in parallel on server data sequential fetching Handle sequential data dependencies data caching Configure fetch caching behavior data client library init Initialize client only libraries in useEffect 5. Components (HIGH) components use client Add 'use client' directive for client components components server default Understand server components are default components boundary placement Place client boundaries strategically components composition Use composition to minimize client JS components interleaving Interleave server and client components components props serialization Ensure props are serializable components children pattern Pass server components as children components context providers Handle Context providers properly components third party Wrap third party client components 6. Environment Variables (HIGH) env prefix change Change REACT APP to NEXT PUBLIC env server only Use non prefixed vars for server only env runtime config Use runtime configuration when needed env local files Understand .env file loading order env build time Understand build time vs runtime env vars env validation Validate required environment variables 7. Styling (HIGH) styling global css Move global CSS to app/layout.tsx styling css modules CSS Modules work with minor changes styling sass Configure Sass support styling tailwind Configure Tailwind CSS styling css in js Handle CSS in JS libraries styling styled components Configure styled components for SSR styling emotion Configure Emotion for SSR styling component styles Import component styles properly styling postcss Configure PostCSS styling scss global syntax Use :global only in CSS Modules styling css import order Control CSS import order in layouts styling dark mode hydration Handle dark mode without hydration mismatch 8. Public Assets (MEDIUM) assets public folder Public folder works the same way assets static imports Use static imports for assets assets absolute urls Reference assets without public prefix assets favicon Place favicon in app directory assets manifest Configure web app manifest 9. Images (MEDIUM) images next image Replace img with next/image images required dimensions Provide width and height images fill prop Use fill for responsive images images priority Use priority for LCP images images placeholder Configure blur placeholders images remote patterns Configure remote image domains images loader Configure custom image loaders images optimization Understand automatic optimization 10. Fonts (MEDIUM) fonts next font Use next/font for optimization fonts google fonts Load Google Fonts properly fonts local fonts Load local font files fonts variable fonts Configure variable fonts fonts font display Configure font display strategy fonts preload Understand automatic font preloading 11. SEO & Metadata (MEDIUM) seo metadata api Use Metadata API instead of react helmet seo dynamic metadata Generate dynamic metadata seo opengraph Configure Open Graph metadata seo twitter cards Configure Twitter Card metadata seo json ld Add structured data (JSON LD) seo canonical Set canonical URLs seo robots Configure robots meta tags seo sitemap Generate sitemap.xml seo head component Migrate from next/head to Metadata 12. API Routes (MEDIUM) api route handlers Create Route Handlers in app/api api http methods Export named functions for HTTP methods api request body Parse request body properly api query params Access query parameters api headers cookies Access headers and cookies api response types Return proper response types api middleware Implement middleware patterns api cors Configure CORS properly api rate limiting Implement rate limiting 13. State Management (MEDIUM) state context client Context requires 'use client' state zustand Zustand works with hydration care state redux Configure Redux with Next.js state jotai Configure Jotai properly state recoil Configure Recoil properly state url state Use URL for shareable state state server state Minimize client state with RSC state persistence Handle state persistence 14. Integrations (MEDIUM) integrations sentry Migrate Sentry error monitoring 15. Testing (LOW) testing jest config Update Jest configuration testing react testing library RTL works the same testing server components Test Server Components testing client components Test Client Components testing async components Test async components testing mocking Mock Next.js modules testing e2e cypress Configure Cypress for Next.js testing e2e playwright Configure Playwright for Next.js testing api routes Test API Route Handlers 16. Build & Deployment (LOW) build scripts Update build scripts build output Understand build output build standalone Configure standalone output build static export Configure static export build bundle analysis Analyze bundle size build vercel Deploy to Vercel build docker Configure Docker deployment 17. Common Gotchas (HIGH) gotchas window undefined Handle window/document in SSR gotchas hydration mismatch Fix hydration mismatches gotchas use effect timing Understand useEffect in Next.js gotchas router ready Check router.isReady for query params gotchas dynamic imports Use next/dynamic properly gotchas api routes edge Edge vs Node.js runtime gotchas middleware Middleware runs on edge gotchas static generation Static vs dynamic rendering gotchas redirect Handle redirects properly gotchas headers Set response headers gotchas cookies Handle cookies in RSC gotchas turbopack Handle Turbopack compatibility issues gotchas empty modules Fix empty module exports for isolatedModules gotchas nullish coalescing Fix nullish coalescing runtime errors gotchas react19 class components Fix React 19 class component this binding gotchas react19 ref prop Handle React 19 ref prop changes gotchas websocket optional deps Handle WebSocket native dependency bundling gotchas auth race conditions Guard against auth/API race conditions gotchas auth state gating Wait for auth state before checking roles gotchas configuration idempotency Ensure configuration idempotency with useRef gotchas hydration nested interactive Avoid nested interactive elements gotchas router push timing Never call router.push during render gotchas infinite rerender Prevent infinite re render loops gotchas provider hierarchy Configure provider hierarchy correctly Pre Migration Checklist Before starting migration, scan the codebase for patterns that need special handling: Scan Results to Rule Mapping: Scan Result Rules to Read socket.io or ws in package.json gotchas websocket optional deps , setup next config :export in SCSS files gotchas turbopack