بناء موقع Next.js بكلود AI — من الصفر للنشر على Vercel
App Router وServer Components — القلب النابض
أهم ما يميز Next.js 14 هو الفصل الواضح بين Server Components وClient Components. الفهم الصحيح لهذا الفصل يجعل موقعك أسرع وأكثر أماناً بشكل تلقائي.
Server Components — الافتراضي والأذكى
كل component في App Router هو Server Component افتراضياً. يعني هذا أن الكود يعمل على الخادم فقط — يمكنه الوصول لقاعدة البيانات مباشرةً، ولا يُرسَل JavaScript له للمتصفح.
// لا حاجة لـ 'use client' — هذا Server Component افتراضياً
import { prisma } from '@/lib/prisma'
// جلب البيانات مباشرة في الـ component — لا useEffect ولا fetch
async function ProductsPage() {
const products = await prisma.product.findMany({
orderBy: { createdAt: 'desc' },
take: 12,
})
return (
<main className="container mx-auto py-8">
<h1 className="text-3xl font-bold mb-6">المنتجات</h1>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
{products.map((product) => (
<ProductCard key={product.id} product={product} />
))}
</div>
</main>
)
}
export default ProductsPage
Client Components — عند الحاجة للتفاعل
تضيف 'use client' فقط عندما تحتاج للـ state أو الـ event handlers أو browser APIs.
كلود يعرف تلقائياً أين يضع كل directive.
'use client'
import { useState } from 'react'
import { addToCart } from '@/lib/cart-actions'
interface AddToCartButtonProps {
productId: string
productName: string
}
export function AddToCartButton({ productId, productName }: AddToCartButtonProps) {
const [loading, setLoading] = useState(false)
const [added, setAdded] = useState(false)
async function handleClick() {
setLoading(true)
await addToCart(productId)
setLoading(false)
setAdded(true)
setTimeout(() => setAdded(false), 2000)
}
return (
<button
onClick={handleClick}
disabled={loading}
className="btn-primary w-full"
>
{loading ? 'جاري الإضافة...' : added ? 'تمت الإضافة!' : 'أضف للسلة'}
</button>
)
}
اطلب من كلود: "راجع مشروعي وحدد كل component تحتاج 'use client' وأضفها في المواضع الصحيحة فقط." كلود يقلل Client Components للحد الأدنى ويحسن أداء موقعك تلقائياً.
API Routes وServer Actions — الباطن القوي
Next.js 14 يوفر طريقتين لمعالجة البيانات من جهة الخادم: API Routes التقليدية وServer Actions الحديثة. كلود يختار الأنسب لكل حالة تلقائياً.
API Routes — للـ APIs الخارجية وWebhooks
import { NextRequest, NextResponse } from 'next/server'
import { prisma } from '@/lib/prisma'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/lib/auth'
// GET /api/products — جلب كل المنتجات
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url)
const page = parseInt(searchParams.get('page') ?? '1')
const limit = parseInt(searchParams.get('limit') ?? '12')
const products = await prisma.product.findMany({
skip: (page - 1) * limit,
take: limit,
orderBy: { createdAt: 'desc' },
})
return NextResponse.json({ products, page })
} catch (error) {
return NextResponse.json(
{ error: 'حدث خطأ في جلب المنتجات' },
{ status: 500 }
)
}
}
// POST /api/products — إضافة منتج جديد (للـ Admin فقط)
export async function POST(request: NextRequest) {
const session = await getServerSession(authOptions)
if (!session || session.user.role !== 'ADMIN') {
return NextResponse.json({ error: 'غير مصرح' }, { status: 401 })
}
const body = await request.json()
const product = await prisma.product.create({ data: body })
return NextResponse.json(product, { status: 201 })
}
Server Actions — للنماذج ومعالجة البيانات
Server Actions هي الطريقة الحديثة لمعالجة النماذج مباشرةً دون كتابة API Route منفصل. كلود يفضلها للنماذج البسيطة لأنها تقلل التعقيد وتحسن الأداء.
'use server'
import { prisma } from '@/lib/prisma'
import { revalidatePath } from 'next/cache'
import { redirect } from 'next/navigation'
export async function createProduct(formData: FormData) {
const name = formData.get('name') as string
const price = parseFloat(formData.get('price') as string)
const description = formData.get('description') as string
await prisma.product.create({
data: { name, price, description },
})
// إعادة التحقق من صفحة المنتجات بعد الإضافة
revalidatePath('/products')
redirect('/dashboard/products')
}
export async function deleteProduct(productId: string) {
await prisma.product.delete({ where: { id: productId } })
revalidatePath('/products')
revalidatePath('/dashboard/products')
}
قاعدة البيانات مع Prisma — ORM الجيل الجديد
Prisma يجمع بين أمان TypeScript الكامل وسهولة كتابة queries كأنك تقرأ لغة طبيعية. مع كلود، تكتب الـ Schema بوصف بسيط ويحوّلها لملف prisma.prisma كامل مع relations وindexes.
تثبيت Prisma وإعداده
قل لكلود: "ثبّت Prisma وأعدّه مع PostgreSQL لمشروع Next.js 14." كلود يشغّل الأوامر ويضع إعدادات .env.local الصحيحة.
npm install prisma @prisma/client
npx prisma init --datasource-provider postgresql
Schema قاعدة البيانات
صِف لكلود كيانات مشروعك: "أحتاج Schema لمتجر إلكتروني: مستخدمون، منتجات، طلبات، وعناصر السلة مع كل العلاقات والـ indexes المناسبة."
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
email String @unique
name String?
role Role @default(USER)
orders Order[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([email])
}
model Product {
id String @id @default(cuid())
name String
description String?
price Float
stock Int @default(0)
imageUrl String?
orderItems OrderItem[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([price])
@@index([createdAt])
}
model Order {
id String @id @default(cuid())
userId String
user User @relation(fields: [userId], references: [id])
items OrderItem[]
total Float
status OrderStatus @default(PENDING)
createdAt DateTime @default(now())
@@index([userId])
@@index([status])
}
model OrderItem {
id String @id @default(cuid())
orderId String
order Order @relation(fields: [orderId], references: [id])
productId String
product Product @relation(fields: [productId], references: [id])
quantity Int
price Float
}
enum Role { USER ADMIN }
enum OrderStatus { PENDING CONFIRMED SHIPPED DELIVERED CANCELLED }
Prisma Client Singleton
كلود ينشئ لك ملف prisma.ts يتجنب إنشاء اتصالات متعددة في بيئة التطوير — مشكلة شائعة يحلها كلود تلقائياً.
import { PrismaClient } from '@prisma/client'
const globalForPrisma = global as unknown as { prisma: PrismaClient }
export const prisma =
globalForPrisma.prisma ??
new PrismaClient({
log: process.env.NODE_ENV === 'development' ? ['query'] : [],
})
if (process.env.NODE_ENV !== 'production') {
globalForPrisma.prisma = prisma
}
المصادقة مع NextAuth — الأمان في سطور
NextAuth.js (المعروف الآن بـ Auth.js) يوفر نظام مصادقة متكاملاً لـ Next.js يدعم عشرات الموفرين (Google، GitHub، Facebook) والـ Credentials التقليدية — كل ذلك بإعداد بسيط.
npm install next-auth @auth/prisma-adapter bcryptjs
npm install -D @types/bcryptjs
import { NextAuthOptions } from 'next-auth'
import { PrismaAdapter } from '@auth/prisma-adapter'
import CredentialsProvider from 'next-auth/providers/credentials'
import GoogleProvider from 'next-auth/providers/google'
import { prisma } from '@/lib/prisma'
import bcrypt from 'bcryptjs'
export const authOptions: NextAuthOptions = {
adapter: PrismaAdapter(prisma),
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
}),
CredentialsProvider({
name: 'credentials',
credentials: {
email: { label: 'البريد الإلكتروني', type: 'email' },
password: { label: 'كلمة المرور', type: 'password' },
},
async authorize(credentials) {
if (!credentials?.email || !credentials?.password) return null
const user = await prisma.user.findUnique({
where: { email: credentials.email },
})
if (!user || !user.hashedPassword) return null
const isValid = await bcrypt.compare(
credentials.password,
user.hashedPassword
)
return isValid ? user : null
},
}),
],
callbacks: {
async session({ session, token }) {
if (token && session.user) {
session.user.id = token.sub!
session.user.role = token.role as string
}
return session
},
async jwt({ token, user }) {
if (user) token.role = (user as any).role
return token
},
},
pages: {
signIn: '/login',
error: '/login',
},
session: { strategy: 'jwt' },
secret: process.env.NEXTAUTH_SECRET,
}
اطلب من كلود: "أنشئ middleware.ts يحمي جميع صفحات /dashboard ويعيد توجيه غير المسجلين لصفحة الدخول." كلود يكتب middleware دقيقاً بـ matcher patterns لحماية المسارات المناسبة فقط.
النشر على Vercel — من المشروع المحلي للإنتاج
Vercel هو المنصة التي بنت Next.js — التكامل بينهما مثالي. كل push على GitHub يُطلق deployment تلقائي مع preview URL مستقل لكل PR. بضع خطوات وموقعك حي على الإنترنت.
رفع المشروع على GitHub
قل لكلود: "ساعدني في رفع المشروع على GitHub — أنشئ .gitignore مناسباً وتأكد من استبعاد .env.local وnode_modules."
ربط GitHub بـ Vercel
في vercel.com/new، اختر المشروع من GitHub. Vercel يكتشف Next.js تلقائياً ويضبط إعدادات البناء دون تدخل.
إضافة Environment Variables
أضف جميع متغيرات البيئة في Vercel Dashboard: DATABASE_URL وNEXTAUTH_SECRET وGOOGLE_CLIENT_ID وغيرها. كلود يجهّز لك قائمة شاملة بكل المتغيرات التي يحتاجها مشروعك.
# قاعدة البيانات
DATABASE_URL="postgresql://user:password@host:5432/dbname?schema=public"
# NextAuth
NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET="your-super-secret-key-generate-with-openssl"
# Google OAuth
GOOGLE_CLIENT_ID="your-google-client-id"
GOOGLE_CLIENT_SECRET="your-google-client-secret"
تشغيل Prisma Migrations في الإنتاج
بعد أول deployment، شغّل npx prisma migrate deploy لتطبيق الـ migrations على قاعدة البيانات الإنتاجية. كلود ينبّهك بهذه الخطوة تلقائياً.
Vercel Postgres وNeon.tech يوفران قواعد PostgreSQL مجانية ومتكاملة مع Vercel. اطلب من كلود: "أعدّ مشروعي لاستخدام Neon PostgreSQL مع Prisma على Vercel — اكتب الإعدادات الكاملة وvercel.json اللازمة." كلود يجهّز كل شيء في دقائق.
Tips & Tricks: 8 نصائح لبناء Next.js بكلود بشكل أسرع
ابدأ بـ CLAUDE.md في جذر المشروع
أنشئ ملف CLAUDE.md يشرح المشروع لكلود: التقنيات المستخدمة، البنية، الاتفاقيات، ومتغيرات البيئة المطلوبة. كلود يقرأه في كل محادثة ويكتب كوداً متسقاً من اليوم الأول.
استخدم Suspense لتحسين UX
اطلب من كلود: "ضع كل Server Component يجلب بيانات داخل Suspense مع Skeleton مناسب." المستخدم يرى محتوى فورياً بدل صفحة بيضاء أثناء التحميل.
generateMetadata للـ SEO الديناميكي
قل لكلود: "أضف generateMetadata لكل صفحة ديناميكية تجلب عنوانها ووصفها من قاعدة البيانات." Next.js يولّد meta tags فريدة لكل صفحة تلقائياً.
Zod لـ Validation في Server Actions
اطلب: "أضف Zod validation لكل Server Action قبل الوصول لقاعدة البيانات." كلود يكتب schemas TypeScript-safe تمنع أي بيانات غير صحيحة من الوصول للـ DB.
next/image للصور تلقائياً
قل لكلود: "استبدل كل img tags بمكوّن next/image مع الأبعاد الصحيحة وأولوية التحميل." تحسين Core Web Vitals وتحويل الصور لـ WebP تلقائياً.
Error Boundaries لكل Section
اطلب: "أضف error.tsx وloading.tsx لكل route segment رئيسي." إذا فشل جزء من الصفحة لا تنهار الصفحة كلها — تجربة مستخدم أقوى بكثير.
استخدم unstable_cache للبيانات الثابتة
قل لكلود: "استخدم unstable_cache لـ queries الـ Prisma التي لا تتغير كثيراً مثل قائمة الفئات." يقلل استدعاءات DB ويسرّع الموقع بشكل واضح.
Parallel Routes لـ Dashboard المعقد
اطلب: "بنِّ لوحة التحكم بـ Parallel Routes بحيث يتحمّل الـ sidebar وMainContent بشكل مستقل." كلود يشرح @folder convention ويبنيه خطوة بخطوة.
Hidden Gems: 5 استخدامات خفية ستحسن مشروعك فوراً
توليد TypeScript Types من Schema Prisma
اطلب من كلود: "ولّد TypeScript types مشتقة من Prisma Schema واستخدمها في كامل المشروع بدل تعريفات مكررة." كلود ينشئ types/prisma.ts يُستورد في كل مكان لضمان consistency كاملة.
Route Handlers كـ Webhooks آمنة
قل: "أنشئ Route Handler يستقبل Webhook من Stripe مع التحقق من الـ signature وتحديث الطلب في قاعدة البيانات." كلود يكتب webhook handler آمناً كاملاً مع HMAC verification.
Static Export لأجزاء من الموقع
اطلب: "حوّل صفحات الـ marketing (about, pricing, blog) لـ static HTML مع الإبقاء على باقي الموقع dynamic." كلود يضبط generateStaticParams وexport config للأجزاء المناسبة فقط.
Intercepting Routes للـ Modals
قل لكلود: "استخدم Intercepting Routes لفتح تفاصيل المنتج في Modal عند النقر من صفحة المتجر، مع الاحتفاظ بـ URL مستقل للصفحة الكاملة." ميزة Next.js قوية جداً يشرحها كلود بمثال عملي.
Optimistic Updates مع useOptimistic
اطلب: "أضف useOptimistic لعمليات الـ like والـ cart update — يُحدّث الـ UI فوراً دون انتظار الاستجابة من الخادم." كلود يكتب نمط Optimistic UI مع rollback عند فشل العملية.
الأسئلة الشائعة حول Next.js وكلود AI
يُنصح بمعرفة أساسيات React (Components، Props، useState) قبل الانتقال لـ Next.js، لكن مع كلود AI يمكنك تخطي هذه المرحلة والبدء مباشرةً. كلود يشرح كل مفهوم جديد أثناء الكتابة — Server Components وApp Router وServer Actions — بأمثلة مرتبطة بمشروعك الفعلي. كثير من المطورين بنوا مشاريع إنتاجية كاملة بـ Next.js في أسبوعَين فقط من البداية مع كلود.
App Router هو النظام الحديث المعتمد منذ Next.js 13 ويدعم Server Components وStreaming والـ layouts المتداخلة وParallel Routes والـ Intercepting Routes. Pages Router هو النظام القديم المستقر الذي لا يزال مدعوماً لكن لن يحصل على ميزات جديدة. للمشاريع الجديدة، App Router دائماً هو الخيار الصحيح — وكلود يكتب الكود بنمطه الصحيح تلقائياً دون التباس.
Prisma هو الأكثر شيوعاً لـ Next.js لأنه يوفر type safety كاملة، Schema واضحة في ملف واحد، وmigrations سهلة الإدارة. Drizzle ORM أخف وأسرع وأقرب لكتابة SQL للمطورين ذوي الخبرة. Mongoose مخصص لـ MongoDB فقط وغير موصى به لمشاريع Next.js الجديدة مع PostgreSQL. كلود يساعدك في إعداد أي منها ويكتب الـ queries والـ Schema المناسبة لحالتك.
خطة Hobby على Vercel مجانية تماماً وتشمل: deployments غير محدودة، custom domain واحد، 100GB bandwidth شهرياً، وServerless Functions. القيود الرئيسية: لا تجارية (للمشاريع الشخصية)، وبعض features متقدمة مثل Edge Config وAdvanced Analytics مدفوعة. للمشاريع التجارية الجادة، خطة Pro بـ 20 دولار شهرياً توفر كل ما تحتاج. كلود يرشدك لأفضل إعداد حسب نوع مشروعك.
نعم، كلود يتقن Next.js 14 بعمق. يفهم متى يضع 'use client' و'use server' في المواضع الصحيحة فقط، يكتب Server Actions للنماذج ومعالجة البيانات بدون API routes منفصلة، ويستخدم revalidatePath وrevalidateTag لتحديث الـ cache بدقة. كلود أيضاً ينبّهك لأخطاء شائعة مثل استيراد Server-only code داخل Client Components — وهو نوع من الأخطاء التي يصعب تتبعها يدوياً.
🧭 اكتشف المزيد
مواضيع مرتبطة من أقسام أخرى تُكمّل ما تعلمته