Vue.js: SSR/SSG و Nuxt

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

يُعد كل من SSR (العرض من جانب الخادم) وSSG (إنشاء المواقع الثابتة) طرقًا متقدمة للنشر لتطبيقات Vue — حيث يوفران أوقات تحميل أسرع للصفحة الأولى وتحسينًا أفضل لمحركات البحث (SEO) مقارنةً بـ CSR (العرض من جانب العميل). Nuxt 3 هو framework Vue 3 يدعم SSR ويوفر ميزات التوجيه وإدارة الstatus وتحسين محركات البحث (SEO) جاهزة للاستخدام.

إن فهم أوضاع العرض الثلاثة — CSR و SSR و SSG — سيمكّنك من اختيار طريقة النشر الصحيحة التي تناسب حالتك المحددة. سيساعدك هذا الدرس على بناء أساس معرفي متين حول SSR و SSG.

1. ما ستتعلمه



2. معضلة «تحميل الشاشة الأولى في 5 ثوانٍ» في تطبيق Vue أحادي الصفحة (SPA)

(1) المشكلات: بطء تحميل الشاشة الأولى لموقع CSR + عدم قدرة محركات البحث (SEO) على فهرسة المحتوى

واجهت «Alice's Vue SPA» مشكلة:

TEXT 📖 للعرض فقط
Traditional Vue SPA(CSR):
  1. Browser Request → Returns null HTML(<div id="app"></div>)
  2. Download JS(500KB)
  3. Execute JS(Vue Start)
  4. Rendered Content
  5. Users view the content
  
  Time to First View: 3-5s
  SEO:Google Can't find the content(spa The content is JS Rendered)

مدير المنتج تشارلي:

«أليس، ترتيبنا في نتائج بحث جوجل ضعيف. نحن بحاجة إلى HTML الذي يتم عرضه عبر الخادم حتى تتمكن محركات البحث من فهرسة محتوانا. كما أننا بحاجة إلى عرض أولي أسرع.»

(2) حل SSR في Nuxt 3

TEXT 📖 للعرض فقط
Nuxt 3 SSR:
  1. Browser Request → Server-Side Rendering Complete HTML
  2. Return with content HTML (Home Page 0.5s)
  3. Download JS(hydration Required)
  4. Client"Activate"(Take Over Interaction)
  
  Time to First View: 0.5s
  SEO:✅ Perfect(HTML Contents)
JS
// server/api/products.js(Nuxt 3 Automatic Routing)
export default defineEventHandler(async (event) => {
  return await $fetch('https://api.example.com/products')
})
VUE
<!-- pages/products.vue(Automatic Routing) -->
<template>
  <div>
    <ProductCard v-for="product in products" :key="product.id" :product="product" />
  </div>
</template>

<script setup lang="ts">
// useFetch Prefetching Data on the Server Side
const { data: products } = await useFetch('/api/products')
</script>

(3) الإيرادات

بعد الترحيل إلى Nuxt 3 SSR:



3. CSR مقابل SSR مقابل SSG

(1) 3 أوضاع عرض رئيسية

الوضع توقيت العرض الجزء المرئي من الصفحة تحسين محركات البحث (SEO) حمل الخادم
CSR (العرض من جانب العميل) المتصفح بطيء (3–5 ثوانٍ) ❌ ضعيف منخفض
SSR (العرض من جانب الخادم) لكل طلب متوسط (0.5–1 ثانية) ✅ جيد مرتفع
SSG (إنشاء المواقع الثابتة) وقت الإنشاء **سريع (0.1–0.5 ثانية) ✅ مثالي الأقل

(2) 5 حالات استخدام رئيسية لتقنية SSR

السيناريو الوضع الموصى به
مواقع المحتوى (المدونات / الوثائق / صفحات التسويق) SSG (الأسرع + مثالي لتحسين محركات البحث)
تفاصيل منتجات التجارة الإلكترونية (5,000 SKU) SSR (بيانات في الوقت الفعلي + تحسين محركات البحث)
الخلفية في نموذج SaaS (بعد تسجيل الدخول) CSR (لا يلزم تحسين محركات البحث)
منصات التواصل الاجتماعي (المحتوى الديناميكي) SSR (في الوقت الفعلي + تحسين محركات البحث)
مدونة شخصية (محتوى محدود) SSG (الأبسط)

(3) 5 مزايا رئيسية لنظام SSG مقارنةً بنظام SSR

مزايا SSG مزايا SSR
السرعة القصوى (مباشرةً من شبكة توزيع المحتوى) البيانات في الوقت الفعلي (لكل طلب)
أقل حمل على الخادم تجربة تسجيل دخول مخصصة
قابلية توسع غير محدودة (CDN) مثالي للمحتوى الديناميكي
لا حاجة إلى خادم بعد الإنشاء مثالي للتطبيقات التفاعلية
استضافة مجانية على Netlify / Vercel خادم Node.js


4. أساسيات Nuxt 3

(1) إنشاء مشروع

BASH
npx nuxi@latest init my-nuxt-app
cd my-nuxt-app
npm install
npm run dev  # Default http://localhost:3000

(2) هيكل الدليل الكامل

TEXT 📖 للعرض فقط
my-nuxt-app/
├-- assets/              # Resources(Image,Font)
│   └-- css/
│       └-- main.css
├-- components/          # Public Components
│   ├-- AppHeader.vue
│   └-- AppFooter.vue
│   └-- product/
│       └-- ProductCard.vue  # Automatic Registration of Nested Directories
├-- composables/         # Composite Functions
│   └-- useAuth.ts
├-- layouts/             # Layout
│   ├-- default.vue      # Default Layout
│   └-- admin.vue        # Backend Layout
├-- middleware/          # Routing Middleware
│   └-- auth.ts
├-- pages/               # File Routing(Automatically Generated)
│   ├-- index.vue        # /
│   ├-- about.vue       # /about
│   ├-- products/
│   │   ├-- index.vue    # /products
│   │   └-- [id].vue     # /products/:id
│   └-- admin/
│       └-- index.vue    # /admin
├-- plugins/             # Nuxt Plugins
│   └-- pinia.ts
├-- public/              # Static Resources
├-- server/              # Server-side code
│   ├-- api/             # API Routing(Automatic Registration)
│   │   └-- products.ts  # /api/products
│   └-- middleware/      # Server-Side Middleware
├-- stores/              # Pinia stores
├-- app.vue              # Root Component
├-- nuxt.config.ts       # Nuxt Layout
└-- package.json

(3) توجيه الملفات (تلقائي)

TEXT 📖 للعرض فقط
pages/index.vue           → /
pages/about.vue          → /about
pages/products/index.vue → /products
pages/products/[id].vue  → /products/:id
pages/admin/index.vue    → /admin

لا حاجة إلى تكوين جدول توجيه — الملف نفسه هو المسار.



5. واجهة برمجة التطبيقات الأساسية لـ Nuxt 3

(1) useFetch: الاسترجاع المسبق للبيانات من جانب الخادم

VUE
<script setup lang="ts">
// useFetch: SSR when server executes, CSR when cliente runs
const { data, pending, erro, refresh } = await useFetch('/api/products')

// 5 Large Return Values
// data: Response Data
// pending: Loading...
// erro: Error Message
// refresh: How to Retrieve It Again
// status: Status Code
</script>

(2) useAsyncData: البيانات غير المتزامنة للأغراض العامة

VUE
<script setup lang="ts">
const { data } = await useAsyncData('products', () => 
  $fetch('/api/products')
)

// Options: Cache, Dependency, Convert
const { data: users } = await useAsyncData(
  'users',
  () => $fetch('/api/users'),
  {
    cache: 'force-cache',  // Force Caching
    default: () => []      // Default value
  }
)
</script>

(3) useState: status مشتركة بين المكونات ومتوافقة مع التحميل الجانبي للصفحة (SSR)

VUE
<script setup lang="ts">
// useState Replace ref(SSR Friendly)
const cart = useState('cart', () => ({ items: [], total: 0 }))

// Edit
cart.value.items.push(product)
</script>

(4) 5 عناصر قابلة للتركيب الأخرى

TS
// 1. useFetch:Server-Side Data Prefetching
const { data } = await useFetch('/api/products')

// 2. useAsyncData:Generic Asynchronous
const { data } = await useAsyncData('key', fetcher)

// 3. useState:Global State(SSR Friendly)
const user = useState('user', () => null)

// 4. useRoute:Current Route
const route = useRoute()

// 5. useRuntimeConfig:Runtime Configuration
const config = useRuntimeConfig()


6. التكوين الأساسي لـ Nuxt 3

(1) nuxt.config.ts

TS
export default defineNuxtConfig({
  // 1. Module
  modules: [
    '@nuxtjs/tailwindcss',
    '@pinia/nuxt',
    '@vueuse/nuxt'
  ],
  
  // 2. CSS
  css: ['~/assets/css/main.css'],
  
  // 3. Runtime Configuration
  runtimeConfig: {
    apiSecret: 'xxx',  // Server-side
    public: {
      apiBase: 'https://api.example.com'  // Client
    }
  },
  
  // 4. Rendering Mode
  ssr: true,  // Enable SSR
  
  // 5. Application Configuration
  app: {
    head: {
      title: 'My App',
      meta: [
        { name: 'description', content: 'My app description' }
      ]
    }
  }
})

(2) الاستيراد التلقائي (لا يلزم وجود import)

VUE
<script setup lang="ts">
// ✅ Nuxt Automatic Import:
// - Vue 3 API(ref, computed, watch)
// - Nuxt 3 composables(useFetch, useState)
// - Components(components/ Table of Contents)
// - utils/ Table of Contents

const count = ref(0)
const { data } = await useFetch('/api/products')
</script>

(3) التحسين التلقائي لمحركات البحث (SEO)

VUE
<script setup lang="ts">
useHead({
  title: 'iPhone 15 Pro - My Shop',
  meta: [
    { name: 'description', content: 'Buy iPhone 15 Pro at best price' },
    { property: 'og:title', content: 'iPhone 15 Pro' },
    { property: 'og:image', content: '/iphone.jpg' }
  ]
})
</script>


7. أمثلة كاملة: 5 سيناريوهات رئيسية في Nuxt

▶ مثال: 1. هيكل مجلدات Nuxt الكامل

TEXT 📖 للعرض فقط
my-nuxt-app/
├-- pages/           # File Routing
├-- components/      # Automatic Registration
├-- composables/     # Automatic Import
├-- server/api/      # API Routing
├-- server/middleware/
├-- middleware/      # Client-side middleware
├-- plugins/         # Nuxt Plugins
├-- layouts/         # Layout
└-- nuxt.config.ts

▶ مثال: 2. واجهات برمجة التطبيقات (API) الخمس الأساسية

واجهة برمجة التطبيقات (API) الغرض
useFetch استرجاع البيانات من جانب الخادم
useAsyncData البيانات غير المتزامنة العامة
useState الstatus العامة (متوافقة مع SSR)
useRoute المسار الحالي
useRuntimeConfig تكوين وقت التشغيل

▶ مثال: 3. 5 وحدات Nuxt الرئيسية

TS
modules: [
  '@nuxtjs/tailwindcss',  // Tailwind Integration
  '@pinia/nuxt',          // Pinia Status
  '@vueuse/nuxt',         // VueUse
  '@nuxt/image',          // Image Optimization
  'nuxt-icon'             // Icon
]
▶ جرّب الكود

▶ مثال: 4. 5 حالات الاستخدام الرئيسية

السيناريو حل Nuxt
موقع المحتوى SSG (nuxi generate)
التجارة الإلكترونية SSR (الافتراضي)
الخلفية CSR (ssr: false)
مطور متكامل Nuxt + الخادم/واجهة برمجة التطبيقات
مدونة ثابتة SSG + Markdown

▶ مثال: 5. مرجع سريع لـ 5 أخطاء شائعة

الخطأ الأعراض الحل
بيانات useFetch غير معروضة لا يوجد await تم التغيير إلى const { data } = await ...
فشل تهيئة SSR عدم اتساق البيانات استخدام useState بدلاً من ref
التوجيه لا يعمل مسار الملف غير صحيح ضعه في الدليل pages/
فشل تثبيت الوحدة الاسم غير صحيح تحقق من تهجئة كلمة "modules"
غير مفهرس من قبل SEO ssr: false تمكين SSR


❓ أسئلة شائعة

س أيهما يجب أن أختار: CSR أم SSR أم SSG؟
ج مواقع المحتوى (المدونات/الوثائق) → SSG. التجارة الإلكترونية/وسائل التواصل الاجتماعي → SSR. الخلفية/SaaS → CSR. يدعم Nuxt 3 الخيارات الثلاثة جميعها.
س ما هو إصدار Node.js الذي يتطلبه Nuxt 3؟
ج Node.js 18 أو أحدث (اعتبارًا من أكتوبر 2023). ولا يزال Nuxt 2 يدعم Node.js 16.
س ما الفرق بين useFetch و useAsyncData؟
ج useFetch هي صيغة مبسطة لـ useAsyncData (خاصةً للتعامل مع عمليات الاسترجاع). وفي معظم الحالات، يكفي استخدام useFetch.
س Nuxt 3 أم Nuxt 2؟
ج يدعم Nuxt 3 (نوفمبر 2022) Vue 3 وVite وTypeScript كمكونات أساسية. أما Nuxt 2 فهو في وضع الصيانة.
س كيف يمكنني إنشاء SSG؟
ج npx nuxi generate قم بإنشاء المجلد .output/public/ ونشره على Netlify أو Vercel أو Cloudflare Pages.
س ماذا عليّ أن أفعل إذا كان خادم SSR يتحمل عبئًا ثقيلًا؟
ج قم بالنشر باستخدام خادم Nitro (المدمج في Nuxt) على Vercel Edge أو Cloudflare Workers أو مجموعة Node. أو انتقل إلى SSG.

📖 ملخص


📝 تمارين

  1. أسئلة أساسية (مستوى الصعوبة: ⭐)

    إنشاء مشروع Nuxt 3:

    • 3 صفحات (الصفحة الرئيسية / نبذة عنا / الاتصال بنا)
    • واجهة برمجة تطبيقات واحدة (/api/hello)
    • شريط التنقل العلوي + تخطيط الجزء السفلي
  2. مسائل متقدمة (مستوى الصعوبة: ⭐⭐)

    تنفيذ الوظائف الكاملة لـ SSR في Nuxt 3:

    • 5 صفحات (الصفحة الرئيسية / قائمة المنتجات / تفاصيل المنتج / سلة التسوق / تسجيل الدخول)
    • مسارات الخادم/واجهة برمجة التطبيقات (/api/products)
    • useFetch: الاسترجاع المسبق من جانب الخادم
    • useHead: تحسين محركات البحث الديناميكي
    • إدارة ولاية بينيا
  3. مسألة التحدي (مستوى الصعوبة: ⭐⭐⭐)

    تنفيذ مشروع «Nuxt 3 على مستوى المؤسسات» متكامل:

    1. 10 صفحات أو أكثر (التجارة الإلكترونية + لوحة الإدارة + المصادقة)
    2. 5 مسارات رئيسية لواجهة برمجة التطبيقات (API)
    3. 3 أوضاع للعرض (SSR / SSG / CSR الهجين)
    4. تحسين محركات البحث (البيانات المنظمة + Open Graph + خريطة الموقع)
    5. تحسين الأداء (التحميل المؤجل للصور / تقسيم الكود / شبكة توزيع المحتوى (CDN))
    6. النشر على Vercel Edge
    7. أنواع TypeScript الكاملة
Web-Tutorial.com

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

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

100%