React: النشر و CI/CD

آخر تحديث: 2026-08-26

كانت مدونة توم تعمل بشكل جيد محليًّا، ولكن بعد نشرها على بيئة الإنتاج، واجه كل أنواع المشاكل: لم تكن الصور تُحمَّل، وكانت عناوين URL الخاصة بواجهة برمجة التطبيقات (API) مكتوبة بشكل ثابت في الكود على أنها localhost، وكان تحميل الكود يدويًّا عبر SSH بطيئًا وعرضة للأخطاء. كان بحاجة إلى مسار نشر آلي لتحويل العملية بدءًا من إرسال الكود إلى بيئة الإنتاج إلى سير عمل آلي بالكامل.

سيرشدك هذا الدرس خلال العملية بأكملها، بدءًا من «التطوير المحلي» وصولاً إلى «النشر في بيئة الإنتاج». ستتعلم كيفية النشر بنقرة واحدة باستخدام Vercel، وإعداد مسار عمل آلي باستخدام GitHub Actions، وإدارة متغيرات البيئات المتعددة، وتحسين مكونات البناء لتسريع أوقات تحميل الصفحات. وتُعد مهارات النشر هذه خطوة حاسمة لمهندسي الواجهة الأمامية في الانتقال من «كتابة الكود» إلى «تسليم المنتجات».


1. ما ستتعلمه



2. الرسوم التخطيطية المفاهيمية

صمم توم مسارًا كاملاً للتكامل المستمر/التسليم المستمر (CI/CD): فعندما يقوم أحد المطورين بنشر الكود على GitHub، يتم تلقائيًا تشغيل عمليات البناء والاختبار؛ وبمجرد نجاح هاتين العمليتين، يتم نشر الكود تلقائيًا إلى بيئة الاختبار للمراجعة؛ وبعد الموافقة على المراجعة ودمج الكود في الفرع الرئيسي، يتم نشره تلقائيًا إلى بيئة الإنتاج.

يتمثل جوهر مسار العمل في الأتمتة والتوحيد القياسي. يتم تنفيذ جميع خطوات الفحص (التحقق من وجود الأخطاء البرمجية، والتحقق من أنواع البيانات، والاختبار) تلقائيًا في بيئة التكامل المستمر (CI) دون الحاجة إلى تدخل يدوي. وهذا يضمن اكتشاف أي مشكلات تتعلق بجودة الكود قبل الدمج، مما يضمن نشر الكود الذي تم التحقق من صحته فقط في بيئة الإنتاج. تعمل ميزة «Preview Deployment» من Vercel على إنشاء عنوان URL منفصل للمعاينة تلقائيًا لكل فرع، مما يتيح لمديري المنتجات والمختبرين عرض النتائج بنقرة واحدة.

100%
flowchart LR
    A[Developer Push Code] --> B[GitHub Receive]
    B --> C[GitHub Actions Trigger]
    C --> D{Run CI Process}
    D --> E[Install Dependencies<br/>npm ci]
    E --> F[Code Review<br/>lint / type-check]
    F --> G[Run Test<br/>jest / playwright]
    G --> H[Build<br/>next build]
    H --> I{Deployment Objectives}
    I -->|Feature Branch| J[Vercel Preview<br/>Preview Environment]
    I -->|Main Branch| K[Vercel Production<br/>Production Environment]
    J --> L[Preview URL Automatically Generated]
    K --> M[CDN Distribution<br/>Global Acceleration]


3. سيناريو واقعي

خيارات النشر طرق النشر دعم الاستخبارات والمراقبة والاستطلاع (ISR) تكاليف التشغيل حالات الاستخدام
Vercel تلقائي (إرسال إلى Git) ✅ أصلي منخفض جدًّا مشاريع Next.js، أفراد/فرق صغيرة
Netlify تلقائي (إرسال إلى Git) ⚠️ يتطلب إعدادات منخفض المواقع الثابتة، Gatsby
Docker + Nginx يدوي/التكامل المستمر ❌ يجب إعداده يدويًّا متوسط نشر خاص، يتطلب تحكمًا كاملاً
AWS Amplify آلي ⚠️ محدود متوسط مشاريع منظومة AWS
الخادم التقليدي PM2 يدوي عالي متطلبات تخصيص معقدة

تزداد قائمة المشاكل التي يواجهها توم في نشر مدونته طولاً باستمرار: ففي كل مرة يقوم فيها بتحديث منشور، يضطر إلى تسجيل الدخول إلى الخادم عبر SSH وتشغيل git pull وnpm run build وpm2 restart يدويًّا — وهي عملية تستغرق 10 دقائق على الأقل. وإذا نسي إجراء نسخ احتياطي لقاعدة البيانات، فإن خطأً واحداً قد يؤدي إلى محو كل شيء. والأمر الأكثر إحباطًا هو أن التغييرات التي يجريها أعضاء الفريق الآخرون غالبًا ما تحل محل كوده.

قرر اعتماد حل نشر حديث باستخدام Vercel و GitHub Actions. كانت الخطوة الأولى هي ترحيل الكود من FTP إلى مستودع GitHub؛ والخطوة الثانية كانت الاتصال بـ Vercel لتمكين النشر التلقائي؛ أما الخطوة الثالثة فكانت تكوين GitHub Actions لإضافة عمليات فحص الكود وسير عمل الاختبار. بعد اكتمال الترحيل، في كل مرة يتم فيها دفع الكود إلى الفرع main، يقوم Vercel تلقائيًا بإنشائه ونشره، وتستغرق العملية بأكملها أقل من دقيقتين.

كما قارن توم بين إيجابيات وسلبيات عدة خيارات للنشر: يُعد Vercel الخيار الأنسب لمشاريع Next.js ويوفر أبسط إعدادات التهيئة؛ كما يدعم Netlify Next.js أيضًا، لكن بعض الميزات المتقدمة (ISR، والبرمجيات الوسيطة) تتطلب إعدادات إضافية؛ ويُعد النشر عبر Docker مناسبًا للحالات التي تتطلب تحكمًا كاملاً في بيئة الخادم؛ أما النشر عبر الخادم التقليدي (Nginx + PM2) فيوفر أعلى درجة من المرونة، لكنه ينطوي على أعلى تكاليف تشغيلية. بالنسبة للمدونات الشخصية والمشاريع الصغيرة، يُعد Vercel بلا شك الخيار الأفضل.

(1) النشر التلقائي عبر Vercel

Vercel هي منصة نشر بدون خادم توفرها شركة Vercel، وهي الشركة المطورة لـ Next.js. وهي متكاملة بشكل وثيق مع Next.js وتدعم جميع ميزات Next.js، بما في ذلك الكشف التلقائي عن إطار العمل، ووظائف Serverless Functions، ووظائف Edge Functions، و ISR، والبرمجيات الوسيطة. تعتمد آلية النشر التلقائي في Vercel على التكامل مع Git — فبمجرد ربط مستودع GitHub أو GitLab أو Bitbucket الخاص بك، يؤدي كل «دفع» (push) تلقائيًا إلى بدء عملية البناء والنشر.

يوفر Vercel ثلاث بيئات: «الإنتاج» (بيئة الإنتاج، المرتبطة بنطاق مخصص)، و«المعاينة» (بيئة المعاينة، مع إنشاء عنوان URL منفصل تلقائيًا لكل فرع)، و«التطوير» (بيئة التطوير المحلية). وتُعد بيئة «المعاينة» مناسبة بشكل خاص للتعاون الجماعي — حيث يتم إنشاء عنوان URL للمعاينة تلقائيًا لكل طلب سحب، مما يسهل على المراجعين رؤية كيف تبدو التغييرات في بيئة حية.

خطوات النشر على Vercel (طريقة واجهة المستخدم الرسومية)

  1. انقر على Add New -> Project في لوحة تحكم Vercel
  2. حدد مستودع GitHub وامنح Vercel الإذن بالوصول إليه
  3. يقوم Vercel بالكشف تلقائيًا عن إطار عمل Next.js ويستخدم الإعدادات الافتراضية
  4. أضف متغيرات البيئة اللازمة في قسم «متغيرات البيئة»
  5. انقر على «نشر» وانتظر حوالي 1–2 دقيقة حتى يكتمل عملية النشر.
  6. بمجرد اكتمال عملية النشر، يقوم Vercel تلقائيًا بإنشاء اسم النطاق .vercel.app
  7. أضف نطاقًا مخصصًا من خلال «الإعدادات» -> «النطاقات»

خطوات النشر على Vercel (طريقة CLI)

BASH
# 1. Global Installation Vercel CLI
npm install -g vercel

# 2. Log In Vercel Account
vercel login

# 3. Run the deployment from the project's root directory
# The first time you run it, you'll be guided through the project setup.
vercel

# 4. Deploy to the production environment
vercel --prod

▶ المثال 1: تكوين النشر على Vercel وواجهة سطر الأوامر (CLI)

BASH
# 1. Installation Vercel CLI
npm install -g vercel

# 2. Log in to the project root directory
vercel login

# 3. Deploy the project's root directory to the preview environment
vercel

# 4. Deploy to the production environment
vercel --prod

# 5. View the current deployment status
vercel ls

# 6. View the deployment log
vercel logs --all
TS
// next.config.ts - Vercel Automatically read this configuration
import type { NextConfig } from 'next'

const config: NextConfig = {
  // Image Optimization Settings - Allow remote image domains
  images: {
    remotePatterns: [
      { protocol: 'https', hostname: 'images.example.com' },
      { protocol: 'https', hostname: '**.cloudfront.net' },
    ],
  },

  // HTTP Compression
  compress: true,

  // Remove X-Powered-By header (security)
  poweredByHeader: false,

  // Custom Build Directory(Optional)
  distDir: '.next',

  // Enable Strict Mode
  reactStrictMode: true,
}

export default config
JSON
// vercel.json - Vercel Project Configuration(Optional,Most projects do not require)
{
  "framework": "nextjs",
  "buildCommand": "npm run build",
  "outputDirectory": ".next",
  "regions": ["hnd1", "iad1"],
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        { "key": "X-Content-Type-Options", "value": "nosniff" },
        { "key": "X-Frame-Options", "value": "DENY" }
      ]
    }
  ]
}

(2) GitHub Actions CI/CD

GitHub Actions هي خدمة CI/CD تقدمها GitHub وتستخدم ملفات التكوين YAML لتحديد سير العمل. يتم تشغيل تسلسل محدد من المهام تلقائيًا مع كل طلب دفع (push) أو سحب (pull). قام توم بتكوين ثلاث مهام: الأولى تُجري فحصًا لغويًّا (linting) وفحصًا للأنواع (type checking) كلما تم إجراء عملية دفع إلى أي فرع؛ والثانية تُجري اختبارًا كاملًا وبناءً عند إجراء عملية دفع إلى فرع main؛ والثالثة تنشر تلقائيًّا إلى بيئة المعاينة عند إصدار إصدار جديد.

يتم تخزين ملفات سير العمل في الدليل .github/workflows/، ويمكنك تسميتها كما تشاء. يمكن أن يحتوي كل سير عمل على مهام متعددة، ويمكنك تعيين تبعيات بين المهام. يوفر GitHub مجموعة متنوعة من الإجراءات المتوفرة في المتجر، مما يتيح لك إعادة استخدام الخطوات التي أنشأها المجتمع مباشرةً.

تشمل المفاهيم الأساسية لـ GitHub Actions ما يلي: on تحديد أحداث التشغيل (push، pull_request، schedule، إلخ)، jobs تحديد المهام المطلوب تنفيذها، steps تحديد خطوات التنفيذ لكل مهمة، وactions/ الوحدات النمطية القابلة لإعادة الاستخدام التي يساهم بها المجتمع. يستخدم سير عمل توم ثلاثة إجراءات من المجتمع: actions/checkout@v4 (استخراج الكود)، actions/setup-node@v4 (تكوين بيئة Node.js)، وactions/upload-artifact@v4 (تحميل مخرجات البناء).

▶ المثال 2: سير عمل كامل لـ GitHub Actions

YAML
# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  # Job 1:Code Quality and Type Checking
  quality:
    name: Code Quality Check
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: TypeScript type check
        run: npx tsc --noEmit

      - name: Lint check
        run: npm run lint

  # Job 2:Run Test + Build
  test-and-build:
    name: Test & Build
    needs: quality  # Dependency quality Mission Successful
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run unit tests
        run: npm test
        env:
          CI: true

      - name: Build project
        run: npm run build
        env:
          NEXT_PUBLIC_API_URL: ${{ secrets.NEXT_PUBLIC_API_URL }}

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: next-build
          path: .next/

  # Job 3:Automatically deploy to Vercel
  deploy:
    name: Deploy to Vercel
    needs: test-and-build
    runs-on: ubuntu-latest
    # Only at main Branch Deployment
    if: github.ref == 'refs/heads/main'

    steps:
      - uses: actions/checkout@v4

      - name: Deploy to Vercel
        uses: amondnet/vercel-action@v25
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-args: '--prod'

(3) وضع استراتيجيات التحسين

لا يقتصر النشر على مجرد تحميل الكود إلى الخادم. فالتكوين المُحسَّن جيدًا لعملية البناء يمكن أن يحسّن بشكل كبير من أوقات تحميل الصفحات ويقلل من تكاليف النطاق الترددي. وقد كرَّس توم جهدًا كبيرًا لتحسين عملية النشر، مع التركيز بشكل أساسي على ثلاثة مجالات: تحليل حجم الحزم، وتحسين الصور، واستراتيجيات التخزين المؤقت.

يستخدم تحليل حجم الحزمة المكون الإضافي @next/bundle-analyzer، الذي يتيح لك فحص حجم كل وحدة بشكل مرئي وتحديد التبعيات ذات الأحجام غير الطبيعية. اكتشف توم أن moment.js يشغل مساحة 85 كيلوبايت في مشروعه. وبعد التبديل إلى dayjs (6 كيلوبايت)، انخفض حجم JavaScript الذي يتم تحميله في الشاشة الأولى بنسبة 28%. كما عثر على مكون لم يُستخدم قط ولكنه تم استيراده بشكل عام، فقام بإزالته باستخدام تقنية Tree Shaking.

يتم تنفيذ تحسين الصور باستخدام المكون المدمج next/image في Next.js، والذي يقوم تلقائيًا بإنشاء صيغ WebP/AVIF وأحجام متوافقة مع الأجهزة المختلفة، بالإضافة إلى ميزة التحميل المؤجل. تحتوي مدونة توم على عدد كبير من الصور؛ وبعد استخدام next/image، انخفض متوسط وقت تحميل الصورة من 1.2 ثانية إلى 0.3 ثانية.

يتم تنفيذ استراتيجية التخزين المؤقت من خلال تكوين رأس «Cache-Control» في شبكة توزيع المحتوى (CDN). يتم تعيين الموارد الثابتة (JS، CSS، الصور) على مدة تخزين مؤقت تبلغ سنة واحدة (max-age=31536000)، بينما يتم تعيين صفحات HTML على مدة تخزين مؤقت أقصر (max-age=60) بالاقتران مع التحديثات التلقائية لـ ISR. وبهذه الطريقة، بعد الزيارة الأولى للمستخدم، يتم تحميل الموارد الثابتة اللاحقة مباشرةً من ذاكرة التخزين المؤقت للمتصفح دون الحاجة إلى طلب جديد.

مرجع سريع لخيارات النشر الأخرى

الحل مدى تعقيد التكوين التوافق مع Next.js حالات الاستخدام
Vercel منخفض جدًا مثالي منصة النشر المفضلة لـ Next.js
Netlify منخفض جيد (بعض الميزات المتقدمة محدودة) المواقع الثابتة الصغيرة
دوكر مستوى متوسط جيد مشاريع جماعية تتطلب بيئات متسقة
Nginx التقليدي عالي يتطلب تكوين SSR يدويًا خادم مستضاف من قِبل المؤسسة
AWS Amplify الصينية جيد مشاريع منظومة AWS

▶ المثال 3: إنشاء تكوين مُحسَّن

TS
// next.config.ts - Complete Optimization Configuration
import type { NextConfig } from 'next'

// Package Volume Analysis(Enable on Demand)
const withBundleAnalyzer = process.env.ANALYZE === 'true'
  ? require('@next/bundle-analyzer')({ enabled: true })
  : (config: any) => config

const config: NextConfig = {
  // === Image Optimization ===
  images: {
    // Allowed Remote Image Domains
    remotePatterns: [
      { protocol: 'https', hostname: 'images.example.com' },
      { protocol: 'https', hostname: 'cdn.example.com' },
    ],
    // Image Format(Supported by default WebP)
    formats: ['image/avif', 'image/webp'],
    // Equipment Breakpoint(Configure according to the design draft)
    deviceSizes: [640, 768, 1024, 1280, 1536],
  },

  // === Safety and Performance ===
  compress: true,
  poweredByHeader: false,
  reactStrictMode: true,

  // === CDN Layout ===
  // If you use a custom CDN,Settings assetPrefix
  // assetPrefix: 'https://cdn.example.com',

  // === Experimental Features ===
  experimental: {
    // Optimization CSS Volume
    optimizePackageImports: ['antd', '@ant-design/icons', 'lodash-es'],
  },
}

export default withBundleAnalyzer(config)

// vercel.json - Caching and Security Header Configuration
// {
//   "headers": [
//     {
//       "source": "/static/(.*)",
//       "headers": [
//         { "key": "Cache-Control", "value": "public, max-age=31536000, immutable" }
//       ]
//     },
//     {
//       "source": "/_next/image(.*)",
//       "headers": [
//         { "key": "Cache-Control", "value": "public, max-age=86400, stale-while-revalidate=2592000" }
//       ]
//     }
//   ]
// }
BASH
# Commands for Package Volume Analysis
ANALYZE=true npm run build

# This command generates two HTML Report:
# - .next/analyze/client.html (Client-Side Code Analysis)
# - .next/analyze/server.html (Server-Side Code Analysis)

# After opening your browser to view the report,,You can identify and optimize dependencies that are too large.
# Common Optimization Techniques:
# 1. Dynamic Import: const HeavyComponent = dynamic(() => import('./HeavyComponent'))
# 2. Replacing a Large Database: moment → dayjs(Minimize 95%)
# 3. Tree Shaking: import { Button } from 'antd' in place of import { Button } from 'antd/es/button'

مثال على التحسين قبل وبعد

المقياس قبل التحسين بعد التحسين التحسن
حجم جافا سكريبت في الجزء المرئي من الصفحة 285 كيلوبايت 168 كيلوبايت انخفاض بنسبة 41%
درجة أداء Lighthouse 62 94 تحسن بمقدار 32 نقطة
TTFB (الوقت المستغرق حتى وصول البايت الأول) 420 مللي ثانية 180 مللي ثانية انخفاض بنسبة 57%
وقت البناء 3 دقائق و12 ثانية 1 دقيقة و45 ثانية انخفاض بنسبة 45%
معدل الاستجابة لشبكة توزيع المحتوى (CDN) 52% 95% زيادة بنسبة 43%

▶ المثال 4: تكوين مسار العمل المستمر (CI) في GitHub Actions

YAML
# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  lint-and-test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18, 20]
    steps:
      - uses: actions/checkout@v4
      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'
      - run: npm ci
      - run: npm run lint
      - run: npm run typecheck
      - run: npm test -- --coverage
      - name: Upload coverage
        if: matrix.node-version == 20
        uses: actions/upload-artifact@v4
        with:
          name: coverage
          path: coverage/

  build:
    needs: lint-and-test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      - run: npm ci
      - run: npm run build
      - name: Check bundle size
        run: |
          SIZE=$(du -sk .next/static | cut -f1)
          echo "Bundle size: ${SIZE}KB"
          if [ "$SIZE" -gt 500 ]; then
            echo "⚠️ Bundle exceeds 500KB threshold"
          fi

▶ المثال 5: شامل — التهيئة الكاملة لنشر Next.js في بيئة الإنتاج

YAML
# .github/workflows/deploy.yml
name: Deploy to Production

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Type check
        run: npx tsc --noEmit

      - name: Run tests
        run: npm test

      - name: Build application
        run: npm run build
        env:
          NEXT_PUBLIC_API_URL: ${{ vars.NEXT_PUBLIC_API_URL }}
          DATABASE_URL: ${{ secrets.DATABASE_URL }}

      - name: Run Lighthouse audit
        uses: treosh/lighthouse-ci-action@v12
        with:
          urls: |
            http://localhost:3000
          uploadArtifacts: true
          budgetPath: ./lighthouse-budget.json

      - name: Deploy to Vercel
        uses: amondnet/vercel-action@v25
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-args: '--prod'
          working-directory: ./

      - name: Notify deployment
        if: always()
        run: |
          STATUS="${{ job.status }}"
          curl -X POST "${{ secrets.SLACK_WEBHOOK }}" \
            -H 'Content-type: application/json' \
            -d "{\"text\":\"Deploy $STATUS on $(date -u +%Y-%m-%dT%H:%MZ)\"}"
JSON
// lighthouse-budget.json
[
  {
    "path": "/*",
    "options": { "first-contentful-paint": { "maxNumericValue": 2000 } },
    "budgets": [
      { "resourceSizes": [{ "resourceType": "script", "budget": 200 }, { "resourceType": "stylesheet", "budget": 50 }, { "resourceType": "image", "budget": 300 }, { "resourceType": "total", "budget": 600 }] }
    ]
  }
]


❓ أسئلة شائعة

س ما الفرق بين Vercel والنشر التقليدي على الخوادم؟
ج Vercel هي منصة لا تعتمد على الخوادم — فلا تحتاج إلى إدارة الخوادم، وهي تتوسع تلقائيًا، ويتم احتساب تكلفتها لكل طلب، وتوفر تسريعًا عالميًا عبر شبكة توزيع المحتوى (CDN)، وتدعم عمليات النشر التجريبية. أما النشر التقليدي فيتطلب منك شراء خوادم خاصة بك، وإعداد Nginx، وإدارة شهادات SSL، وتكوين موازنة الحمل. وتعد Vercel أكثر ملاءمة لمشاريع الواجهة الأمامية والمشاريع الشاملة، في حين أن النشر التقليدي أكثر ملاءمة للسيناريوهات التي تتطلب تكوينات مخصصة للخلفية. وتعد الفئة المجانية من Vercel أكثر من كافية للمشاريع الشخصية.
س كيف يمكنني تكوين متغيرات البيئة في Vercel؟
ج في لوحة تحكم Vercel، حدد مشروعك -> الإعدادات -> متغيرات البيئة. يمكنك تكوينها بشكل منفصل لكل بيئة (الإنتاج/المعاينة/التطوير). سيتم تضمين المتغيرات التي تبدأ بـ NEXT_PUBLIC_ في جافا سكريبت الخاص بالمتصفح؛ أما المتغيرات التي لا تحتوي على بادئة فهي متاحة فقط على جانب الخادم. قم بتمرير المتغيرات الحساسة عبر secrets في GitHub Actions، وقم بالإشارة إليها عبر ${{ secrets.XXX }} في سير عملك.
س ماذا عليّ أن أفعل إذا فشل أحد الاختبارات في عملية CI/CD؟
ج بشكل افتراضي، ستقوم GitHub Actions بإنهاء المهام اللاحقة في حالة فشل أحد الاختبارات (ولن يتم تشغيل مهمة النشر). يمكنك الاطلاع على سجلات تشغيل Actions في طلب السحب (PR) لتحديد سبب الفشل. تشمل المشكلات الشائعة: عدم وجود متغيرات بيئة الاختبار، وعدم توافق إصدارات Node.js، وفشل تثبيت التبعيات. نوصي بتشغيل npm test محليًّا أولاً للتأكد من نجاح العملية قبل إرسال التغييرات. يمكنك أيضًا تكوين continue-on-error: true للسماح للمهمة بالاستمرار حتى في حالة فشل مهام معينة.
س ما هي المقاييس التي يجب التركيز عليها لتحسين عملية البناء؟
ج ركز على ثلاثة مقاييس أساسية: حجم جافا سكريبت للشاشة الأولى (يفضل أن يكون أقل من 200 كيلوبايت)، ودرجة أداء Lighthouse (يفضل أن تكون أعلى من 90)، ووقت وصول البايت الأول (TTFB) (يفضل أن يكون أقل من 200 مللي ثانية). استخدم @next/bundle-analyzer لتحليل حجم الحزمة لكل تابع وتحديد المكتبات الكبيرة التي يمكن استبدالها أو استيرادها ديناميكيًا. عادةً ما يكون تحسين الصور هو المجال الذي يمكن فيه تحقيق التحسينات بسهولة أكبر — استخدم next/image لإنشاء تنسيق WebP وأحجام الصور المتجاوبة تلقائيًا.
س هل المستوى المجاني لـ Vercel كافٍ؟ هل هناك أي قيود؟
ج يشمل المستوى المجاني لخطة «Hobby» ما يلي: 100 جيجابايت من النطاق الترددي شهريًّا، ووقت تنفيذ يبلغ 10 ثوانٍ لكل وظيفة خادمية (Serverless Function)، و1,000 جلسة بناء شهريًّا. وهذا أكثر من كافٍ للمدونات الشخصية والمشاريع الصغيرة. القيود الرئيسية: الوظائف الخالية من الخادم لها مهلة انتظار مدتها 10 ثوانٍ (60 ثانية في خطة Pro)، ولا يتم دعم العمليات المجمعة لتحديثات ISR عند الطلب، وتنتهي صلاحية روابط النشر في وضع المعاينة بعد 30 يومًا. بالنسبة للمشاريع التجارية، نوصي بالترقية إلى خطة Pro (20 دولارًا شهريًا).

📖 ملخص


📝 تمارين

  1. انقل مشروع Next.js الخاص بك إلى مستودع GitHub، ثم قم باستيراده إلى Vercel (استيراد مستودع Git). راقب عملية النشر التلقائية وتأكد من صحة عنوان URL للمعاينة وعنوان URL للإنتاج بعد النشر. راجع سجلات النشر في لوحة تحكم Vercel لفهم كل خطوة من خطوات عملية البناء. قم بتكوين نطاق مخصص (اختياري) وقم بتمكين HTTPS.
  2. أنشئ .github/workflows/ci.yml في المشروع وقم بتكوين سير عمل CI: عندما يتم دفع (push) عملية التزام (commit) إلى أي فرع، يتم تلقائيًا تشغيل npm ci -> npm run lint -> npm test -> npm run build. قم بإدخال خطأ في lint أو فشل في الاختبار عن قصد، ثم قم بدفع التغييرات لترى ما إذا كان CI سيفشل ويعرض رسالة خطأ. بعد ذلك، قم بإصلاح الخطأ وتأكد من نجاح عملية التكامل المستمر (CI).
  3. تهيئة تحسين عملية البناء للمشروع: استخدم @next/bundle-analyzer لتحليل حجم حزمة المشروع الحالي وتحديد أكبر 3 تبعيات. قم بتنفيذ الاستيراد الديناميكي لأحد هذه المكونات الكبيرة (dynamic(() => import(...)))، وقارن التغير في حجم JavaScript قبل التحسين وبعده. في next.config.ts، قم بتمكين تحسين الصور (قم بتكوين remotePatterns) وإعدادات الضغط. وأخيرًا، استخدم أداة Lighthouse في Chrome DevTools لاختبار درجات الأداء قبل التحسين وبعده، وسجل التحسن في حجم JavaScript للشاشة الأولى ودرجات الأداء.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%