الرئيسية Claude AI مركز التعلم القطاعات تواصل معنا
واتساب اتصل بنا

بناء موقع Next.js بكلود AI — من الصفر للنشر على Vercel

nextjs app - كلود AI

App Router وServer Components — القلب النابض

أهم ما يميز Next.js 14 هو الفصل الواضح بين Server Components وClient Components. الفهم الصحيح لهذا الفصل يجعل موقعك أسرع وأكثر أماناً بشكل تلقائي.

Server Components — الافتراضي والأذكى

كل component في App Router هو Server Component افتراضياً. يعني هذا أن الكود يعمل على الخادم فقط — يمكنه الوصول لقاعدة البيانات مباشرةً، ولا يُرسَل JavaScript له للمتصفح.

TypeScript — src/app/products/page.tsx (Server Component)
// لا حاجة لـ '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.

TypeScript — src/components/ui/AddToCartButton.tsx (Client Component)
'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>
  )
}
قاعدة كلود الذهبية للـ Server/Client

اطلب من كلود: "راجع مشروعي وحدد كل component تحتاج 'use client' وأضفها في المواضع الصحيحة فقط." كلود يقلل Client Components للحد الأدنى ويحسن أداء موقعك تلقائياً.

API Routes وServer Actions — الباطن القوي

Next.js 14 يوفر طريقتين لمعالجة البيانات من جهة الخادم: API Routes التقليدية وServer Actions الحديثة. كلود يختار الأنسب لكل حالة تلقائياً.

API Routes — للـ APIs الخارجية وWebhooks

TypeScript — src/app/api/products/route.ts
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 منفصل. كلود يفضلها للنماذج البسيطة لأنها تقلل التعقيد وتحسن الأداء.

TypeScript — src/lib/actions.ts (Server Actions)
'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.

1

تثبيت Prisma وإعداده

قل لكلود: "ثبّت Prisma وأعدّه مع PostgreSQL لمشروع Next.js 14." كلود يشغّل الأوامر ويضع إعدادات .env.local الصحيحة.

Shell — تثبيت وتهيئة Prisma
npm install prisma @prisma/client
npx prisma init --datasource-provider postgresql
2

Schema قاعدة البيانات

صِف لكلود كيانات مشروعك: "أحتاج Schema لمتجر إلكتروني: مستخدمون، منتجات، طلبات، وعناصر السلة مع كل العلاقات والـ indexes المناسبة."

Prisma — prisma/schema.prisma
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 }
3

Prisma Client Singleton

كلود ينشئ لك ملف prisma.ts يتجنب إنشاء اتصالات متعددة في بيئة التطوير — مشكلة شائعة يحلها كلود تلقائياً.

TypeScript — src/lib/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 التقليدية — كل ذلك بإعداد بسيط.

Shell — تثبيت NextAuth وPrisma Adapter
npm install next-auth @auth/prisma-adapter bcryptjs
npm install -D @types/bcryptjs
TypeScript — src/lib/auth.ts
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

اطلب من كلود: "أنشئ middleware.ts يحمي جميع صفحات /dashboard ويعيد توجيه غير المسجلين لصفحة الدخول." كلود يكتب middleware دقيقاً بـ matcher patterns لحماية المسارات المناسبة فقط.

النشر على Vercel — من المشروع المحلي للإنتاج

Vercel هو المنصة التي بنت Next.js — التكامل بينهما مثالي. كل push على GitHub يُطلق deployment تلقائي مع preview URL مستقل لكل PR. بضع خطوات وموقعك حي على الإنترنت.

1

رفع المشروع على GitHub

قل لكلود: "ساعدني في رفع المشروع على GitHub — أنشئ .gitignore مناسباً وتأكد من استبعاد .env.local وnode_modules."

2

ربط GitHub بـ Vercel

في vercel.com/new، اختر المشروع من GitHub. Vercel يكتشف Next.js تلقائياً ويضبط إعدادات البناء دون تدخل.

3

إضافة Environment Variables

أضف جميع متغيرات البيئة في Vercel Dashboard: DATABASE_URL وNEXTAUTH_SECRET وGOOGLE_CLIENT_ID وغيرها. كلود يجهّز لك قائمة شاملة بكل المتغيرات التي يحتاجها مشروعك.

Shell — .env.local (مثال — لا ترفع هذا الملف لـ GitHub)
# قاعدة البيانات
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"
4

تشغيل Prisma Migrations في الإنتاج

بعد أول deployment، شغّل npx prisma migrate deploy لتطبيق الـ migrations على قاعدة البيانات الإنتاجية. كلود ينبّهك بهذه الخطوة تلقائياً.

نصيحة: استخدم Vercel Postgres أو Neon

Vercel Postgres وNeon.tech يوفران قواعد PostgreSQL مجانية ومتكاملة مع Vercel. اطلب من كلود: "أعدّ مشروعي لاستخدام Neon PostgreSQL مع Prisma على Vercel — اكتب الإعدادات الكاملة وvercel.json اللازمة." كلود يجهّز كل شيء في دقائق.

Tips & Tricks: 8 نصائح لبناء Next.js بكلود بشكل أسرع

01

ابدأ بـ CLAUDE.md في جذر المشروع

أنشئ ملف CLAUDE.md يشرح المشروع لكلود: التقنيات المستخدمة، البنية، الاتفاقيات، ومتغيرات البيئة المطلوبة. كلود يقرأه في كل محادثة ويكتب كوداً متسقاً من اليوم الأول.

02

استخدم Suspense لتحسين UX

اطلب من كلود: "ضع كل Server Component يجلب بيانات داخل Suspense مع Skeleton مناسب." المستخدم يرى محتوى فورياً بدل صفحة بيضاء أثناء التحميل.

03

generateMetadata للـ SEO الديناميكي

قل لكلود: "أضف generateMetadata لكل صفحة ديناميكية تجلب عنوانها ووصفها من قاعدة البيانات." Next.js يولّد meta tags فريدة لكل صفحة تلقائياً.

04

Zod لـ Validation في Server Actions

اطلب: "أضف Zod validation لكل Server Action قبل الوصول لقاعدة البيانات." كلود يكتب schemas TypeScript-safe تمنع أي بيانات غير صحيحة من الوصول للـ DB.

05

next/image للصور تلقائياً

قل لكلود: "استبدل كل img tags بمكوّن next/image مع الأبعاد الصحيحة وأولوية التحميل." تحسين Core Web Vitals وتحويل الصور لـ WebP تلقائياً.

06

Error Boundaries لكل Section

اطلب: "أضف error.tsx وloading.tsx لكل route segment رئيسي." إذا فشل جزء من الصفحة لا تنهار الصفحة كلها — تجربة مستخدم أقوى بكثير.

07

استخدم unstable_cache للبيانات الثابتة

قل لكلود: "استخدم unstable_cache لـ queries الـ Prisma التي لا تتغير كثيراً مثل قائمة الفئات." يقلل استدعاءات DB ويسرّع الموقع بشكل واضح.

08

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

هل Next.js 14 مناسب للمبتدئين أم يحتاج خبرة React أولاً؟

يُنصح بمعرفة أساسيات React (Components، Props، useState) قبل الانتقال لـ Next.js، لكن مع كلود AI يمكنك تخطي هذه المرحلة والبدء مباشرةً. كلود يشرح كل مفهوم جديد أثناء الكتابة — Server Components وApp Router وServer Actions — بأمثلة مرتبطة بمشروعك الفعلي. كثير من المطورين بنوا مشاريع إنتاجية كاملة بـ Next.js في أسبوعَين فقط من البداية مع كلود.

ما الفرق بين App Router وPages Router ولماذا أختار App Router؟

App Router هو النظام الحديث المعتمد منذ Next.js 13 ويدعم Server Components وStreaming والـ layouts المتداخلة وParallel Routes والـ Intercepting Routes. Pages Router هو النظام القديم المستقر الذي لا يزال مدعوماً لكن لن يحصل على ميزات جديدة. للمشاريع الجديدة، App Router دائماً هو الخيار الصحيح — وكلود يكتب الكود بنمطه الصحيح تلقائياً دون التباس.

هل Prisma أفضل من Drizzle أو Mongoose لمشاريع Next.js؟

Prisma هو الأكثر شيوعاً لـ Next.js لأنه يوفر type safety كاملة، Schema واضحة في ملف واحد، وmigrations سهلة الإدارة. Drizzle ORM أخف وأسرع وأقرب لكتابة SQL للمطورين ذوي الخبرة. Mongoose مخصص لـ MongoDB فقط وغير موصى به لمشاريع Next.js الجديدة مع PostgreSQL. كلود يساعدك في إعداد أي منها ويكتب الـ queries والـ Schema المناسبة لحالتك.

كيف أنشر Next.js على Vercel مجاناً وما القيود؟

خطة Hobby على Vercel مجانية تماماً وتشمل: deployments غير محدودة، custom domain واحد، 100GB bandwidth شهرياً، وServerless Functions. القيود الرئيسية: لا تجارية (للمشاريع الشخصية)، وبعض features متقدمة مثل Edge Config وAdvanced Analytics مدفوعة. للمشاريع التجارية الجادة، خطة Pro بـ 20 دولار شهرياً توفر كل ما تحتاج. كلود يرشدك لأفضل إعداد حسب نوع مشروعك.

هل كلود يستطيع كتابة Server Actions وServer Components بالشكل الصحيح؟

نعم، كلود يتقن Next.js 14 بعمق. يفهم متى يضع 'use client' و'use server' في المواضع الصحيحة فقط، يكتب Server Actions للنماذج ومعالجة البيانات بدون API routes منفصلة، ويستخدم revalidatePath وrevalidateTag لتحديث الـ cache بدقة. كلود أيضاً ينبّهك لأخطاء شائعة مثل استيراد Server-only code داخل Client Components — وهو نوع من الأخطاء التي يصعب تتبعها يدوياً.

🧭 اكتشف المزيد

مواضيع مرتبطة من أقسام أخرى تُكمّل ما تعلمته

محتاج مساعدة احترافية؟

فريق A Plan جاهز يساعدك في بناء مشروعك بـ Next.js وكلود AI.

تواصل عبر واتساب