واجهة Metadata API وتحسين محركات البحث في App Router
صدّر كائنات metadata ثابتة وديناميكية لتعيين عناوين الصفحات وأوصافها وعلامات OG.
واجهة Metadata API وتحسين محركات البحث في App Router درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
أهمية البيانات الوصفية
تُحسّن البيانات الوصفية الجيدة، مثل العنوان والوصف ووسوم OG، ترتيب نتائج تحسين محركات البحث ومعاينات المشاركة على الشبكات الاجتماعية. يوفّر App Router في Next.js واجهة Metadata API آمنة الأنواع، وتُنشئ وسوم <head> على جهة الخادم.
تصدير البيانات الوصفية الثابتة
صدّر كائن metadata من أي page.tsx أو layout.tsx لتعيين الوسوم الثابتة لذلك المقطع.
import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'My App',
description: 'The best app ever built',
keywords: ['react', 'nextjs', 'typescript'],
};
export default function Page() { return <main>Hello</main>; }قوالب العناوين
استخدم title.template في تخطيط لكي تحصل الصفحات التابعة تلقائيًا على عنوان منسّق دون تكرار اسم الموقع.
// app/layout.tsx
export const metadata: Metadata = {
title: {
template: '%s | My App',
default: 'My App',
},
};
// app/about/page.tsx
export const metadata: Metadata = {
title: 'About', // renders as "About | My App"
};البيانات الوصفية الديناميكية باستخدام generateMetadata
صدّر دالة غير متزامنة باسم generateMetadata للمسارات التي تحتاج إلى وسوم تعتمد على البيانات، إذ تتلقى params والبيانات الوصفية للأب.
export async function generateMetadata({ params }: { params: { id: string } }): Promise<Metadata> {
const product = await getProduct(params.id);
return {
title: product.name,
description: product.summary,
openGraph: {
title: product.name,
images: [product.imageUrl],
},
};
}وسوم Open Graph
يعيّن المفتاح openGraph وسوم OG للمشاركة على Facebook وLinkedIn وSlack.
export const metadata: Metadata = {
openGraph: {
title: 'My Product',
description: 'Buy now!',
url: 'https://example.com/product',
siteName: 'My App',
images: [{ url: 'https://example.com/og.png', width: 1200, height: 630 }],
type: 'website',
locale: 'en_US',
},
};وسوم بطاقات Twitter
يعيّن المفتاح twitter البيانات الوصفية الخاصة ببطاقات Twitter لعرض معاينات غنية في التغريدات.
twitter: {
card: 'summary_large_image',
title: 'My Product',
description: 'Buy now!',
images: ['https://example.com/twitter.png'],
creator: '@myhandle',
},Robots والعنوان الأساسي
تحكّم في الزحف باستخدام robots، وعيّن عناوين URL أساسية لتجنّب العقوبات الناتجة عن المحتوى المكرر.
export const metadata: Metadata = {
robots: { index: true, follow: true, googleBot: { index: true } },
alternates: { canonical: 'https://example.com/products' },
};الأيقونات المفضلة والأيقونات
ضع ملفات الأيقونات في app/ باستخدام الأسماء المحجوزة مثل icon.png وapple-icon.png وfavicon.ico، أو صرّح بها في metadata.icons.
// Convention: place app/icon.png → auto-detected as favicon
// Or declare explicitly:
export const metadata: Metadata = {
icons: {
icon: '/icon.png',
apple: '/apple-icon.png',
shortcut: '/shortcut-icon.png',
},
};إنشاء صور OG باستخدام ImageResponse
استخدم ImageResponse من next/og داخل route.ts لإنشاء صور OG ديناميكية، مع عرض JSX بصيغة PNG.
// app/og/route.ts
import { ImageResponse } from 'next/og';
export async function GET(req: Request) {
const { searchParams } = new URL(req.url);
const title = searchParams.get('title') ?? 'Default';
return new ImageResponse(
<div style={{ fontSize: 48, background: '#fff', width: '100%', height: '100%' }}>
{title}
</div>,
{ width: 1200, height: 630 }
);
}البيانات المنظّمة (JSON-LD)
أضف البيانات المنظّمة بتنسيق JSON-LD من خلال إدراج وسم <script> في JSX الخاص بالصفحة. وهذا ليس جزءًا من Metadata API، لكنه يعمل إلى جانبها.
export default function ProductPage({ product }) {
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'Product',
name: product.name,
price: product.price,
};
return (
<>
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }} />
<h1>{product.name}</h1>
</>
);
}التحقق من البيانات الوصفية
استخدم أدوات المطوّر في المتصفح، مثل تبويب Network وعرض مصدر HTML، أو أدوات مثل opengraph.xyz للتحقق من عرض بياناتك الوصفية بشكل صحيح في HTML الصادر من الخادم.
تحقق سريع
أي ميزة في Metadata API ضمن Next.js تتيح للصفحات التابعة توريث لاحقة عنوان مشتركة وتخصيصها، مثل 'About | My App'؟
مراجعة
صدّر metadata للوسوم الثابتة، أو generateMetadata() للوسوم الديناميكية. استخدم title.template في التخطيطات لتجنّب تكرار العناوين، وعيّن openGraph وtwitter لمعاينات المشاركة الاجتماعية، واستخدم ImageResponse في معالج مسار لتقديم صور OG ديناميكية.
الأسئلة الشائعة
هل درس «واجهة Metadata API وتحسين محركات البحث في App Router» مجاني؟
نعم — نص درس «واجهة Metadata API وتحسين محركات البحث في App Router» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «واجهة Metadata API وتحسين محركات البحث في App Router»؟
صدّر كائنات metadata ثابتة وديناميكية لتعيين عناوين الصفحات وأوصافها وعلامات OG. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «واجهة Metadata API وتحسين محركات البحث في App Router»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- اصطلاحات ملفات App Router
- مكوّنات الخادم مقابل مكوّنات العميل في Next.js
- المسارات الديناميكية ومجموعات المسارات
- واجهة Metadata API وتحسين محركات البحث في App Router