ImageResponse
Конструктор ImageResponse
позволяет генерировать динамические изображения с использованием JSX и CSS. Это полезно для создания изображений для социальных сетей, таких как Open Graph, Twitter Cards и других.
Справочник
Параметры
Для ImageResponse
доступны следующие параметры:
import { ImageResponse } from 'next/og'
new ImageResponse(
element: ReactElement,
options: {
width?: number = 1200
height?: number = 630
emoji?: 'twemoji' | 'blobmoji' | 'noto' | 'openmoji' = 'twemoji',
fonts?: {
name: string,
data: ArrayBuffer,
weight: number,
style: 'normal' | 'italic'
}[]
debug?: boolean = false
// Опции, которые будут переданы в HTTP-ответ
status?: number = 200
statusText?: string
headers?: Record<string, string>
},
)
Примеры доступны в Vercel OG Playground.
Поддерживаемые возможности HTML и CSS
ImageResponse
поддерживает распространённые CSS-свойства, включая flexbox и абсолютное позиционирование, пользовательские шрифты, перенос текста, выравнивание по центру и вложенные изображения.
Полный список поддерживаемых возможностей HTML и CSS можно найти в документации Satori.
Поведение
ImageResponse
использует @vercel/og, Satori и Resvg для преобразования HTML и CSS в PNG.- Поддерживаются только flexbox и подмножество CSS-свойств. Расширенные макеты (например,
display: grid
) не работают. - Максимальный размер бандла —
500KB
. Размер бандла включает ваш JSX, CSS, шрифты, изображения и другие ресурсы. Если вы превысите лимит, попробуйте уменьшить размер ресурсов или загружать их во время выполнения. - Поддерживаются только форматы шрифтов
ttf
,otf
иwoff
. Для максимальной скорости обработки предпочтительнее использоватьttf
илиotf
вместоwoff
.
Примеры
Обработчики маршрутов (Route Handlers)
ImageResponse
можно использовать в обработчиках маршрутов для динамической генерации изображений во время запроса.
import { ImageResponse } from 'next/og'
export async function GET() {
try {
return new ImageResponse(
(
<div
style={{
height: '100%',
width: '100%',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'white',
padding: '40px',
}}
>
<div
style={{
fontSize: 60,
fontWeight: 'bold',
color: 'black',
textAlign: 'center',
}}
>
Welcome to My Site
</div>
<div
style={{
fontSize: 30,
color: '#666',
marginTop: '20px',
}}
>
Generated with Next.js ImageResponse
</div>
</div>
),
{
width: 1200,
height: 630,
}
)
} catch (e) {
console.log(`${e.message}`)
return new Response(`Failed to generate the image`, {
status: 500,
})
}
}
Метаданные на основе файлов
Вы можете использовать ImageResponse
в файле opengraph-image.tsx
для генерации Open Graph изображений во время сборки или динамически во время запроса.
import { ImageResponse } from 'next/og'
// Метаданные изображения
export const alt = 'My site'
export const size = {
width: 1200,
height: 630,
}
export const contentType = 'image/png'
// Генерация изображения
export default async function Image() {
return new ImageResponse(
(
// Элемент JSX для ImageResponse
<div
style={{
fontSize: 128,
background: 'white',
width: '100%',
height: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
>
My site
</div>
),
// Опции ImageResponse
{
// Для удобства можно повторно использовать экспортированные настройки
// размера opengraph-image для установки ширины и высоты ImageResponse.
...size,
}
)
}
Пользовательские шрифты
Вы можете использовать пользовательские шрифты в ImageResponse
, указав массив fonts
в опциях.
import { ImageResponse } from 'next/og'
import { readFile } from 'node:fs/promises'
import { join } from 'node:path'
// Метаданные изображения
export const alt = 'My site'
export const size = {
width: 1200,
height: 630,
}
export const contentType = 'image/png'
// Генерация изображения
export default async function Image() {
// Загрузка шрифта, process.cwd() — директория проекта Next.js
const interSemiBold = await readFile(
join(process.cwd(), 'assets/Inter-SemiBold.ttf')
)
return new ImageResponse(
(
// ...
),
// Опции ImageResponse
{
// Для удобства можно повторно использовать экспортированные настройки
// размера opengraph-image для установки ширины и высоты ImageResponse.
...size,
fonts: [
{
name: 'Inter',
data: interSemiBold,
style: 'normal',
weight: 400,
},
],
}
)
}
История версий
Версия | Изменения |
---|---|
v14.0.0 | ImageResponse перемещён из next/server в next/og |
v13.3.0 | ImageResponse можно импортировать из next/server . |
v13.0.0 | ImageResponse добавлен через пакет @vercel/og . |