Capítulo 141 de 456
Convenções de arquivo para definir as imagens que aparecem quando um link do site é compartilhado em redes sociais/apps de mensagem, via imagem estática ou geração por código.
opengraph-image: .jpg, .jpeg, .png, .gif, limite de 8MB; gera meta tags og:image*.twitter-image: mesmos formatos, limite de 5MB; gera meta tags twitter:image*.opengraph-image.alt.txt / twitter-image.alt.txt: arquivo .txt companheiro para definir o texto alternativo.opengraph-image.(js|ts|tsx) ou twitter-image.(js|ts|tsx) default-exportando função que retorna Response (tipicamente via ImageResponse de next/og).alt (string), size ({width, height}), contentType (MIME type).params prop: promise com os dynamic route params do segmento onde a imagem está colocada; se usar generateImageMetadata, também recebe id como promise.import { ImageResponse } from 'next/og'
export const alt = 'About Acme'
export const size = { width: 1200, height: 630 }
export const contentType = 'image/png'
export default async function Image({
params,
}: {
params: Promise<{ slug: string }>
}) {
const { slug } = await params
const post = await fetch(`https://.../posts/${slug}`).then((res) => res.json())
return new ImageResponse(
(
<div style={{ fontSize: 48, background: 'white', width: '100%', height: '100%', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
{post.title}
</div>
),
{ ...size }
)
}
import { ImageResponse } from 'next/og'
import { join } from 'node:path'
import { readFile } from 'node:fs/promises'
const logoData = await readFile(join(process.cwd(), 'logo.png'), 'base64')
const logoSrc = `data:image/png;base64,${logoData}`
export default async function Image() {
return new ImageResponse(
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
<img src={logoSrc} height="100" />
</div>
)
}
| File convention | Tipos suportados (imagem) |
|---|---|
opengraph-image | .jpg, .jpeg, .png, .gif |
twitter-image | .jpg, .jpeg, .png, .gif |
opengraph-image.alt / twitter-image.alt | .txt |
| Route | URL | params |
|---|---|---|
app/shop/opengraph-image.js | /shop | undefined |
app/shop/[slug]/opengraph-image.js | /shop/1 | Promise<{ slug: '1' }> |
app/shop/[tag]/[item]/opengraph-image.js | /shop/1/2 | Promise<{ tag: '1', item: '2' }> |
twitter-image acima de 5MB ou opengraph-image acima de 8MB faz o build falhar.ArrayBuffer para <img src> sem @ts-expect-error: não faz parte da spec HTML; o motor do next/og (Satori) suporta, mas o TypeScript reclama.generateImageMetadata permite múltiplas variações de imagem no mesmo arquivo.opengraph-image/twitter-image são Route Handlers especiais que aceitam as mesmas opções de Route Segment Config de páginas/layouts.