جاري التحميل...
جاري التحميل...
next/image، next/font، Metadata API، OG images، SEO
مكون next/image يوفر تحسيناً تلقائياً للصور بما في ذلك التحميل الكسول، وإعادة التغيير الحجم، وتحويل الصيغة إلى WebP أو AVIF.
استخدام علامات <img> العادية يسبب العديد من المشاكل: لا يوجد تحميل كسول، لا يوجد تغيير حجم، لا يوجد تحويل صيغة.
وحدة next/font تحسّن الخطوط تلقائياً عن طريق تنزيلها وقت البناء واستضافتها مع أصولك الثابتة.
Next.js يوفر واجهة برمجة البيانات الوصفية لتحسين محركات البحث. صدّر كائن metadata أو دالة generateMetadata من page.js أو layout.js.
لماذا تستخدم next/image بدلاً من <img>؟
استبدل علامات <img> بـ next/image وقم بتكوين الخطوط باستخدام next/font.
الحل:
// استبدال جميع صور img بمكون next/image
import Image from "next/image";
// صورة محلية
<Image
src="/images/photo.jpg"
width={500}
height={300}
alt="وصف الصورة"
/>
// صورة في أعلى الصفحة مع priority
<Image
src="/images/hero.jpg"
width={1200}
height={600}
alt="صورة رئيسية"
priority
/>
// صورة ملء الحاوية
<div className="relative w-full h-64">
<Image
src="/images/cover.jpg"
alt="غلاف"
fill
className="object-cover"
sizes="100vw"
/>
</div>
// خط من next/font
import { Cairo } from "next/font/google";
const cairo = Cairo({
subsets: ["arabic", "latin"],
variable: "--font-cairo",
});
// Metadata ثابتة
export const metadata = {
title: "الصفحة الرئيسية - موقعي",
description: "مرحباً بكم في موقعنا",
openGraph: {
title: "موقعي",
description: "موقع تعليمي",
images: ["/og-image.jpg"],
},
};
// Metadata ديناميكية
export async function generateMetadata({ params }) {
const post = await getPost(params.slug);
return {
title: post.title,
description: post.excerpt,
};
}next/image - محلية:
import Image from "next/image";
<Image
src="/images/photo.jpg"
width={500}
height={300}
alt="وصف الصورة"
/>next/image - عن بُعد:
// next.config.ts
images: {
remotePatterns: [
{ protocol: "https", hostname: "example.com" }
]
}
// في الصفحة
<Image
src="https://example.com/photo.jpg"
width={500}
height={300}
alt="صورة عن بُعد"
/>next/font - من Google:
import { Cairo, Inter } from "next/font/google";
const cairo = Cairo({
subsets: ["arabic", "latin"],
variable: "--font-cairo",
});
const inter = Inter({
subsets: ["latin"],
variable: "--font-inter",
});
// في التخطيط
<body className={`${cairo.variable} ${inter.variable}`}>البيانات الوصفية:
// ثابتة
export const metadata = {
title: "عنوان الصفحة",
description: "وصف الصفحة",
openGraph: {
title: "عنوان OG",
description: "وصف OG",
images: ["/og-image.jpg"],
},
};
// ديناميكية
export async function generateMetadata({ params }) {
const post = await getPost(params.slug);
return {
title: post.title,
description: post.excerpt,
openGraph: { images: [post.image] },
};
}لماذا نستخدم next/image بدلاً من img العادي؟
الإجابة:
يوفر auto optimization و lazy loading و responsive images.
كيف تضيف metadata للصفحات؟
الإجابة:
استخدم دالة generateMetadata أو كائن metadata في ملف الصفحة.
استخدم next/font
لتحميل الخطوط محلياً وتحسين الأداء بدلاً من Google Fonts