Capítulo 94 de 456
Guia de upgrade de Next.js 14 para 15 — a versão que tornou cookies(), headers(), draftMode(), params e searchParams assíncronos, mudou defaults de cache de fetch/Route Handlers/Client Cache, e exige React 19.
upgrade: npx @next/codemod@canary upgrade latest automatiza a maior parte da migração, incluindo as Async Request APIs.useFormState foi substituído por useActionState (ainda disponível mas deprecated); useFormStatus ganhou chaves extras (data, method, action).cookies(), headers(), draftMode(), params (em layout/page/route/default/opengraph-image/twitter-image/icon/apple-icon) e searchParams (em page) passam de síncronos para assíncronos.cookies() as unknown as UnsafeUnwrappedCookies (e equivalentes para headers/draftMode) — funciona mas loga warning em dev; é ponte de migração, não solução definitiva.runtime: 'experimental-edge' removido: agora gera erro; usar runtime: 'edge'.fetch não cacheado por padrão: era cacheado por padrão antes; agora precisa cache: 'force-cache' explícito por request, ou export const fetchCache = 'default-cache' no segmento para aplicar a todos os fetches que não especificam cache próprio.GET não cacheados por padrão: usar export const dynamic = 'force-static' para opt-in.staleTimes (dynamic/static) em next.config.js.bundlePagesRouterDependencies: renomeação estável de experimental.bundlePagesExternals.serverExternalPackages: renomeação estável de experimental.serverComponentsExternalPackages.geo/ip removidos de NextRequest: use geolocation/ipAddress de @vercel/functions (codemod next-request-geo-ip disponível).import { cookies } from 'next/headers'
// Before
const cookieStore = cookies()
const token = cookieStore.get('token')
// After
const cookieStore = await cookies()
const token = cookieStore.get('token')
cookies() para assíncrono.// After
import { use } from 'react'
type Params = Promise<{ slug: string }>
export default function Layout(props: { children: React.ReactNode; params: Params }) {
const params = use(props.params)
const slug = params.slug
}
use() do React para desembrulhar params (agora uma Promise) em vez de await.export const fetchCache = 'default-cache'
export default async function RootLayout() {
const a = await fetch('https://...') // Cached
const b = await fetch('https://...', { cache: 'no-store' }) // Not cached
}
cache próprio.const nextConfig = {
experimental: {
staleTimes: { dynamic: 30, static: 180 },
},
}
staleTimes.UnsafeUnwrappedCookies etc.) como solução permanente: gera warning em dev e é só ponte de migração — migre para await/use().fetch ainda é cacheado por padrão como na v14: mudança silenciosa de comportamento pode gerar dados desatualizados sendo tratados como sempre frescos, ou o oposto (perda de cache esperado).geo/ip de NextRequest: removidos; migrar para @vercel/functions ou provedor equivalente.fetch, Route Handlers GET, e Client Cache de páginas — todos passam de "cacheado" para "não cacheado" por padrão.runtime = 'experimental-edge' virou erro rígido; só edge é aceito.next-async-request-api, app-dir-runtime-config-experimental-edge e next-request-geo-ip automatizam partes desta migração.