Capítulo 313 de 456
Migração de app Vite pra Next.js segue o mesmo padrão "SPA primeiro" da migração de CRA: index.html vira root layout, main.tsx vira catch-all route com Client Component, e só depois se adota App Router de verdade.
next.config.mjs com output: 'export' + distDir: './dist': mantém output parecido com Vite, sem SSR ainda.tsconfig.json: precisa remover referência a tsconfig.node.json, incluir ./dist/types/**/*.ts + ./next-env.d.ts, excluir node_modules, adicionar plugin { "name": "next" }, e setar esModuleInterop, jsx: "react-jsx", allowJs, forceConsistentCasingInFileNames, incremental todos true.index.html: mesmo padrão do CRA, app/layout.tsx recebe <html>/<head>/<body> do index.html do Vite, trocando div#root por <div id="root">{children}</div>.[[...slug]]: page.tsx (Server Component, prerenderizado) importa o CSS global e usa generateStaticParams retornando [{ slug: [''] }]; client.tsx ('use client') usa dynamic(() => import('../../App'), { ssr: false }) pra rodar o app Vite original client-only.<img src={logo} /> vira <img src={logo.src} />.VITE_ → NEXT_PUBLIC_: prefixo de env var exposta ao client.import.meta.env.MODE/DEV/PROD/BASE_URL/SSR e import.meta.glob funcionam sem mudança; mas queries ?raw/?url do Vite exigem regra customizada em next.config.ts (turbopack.rules).basePath: equivalente ao base URL customizado do Vite.import '../../index.css'
import { ClientOnly } from './client'
export function generateStaticParams() {
return [{ slug: [''] }]
}
export default function Page() {
return <ClientOnly />
}
const nextConfig: NextConfig = {
turbopack: {
rules: {
'*': { condition: { query: '?raw' }, type: 'text' },
},
},
}
?raw do Vite, que não tem equivalente nativo.| Vite | Next.js |
|---|---|
index.html | app/layout.tsx |
main.tsx | app/[[...slug]]/page.tsx + client.tsx |
| Import de imagem → string | Import de imagem → objeto (.src) |
VITE_* | NEXT_PUBLIC_* |
import.meta.glob({ as: 'raw' }) | import.meta.glob({ query: '?raw' }) + regra Turbopack |
| Base URL customizado | basePath |
?raw/?url do Vite funcionar sem config: Turbopack não tem handling nativo, precisa de turbopack.rules no next.config.ts.tsconfig.node.json referenciado: quebra a config do Next.js, precisa remover essa referência.<img> por <Image> cedo demais sem auto na dimensão não estilizada: mesmo risco de distorção descrito no guia de CRA.import.meta.env e import.meta.glob do Vite são amplamente compatíveis com Turbopack, exceto queries ?raw/?url.