Capítulo 312 de 456
Migração incremental de CRA pra Next.js: primeiro vira uma SPA rodando em cima do App Router (catch-all route + Client Component), depois adota features server-side aos poucos.
output: 'export' + distDir: 'build': config inicial em next.config.ts pra gerar SPA estática, mantendo estrutura de output parecida com CRA (sem SSR/API por enquanto).public/index.html: app/layout.tsx recebe o conteúdo de <html>/<head>/<body> do index.html, substituindo body div#root por <div id="root">{children}</div>.charset/viewport; favicon/ícones colocados no topo de app são detectados automaticamente (Metadata API), dispensando <link> manual.[[...slug]]: app/[[...slug]]/page.tsx com generateStaticParams retornando [{ slug: [''] }] intercepta todas as rotas numa única página, preservando o roteador client-side existente (React Router) durante a migração.app/[[...slug]]/client.tsx com 'use client' + dynamic(() => import('../../App'), { ssr: false }) embala o App root do CRA como Client Component sem SSR.{ src, width, height }), então <img src={logo} /> vira <img src={logo.src} /> (ou usar <Image> diretamente).REACT_APP_ → NEXT_PUBLIC_: prefixo de env var exposta ao client muda de nome.next dev usa Turbopack; next dev --webpack reproduz o bundler do CRA se precisar de config webpack customizada.basePath: substitui o campo homepage do package.json do CRA pra servir sob subpath.rewrites(): substitui o campo proxy do CRA pra encaminhar requests de API pro backend.'use client'
import dynamic from 'next/dynamic'
const App = dynamic(() => import('../../App'), { ssr: false })
export function ClientOnly() {
return <App />
}
const nextConfig: NextConfig = {
output: 'export', // Outputs a Single-Page Application (SPA)
distDir: 'build', // Changes the build output directory to `build`
}
| CRA | Next.js |
|---|---|
public/index.html | app/layout.tsx |
src/index.tsx (entrypoint) | app/[[...slug]]/page.tsx + client.tsx |
| Import de imagem → string | Import de imagem → objeto (.src) |
REACT_APP_* | NEXT_PUBLIC_* |
homepage no package.json | basePath no next.config.ts |
proxy no package.json | rewrites() no next.config.ts |
react-scripts | next dev/next build/next start |
<Image> direto sem ajustar dimensões: componente seta width/height automaticamente; se só uma dimensão for estilizada (sem auto na outra), a imagem pode distorcer. Manter <img> com .src até migrar com calma.next-env.d.ts no tsconfig.json: gera erro de tipo ao acessar .src de imagem importada..src se mantiver <img>.output: 'export' remove acesso a features server-side (SSR, API Routes) até ser removido do config.REACT_APP_ pra NEXT_PUBLIC_.