موجّه Pages مقابل موجّه App
قارن بين نمطي التوجيه في Next.js: موجّه Pages القائم على الملفات، وموجّه App الجديد ذي التخطيطات المتداخلة وحالات التحميل وحدود الأخطاء
موجّه Pages مقابل موجّه App درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
موجهان وإطار عمل واحد
يحتوي Next.js على نظامين للتوجيه: Pages Router الأصلي (دليل pages/) وApp Router الأحدث (دليل app/، في Next 13 فأحدث). ولا يزال كلاهما يعمل في Next 14/15.
Pages Router — التوجيه القائم على الملفات
يصبح كل ملف داخل pages/ مسارًا. وتستخدم المقاطع الديناميكية الأقواس: يطابق pages/users/[id].tsx المسار /users/123.
pages/
index.tsx // route: /
about.tsx // route: /about
blog/
index.tsx // route: /blog
[slug].tsx // route: /blog/:slug
api/
users.ts // API route: /api/usersPages Router — جلب البيانات
تعلن الصادرات الخاصة عن سلوك الجلب: getStaticProps (SSG)، وgetServerSideProps (SSR)، وgetStaticPaths (SSG مع المسارات الديناميكية).
// pages/posts/[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 }, revalidate: 60 };
}
export default function Post({ post }) {
return <article>{post.body}</article>;
}App Router — التوجيه القائم على المجلدات
يستخدم App Router المجلدات كمقاطع للمسارات. ويعرّف ملف page.tsx داخل مجلد الصفحة.
app/
layout.tsx // shared root layout
page.tsx // route: /
about/
page.tsx // route: /about
blog/
page.tsx // route: /blog
[slug]/
page.tsx // route: /blog/:slugApp Router — الملفات الخاصة
توفر الملفات الخاصة بكل مقطع بدائيات قوية: layout.tsx (واجهة مستمرة تحيط بالعناصر الفرعية)، وloading.tsx (واجهة Suspense البديلة)، وerror.tsx (حد الأخطاء)، وnot-found.tsx.
التخطيطات المتداخلة
تحيط تخطيطات App Router بالمسارات المتداخلة وتستمر أثناء التنقل، من دون إعادة تركيب.
// app/dashboard/layout.tsx
export default function DashboardLayout({ children }) {
return (
<div className="dashboard">
<Sidebar />
<main>{children}</main>
</div>
);
}
// app/dashboard/settings/page.tsx renders inside the Sidebar layoutجلب البيانات في App Router
يمكن أن تكون مكونات الخادم غير متزامنة وأن تجلب البيانات مباشرة، من دون getServerSideProps أو getStaticProps. يعمل المكوّن على الخادم ولا يرسل إلى العميل سوى HTML.
// app/posts/[slug]/page.tsx (Server Component by default)
export default async function Post({ params }) {
const post = await fetch(`https://api/posts/${params.slug}`, {
next: { revalidate: 60 } // ISR-like caching
}).then(r => r.json());
return <article>{post.body}</article>;
}مكونات العميل في App Router
أضف 'use client' في أعلى الملف لتمييز مكوّنه كمكوّن عميل، أي مكوّن تفاعلي يعمل في المتصفح.
// app/Counter.tsx
'use client';
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}مسارات API مقابل معالجات المسارات
في Pages Router: يصدّر pages/api/users.ts دالة افتراضية تحتوي على req/res. وفي App Router: يصدّر app/api/users/route.ts أساليب HTTP، مثل GET وPOST، بصادرات مسماة تستخدم Request/Response القياسيين.
// app/api/users/route.ts
export async function GET(request: Request) {
const users = await db.users.findMany();
return Response.json(users);
}
export async function POST(request: Request) {
const body = await request.json();
const user = await db.users.create({ data: body });
return Response.json(user, { status: 201 });
}استراتيجية الترحيل
يمكن أن يتعايش الموجهان في المشروع نفسه، إذ يمكنك نقل الصفحات تدريجيًا، صفحةً تلو الأخرى. ويأخذ App Router الأولوية عند حدوث تعارض.
متى تستخدم أيًّا منهما
المشاريع الجديدة: استخدم App Router، فهو أقوى ومحور الاستثمار الحالي. مشاريع Pages Router الحالية: ابقَ عليه أو رحّلها تدريجيًا. المواقع الثابتة الصغيرة التي لا تحتاج إلى تخطيطات أو RSC: يصلح لها أيٌّ منهما.
تحقق سريع
كيف تُحدّد مكوّنًا بوصفه مكوّن عميل في App Router الخاص بـ Next.js؟
مراجعة: Pages Router مقابل App Router
Pages Router: يعتمد على الملفات، مع getStaticProps/getServerSideProps. App Router (Next 13+): يعتمد على المجلدات، ومكوّنات خادم غير متزامنة، وتنسيقات متداخلة، وملفات التحميل والخطأ. حدّد التفاعلية على جانب العميل باستخدام 'use client'. مسارات API: pages/api/* مقابل app/api/*/route.ts، مع تصدير أساليب HTTP. يمكن استخدامهما معًا، لكن App Router يحظى بالتطوير النشط.
الأسئلة الشائعة
هل درس «موجّه Pages مقابل موجّه App» مجاني؟
نعم — نص درس «موجّه Pages مقابل موجّه App» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «موجّه Pages مقابل موجّه App»؟
قارن بين نمطي التوجيه في Next.js: موجّه Pages القائم على الملفات، وموجّه App الجديد ذي التخطيطات المتداخلة وحالات التحميل وحدود الأخطاء تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «موجّه Pages مقابل موجّه App»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- موجّه Pages مقابل موجّه App
- مكوّنات الخادم ومكوّنات العميل
- SSG وSSR وISR
- مسارات API والبرمجيات الوسيطة في Next.js