جاري التحميل...
جاري التحميل...
مراجعة Server vs Client Components في سياق Next.js
في Next.js مع App Router، جميع المكونات هي مكونات خادم بشكل افتراضي. أضف 'use client' في أعلى الملف لتحويلها إلى مكون عميل.
القاعدة: مكون الخادم يمكنه استيراد مكون العميل. مكون العميل لا يمكنه استيراد مكون الخادم مباشرة — استخدم خاصية children بدلاً من ذلك.
مكون الخادم يجلب البيانات ويمرر النتائج كخصائص إلى مكون العميل للتفاعلية.
ما هو النوع الافتراضي للمكونات في Next.js App Router؟
أيهم يتطلب التحويل إلى مكون عميل؟
ماذا يحدث عندما يحاول مكون العميل استيراد مكون خادم؟
مع تطبيق مدونة، حدد أي المكونات يجب أن تكون خادماً وأي منها يجب أن يكون عميلاً.
الحل:
// الإجابة الصحيحة:
// 1. BlogPostPage → Server Component
// يجلب البيانات من DB - مثالي للخادم
export default async function BlogPostPage({ params }) {
const post = await db.getPost(params.slug);
return (
<div>
<PostContent post={post} />
<LikeButton postId={post.id} />
<CommentSection postId={post.id} />
<AuthorInfo authorId={post.authorId} />
<ShareButtons title={post.title} />
</div>
);
}
// 2. PostContent → Server Component (عرض فقط)
export function PostContent({ post }) {
return <article><h1>{post.title}</h1><p>{post.content}</p></article>;
}
// 3. LikeButton → Client Component (useState)
"use client";
export function LikeButton({ postId }) {
const [liked, setLiked] = useState(false);
return <button onClick={() => setLiked(!liked)}>{liked ? "❤️" : "🤍"}</button>;
}
// 4. CommentSection → Client Component (useState + events)
"use client";
export function CommentSection({ postId }) {
const [comments, setComments] = useState([]);
return <div>...</div>;
}
// 5. AuthorInfo → Server Component (عرض فقط)
export function AuthorInfo({ authorId }) {
const author = await db.getAuthor(authorId);
return <div><img src={author.avatar} /><span>{author.name}</span></div>;
}
// 6. ShareButtons → Client Component (onClick)
"use client";
export function ShareButtons({ title }) {
return <button onClick={() => alert("مشاركة: " + title)}>مشاركة</button>;
}مكون الخادم ✅
مكون العميل 🔵
قواعد التناوب:
children لتمرير محتوى الخادم إلى العميلمتى تختار مكون العميل:
ما الفرق بين Server و Client Component؟
الإجابة:
Server: يعمل على الخادم، لا تفاعل. Client: يعمل في المتصفح، يدعم Hooks.
متى تستخدم 'use client'؟
الإجابة:
عندما تحتاج useState، useEffect، أو أحداث تفاعلية.
لماذا Server Components أسرع؟
الإجابة:
لا تُرسل JavaScript إلى العميل، وتمارس البيانات مباشرة من الخادم.
لا تضع 'use client' في_root layout
اجعل layout الرئيسي server component قدر الإمكان