ImageResponse
يسمح لك مُنشئ ImageResponse
بإنشاء صور ديناميكية باستخدام JSX وCSS. هذا مفيد لإنشاء صور وسائل التواصل الاجتماعي مثل صور Open Graph وبطاقات Twitter وغيرها.
المرجع
المعاملات
المعاملات التالية متاحة لـ 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 والموضع المطلق، والخطوط المخصصة، ولف النص، والمركزة، والصور المتداخلة.
يرجى الرجوع إلى توثيق Satori للحصول على قائمة بميزات HTML وCSS المدعومة.
السلوك
- يستخدم
ImageResponse
@vercel/og، Satori، وResvg لتحويل HTML وCSS إلى PNG. - فقط flexbox ومجموعة فرعية من خصائص CSS مدعومة. التخطيطات المتقدمة (مثل
display: grid
) لن تعمل. - الحد الأقصى لحجم الحزمة هو
500KB
. يشمل حجم الحزمة JSX الخاص بك، وCSS، والخطوط، والصور، وأي أصول أخرى. إذا تجاوزت الحد، فكر في تقليل حجم أي أصول أو جلبها أثناء التشغيل. - فقط تنسيقات الخطوط
ttf
،otf
، وwoff
مدعومة. لتعظيم سرعة تحليل الخط، يُفضل استخدامttf
أوotf
بدلاً منwoff
.
أمثلة
معالجات المسار
يمكن استخدام 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 . |