SSG وSSR وISR
ولّد الصفحات ثابتًا وقت البناء، أو اعرضها على الخادم لكل طلب، أو أعد التحقق من الصفحات المخزنة مؤقتًا وفق جدول زمني باستخدام Incremental Static Regeneration
SSG وSSR وISR درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ثلاث استراتيجيات للتصيير
يدعم Next.js ثلاث طرق لتصيير الصفحات: SSG (التوليد الثابت للمواقع)، وSSR (التصيير على جانب الخادم)، وISR (إعادة التوليد الثابت التدريجي). ولكل منها مقايضات مختلفة.
SSG — التوليد وقت البناء
تُولَّد الصفحات بصيغة HTML ثابتة وقت البناء، وتُخدَّم من CDN. وهذا يوفّر أسرع تسليم ممكن. وهو مناسب للصفحات التسويقية والمدونات والوثائق.
SSG في Pages Router
صدّر getStaticProps من الصفحة. تعمل الدالة وقت البناء وتزوّد المكوّن بالخصائص.
// pages/blog/[slug].tsx
export async function getStaticPaths() {
const slugs = await fetchAllSlugs();
return { paths: slugs.map(s => ({ params: { slug: s } })), fallback: false };
}
export async function getStaticProps({ params }) {
const post = await fetchPost(params.slug);
return { props: { post } };
}SSG في App Router
تجلب مكوّنات الخادم غير المتزامنة البيانات وقت البناء افتراضيًا. استخدم generateStaticParams للمسارات الديناميكية.
// app/blog/[slug]/page.tsx
export async function generateStaticParams() {
const posts = await fetchAllPosts();
return posts.map(p => ({ slug: p.slug }));
}
export default async function Post({ params }) {
const post = await fetchPost(params.slug);
return <article>{post.body}</article>;
}SSR — التوليد لكل طلب
تُصيَّر الصفحات عند كل طلب. استخدم ذلك عندما يكون المحتوى خاصًا بكل مستخدم أو يتغير كثيرًا بحيث لا يناسب التخزين المؤقت.
SSR في Pages Router
صدّر getServerSideProps.
// pages/dashboard.tsx
export async function getServerSideProps({ req }) {
const userId = req.cookies.userId;
const data = await fetchUserDashboard(userId);
return { props: { data } };
}SSR في App Router
أجبر الصفحة على التصيير لكل طلب باستخدام dynamic = 'force-dynamic'، أو بقراءة ملفات تعريف الارتباط/الرؤوس (ما يؤدي تلقائيًا إلى تعطيل التصيير الثابت).
// app/dashboard/page.tsx
import { cookies } from 'next/headers';
export default async function Dashboard() {
const userId = cookies().get('userId')?.value;
const data = await fetchUserDashboard(userId);
return <pre>{JSON.stringify(data, null, 2)}</pre>;
}
// Or explicit:
export const dynamic = 'force-dynamic';ISR — أفضل ما في الطريقتين
ISR: قدّم صفحة ثابتة، لكن أعد توليدها في الخلفية كل N ثانية. فهي تجمع بين سرعة SSG وبيانات حديثة نسبيًا.
ISR في Pages Router
أضف revalidate إلى getStaticProps.
export async function getStaticProps() {
const posts = await fetchPosts();
return {
props: { posts },
revalidate: 60 // regenerate at most every 60 seconds
};
}ISR في App Router
استخدم next: { revalidate: N } ضمن خيارات fetch، أو عيّن export const revalidate = N في الصفحة.
// Option A: per fetch
const posts = await fetch('https://api/posts', { next: { revalidate: 60 } })
.then(r => r.json());
// Option B: whole page
export const revalidate = 60;
export default async function Page() {
const posts = await fetch('https://api/posts').then(r => r.json());
return <Feed posts={posts} />;
}إعادة التحقق عند الطلب
شغّل إعادة التوليد يدويًا (مثلًا من webhook في CMS) من دون انتظار الفاصل الزمني.
// pages/api/revalidate.ts (Pages) or app/api/revalidate/route.ts (App)
import { revalidatePath, revalidateTag } from 'next/cache';
export async function POST(req) {
const { slug } = await req.json();
revalidatePath(`/blog/${slug}`);
return Response.json({ revalidated: true });
}اختيار الاستراتيجية المناسبة
استخدم SSG عندما نادرًا ما تتغير البيانات (التسويق والوثائق والمدونة). استخدم ISR عندما تتحدث البيانات أحيانًا (المواقع المعتمدة على CMS وقوائم التجارة الإلكترونية). استخدم SSR للمحتوى الخاص بكل مستخدم (لوحات المعلومات وصفحات الحساب).
تحقق سريع
ما الذي يفعله ISR (إعادة التوليد الثابت التدريجي) ولا يفعله SSG الصرف؟
مراجعة: SSG وSSR وISR
SSG: وقت البناء، الأسرع، ومحتوى ثابت. SSR: لكل طلب، وديناميكي، وأبطأ. ISR: SSG مع إعادة توليد مجدولة في الخلفية — بيانات حديثة نسبيًا مع سرعة. يستخدم Pages Router getStaticProps/getServerSideProps. ويستخدم App Router مكوّنات خادم غير متزامنة مع إعادة التحقق في fetch أو ثابت إعادة التحقق على مستوى الصفحة. استخدم revalidatePath/Tag للتحديثات عند الطلب.
الأسئلة الشائعة
هل درس «SSG وSSR وISR» مجاني؟
نعم — نص درس «SSG وSSR وISR» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «SSG وSSR وISR»؟
ولّد الصفحات ثابتًا وقت البناء، أو اعرضها على الخادم لكل طلب، أو أعد التحقق من الصفحات المخزنة مؤقتًا وفق جدول زمني باستخدام Incremental Static Regeneration تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «SSG وSSR وISR»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- موجّه Pages مقابل موجّه App
- مكوّنات الخادم ومكوّنات العميل
- SSG وSSR وISR
- مسارات API والبرمجيات الوسيطة في Next.js