Open Graph зураг
Найздаа холбоос илгээхэд Telegram, Facebook, Slack дотор автоматаар зураг, гарчиг, тайлбар бүхий preview харагддаг. Тэр preview-г Open Graph тохиргоо удирддаг. Next.js App Router дотор OG зургийг код ашиглан динамикаар үүсгэж болно — зурагч дуудах шаардлагагүй!
Статик OG зураг
Хамгийн энгийн арга: app/ директор дотор opengraph-image.png файл байрлуулна. Next.js автоматаар олж metadata-д нэмнэ — нэг ч мөр код бичихгүйгээр.
app/
├── opengraph-image.png → нүүр хуудасны OG зураг
├── courses/
│ └── opengraph-image.png → /courses хуудасны OG зураг
Зургийн хэмжээ: 1200 × 630 пиксел байхыг зөвлөдөг.
Динамик OG зураг — ImageResponse
opengraph-image.tsx файл үүсгэж React component дотор зургийг код ашиглан буудна. ImageResponse нь тэр component-г PNG зураг болгон хөрвүүлдэг:
// app/courses/[courseSlug]/opengraph-image.tsx
import { ImageResponse } from "next/og";
import { getCourse } from "@/lib/courses";
export const runtime = "edge";
export const size = { width: 1200, height: 630 };
export const contentType = "image/png";
interface Props {
params: Promise<{ courseSlug: string }>;
}
export default async function OgImage({ params }: Props) {
const { courseSlug } = await params;
const course = await getCourse(courseSlug);
return new ImageResponse(
<div
style={{
width: "100%",
height: "100%",
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
backgroundColor: "#0b1120",
color: "#f1f5f9",
fontFamily: "sans-serif",
padding: "60px",
}}
>
<div style={{ fontSize: 28, color: "#94a3b8", marginBottom: 16 }}>
Ulaanbaatar.app
</div>
<div style={{ fontSize: 64, fontWeight: "bold", textAlign: "center" }}>
{course?.title ?? "Курс"}
</div>
<div style={{ fontSize: 28, color: "#94a3b8", marginTop: 20 }}>
{course?.description ?? ""}
</div>
</div>,
);
}
Одоо /courses/javascript хуудасны холбоосыг Telegram-д илгээхэд "JavaScript үндэс" гэсэн гарчигтай, харанхуй дэвсгэртэй preview зураг автоматаар харагдана.
metadata дотор OG тохируулах
opengraph-image.tsx файл байгаа үед Next.js автоматаар OG meta tag нэмдэг. Гэхдээ илүү дэлгэрэнгүй тохируулах шаардлагатай бол metadata дотор гараар нэмнэ:
// app/courses/[courseSlug]/page.tsx
import { Metadata } from "next";
export async function generateMetadata({ params }: Props): Promise<Metadata> {
const { courseSlug } = await params;
const course = await getCourse(courseSlug);
return {
title: course?.title,
description: course?.description,
openGraph: {
title: course?.title,
description: course?.description,
url: `https://www.ulaanbaatar.app/courses/${courseSlug}`,
siteName: "Ulaanbaatar.app",
images: [
{
url: `https://www.ulaanbaatar.app/courses/${courseSlug}/opengraph-image`,
width: 1200,
height: 630,
},
],
type: "website",
},
twitter: {
card: "summary_large_image",
title: course?.title,
description: course?.description,
},
};
}
twitter.card: 'summary_large_image' гэдэг нь Twitter/X дээр том зурагтай preview харуулна.
Дараагийн хичээлд:
next/image component ашиглан зургийг хэрхэн автоматаар оновчлох, шахах, lazy load хийхийг сурна. Core Web Vitals оноог сайжруулах зургийн best practice-г ойлгоно.