Capítulo 165 de 456
Customize o viewport inicial da página (theme-color, escala, color-scheme) via objeto estático viewport ou função dinâmica generateViewport, ambos exclusivos de Server Components.
Viewport para valores que não dependem de request.params ou dados externos.viewport e generateViewport no mesmo segmento.generateViewport cai pra request-time, a página bloqueia até resolver.// layout.tsx | page.tsx
import type { Viewport } from 'next'
export const viewport: Viewport = {
themeColor: 'black',
}
// app/layout.tsx - viewport dependente de dado externo cacheável
export async function generateViewport() {
'use cache'
const { width, initialScale } = await db.query('viewport-size')
return { width, initialScale }
}
use cache quando o viewport depende de dado externo mas não de runtime data.// app/layout.tsx - viewport com runtime data, envolto em Suspense
import { Suspense } from 'react'
import { cookies } from 'next/headers'
export async function generateViewport() {
const cookieJar = await cookies()
return { themeColor: cookieJar.get('theme-color')?.value }
}
export default function RootLayout({ children }) {
return (
<Suspense>
<html>
<body>{children}</body>
</html>
</Suspense>
)
}
<body> em Suspense pra sinalizar que a rota inteira é dinâmica.| Version | Changes |
|---|---|
| v14.0.0 | viewport e generateViewport introduzidos |
viewport, mais simples e sem custo de render dinâmico.use cache captura o viewport no shell estático quando não depende de runtime data.instant = false só no segmento que realmente precisa, para não invalidar a validação estática de descendentes.<head>.generateViewport em relação a runtime data.