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. ما ستتعلمه
- مقارنة بين أوضاع العرض الثلاثة الرئيسية: CSR وSSR وSSG
- 5 حالات استخدام رئيسية لتقنية SSR
- هيكل مجلدات Nuxt 3 الكامل
- واجهات برمجة التطبيقات القابلة للتركيب في Nuxt 3 (useState / useFetch / useAsyncData)
- الاستيراد التلقائي في Nuxt + توجيه الملفات
- منظومة وحدات Nuxt (@nuxtjs/tailwindcss، وغيرها)
- 5 أخطاء شائعة
2. معضلة «تحميل الشاشة الأولى في 5 ثوانٍ» في تطبيق Vue أحادي الصفحة (SPA)
(1) المشكلات: بطء تحميل الشاشة الأولى لموقع CSR + عدم قدرة محركات البحث (SEO) على فهرسة المحتوى
واجهت «Alice's Vue SPA» مشكلة:
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
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)
// server/api/products.js(Nuxt 3 Automatic Routing)
export default defineEventHandler(async (event) => {
return await $fetch('https://api.example.com/products')
})
<!-- 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–5 ثوانٍ → 0.5 ثانية (-90%)
- درجة تحسين محركات البحث (SEO): 60 → 95 (+35)
- المفهرسة في Google: 0 صفحة → جميع صفحات SKU البالغ عددها 5,000 صفحة (+∞)
- المشاركة على مواقع التواصل الاجتماعي: 0 بطاقة → معاينة كاملة (Open Graph)
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) إنشاء مشروع
npx nuxi@latest init my-nuxt-app
cd my-nuxt-app
npm install
npm run dev # Default http://localhost:3000
(2) هيكل الدليل الكامل
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) توجيه الملفات (تلقائي)
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: الاسترجاع المسبق للبيانات من جانب الخادم
<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: البيانات غير المتزامنة للأغراض العامة
<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)
<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 عناصر قابلة للتركيب الأخرى
// 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
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)
<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)
<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 الكامل
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 الرئيسية
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 |
❓ أسئلة شائعة
npx nuxi generate قم بإنشاء المجلد .output/public/ ونشره على Netlify أو Vercel أو Cloudflare Pages.📖 ملخص
- CSR / SSR / SSG: أوضاع العرض الثلاثة الرئيسية: CSR (3–5 ثوانٍ لتحميل الشاشة الأولى) / SSR (0.5–1 ثانية) / SSG (0.1–0.5 ثانية)
- 5 حالات استخدام رئيسية لتقنية SSR: التجارة الإلكترونية / وسائل التواصل الاجتماعي / البيانات في الوقت الفعلي / status تسجيل الدخول / المحتوى الديناميكي
- Nuxt 3 هو إطار العمل الرسمي للتحكم في جانب الخادم (SSR) لـ Vue 3
- توجيه الملفات: الدليل "pages/" هو المسار
- 5 واجهات برمجة تطبيقات أساسية: useFetch / useAsyncData / useState / useRoute / useRuntimeConfig
- الاستيراد التلقائي: واجهة برمجة تطبيقات Vue + مكونات Nuxt القابلة للتركيب + المكونات + الأدوات المساعدة
- منظومة وحدات Nuxt: أكثر من 200 وحدة رسمية ومقدمة من المجتمع
- التحسين التلقائي لمحركات البحث (SEO): التكوين الديناميكي لـ useHead
📝 تمارين
-
أسئلة أساسية (مستوى الصعوبة: ⭐)
إنشاء مشروع Nuxt 3:
- 3 صفحات (الصفحة الرئيسية / نبذة عنا / الاتصال بنا)
- واجهة برمجة تطبيقات واحدة (/api/hello)
- شريط التنقل العلوي + تخطيط الجزء السفلي
-
مسائل متقدمة (مستوى الصعوبة: ⭐⭐)
تنفيذ الوظائف الكاملة لـ SSR في Nuxt 3:
- 5 صفحات (الصفحة الرئيسية / قائمة المنتجات / تفاصيل المنتج / سلة التسوق / تسجيل الدخول)
- مسارات الخادم/واجهة برمجة التطبيقات (/api/products)
- useFetch: الاسترجاع المسبق من جانب الخادم
- useHead: تحسين محركات البحث الديناميكي
- إدارة ولاية بينيا
-
مسألة التحدي (مستوى الصعوبة: ⭐⭐⭐)
تنفيذ مشروع «Nuxt 3 على مستوى المؤسسات» متكامل:
- 10 صفحات أو أكثر (التجارة الإلكترونية + لوحة الإدارة + المصادقة)
- 5 مسارات رئيسية لواجهة برمجة التطبيقات (API)
- 3 أوضاع للعرض (SSR / SSG / CSR الهجين)
- تحسين محركات البحث (البيانات المنظمة + Open Graph + خريطة الموقع)
- تحسين الأداء (التحميل المؤجل للصور / تقسيم الكود / شبكة توزيع المحتوى (CDN))
- النشر على Vercel Edge
- أنواع TypeScript الكاملة