404 Not Found

404 Not Found


nginx

مقدمة في Nuxt 3 ومفهوم SSR

يختار Charlie مجموعة التقنيات لمنصته التجارية الإلكترونية MegaShop—مع ملايين صفحات المنتجات، يحتاج إلى SEO من الدرجة الأولى، ويجب أن تحمّل الصفحة بسرعة على الشاشة الأولى. حلول CSR التقليدية تمنع محركات البحث من الزحف إلى بيانات المنتجات، مما يؤدي إلى حركة مرور كارثية. قدرات SSR في Nuxt 3 هي بالضبط ما يحتاجه.

1. ما ستتعلمه


2. قصة حقيقية لمهندس معمارية

(1) نقطة الألم: CSR يجعل ملايين صفحات المنتجات "غير مرئية"

منصة MegaShop الخاصة بـ Charlie تضم أكثر من مليون صفحة منتج، لكن بعد التحول إلى CSR النقي (التصيير من جانب العميل)، لم يتمكن زاحف Google إلا من الحصول على <div id="app"></div> فارغ—مع غياب عناوين المنتجات والأسعار والأوصاف. تراجعت تصنيفات SEO إلى الصفحة الخامسة؛ لم تتمكن Alice (المستهلكة) من العثور على المنتجات على الإطلاق، وكان Bob (المسؤول) قلقًا من حركة المرور العضوية شبه المنعدمة.

(2) حلول SSR في Nuxt 3

يقوم Nuxt 3 بتصيير HTML من جانب الخادم، لذا يتلقى الزاحف صفحة المنتج الكاملة—بالعنوان والسعر والبيانات المهيكلة. يحتاج Charlie فقط إلى إنشاء مشروع، و SSR جاهز للاستخدام فورًا:

BASH
# إنشاء مشروع Nuxt 3 مع تفعيل SSR افتراضيًا
npx nuxi@latest init megashop

(3) الفوائد: ارتفاع كبير في حركة مرور SEO

بعد التحول إلى SSR في Nuxt 3، ارتفعت صفحات فهرسة Google لـ MegaShop من 2,000 إلى 800,000، ونمت حركة المرور العضوية بنسبة 340%، وانخفض وقت تحميل الشاشة الأولى من 4.2 ثانية إلى 1.1 ثانية.


3. العلاقة بين Nuxt 3 و Vue 3

Nuxt 3 هو إطار عمل متكامل مبني على Vue 3، بقيادة Sébastien Chopin، عضو في الفريق الأساسي لـ Vue.

(1) مقارنة التموضع

البُعد Vue 3 Nuxt 3
التموضع إطار عمل UI تقدمي إطار ميتا متكامل مبني على Vue 3
التصيير CSR فقط SSR / CSR / SSG / ISR / ESR
المسارات إعداد يدوي لـ vue-router مسارات مولّدة تلقائيًا من الملفات
استرجاع البيانات تغليف يدوي useFetch / useAsyncData
البناء يتطلب Vite/Webpack Vite مدمج
جانب الخادم لا يوجد محرك خادم Nitro
الاستيراد التلقائي لا يوجد مكونات/Composables/دوال مساعدة

(2) القيمة الأساسية لـ Nuxt 3

💡 نصيحة: Nuxt 3 ليس بديلًا لـ Vue 3، بل إطار عمل على مستوى المؤسسات مبني على Vue 3 يوفر قدرات هندسية متكاملة.


4. مقارنة أوضاع التصيير الخمسة

(1) عرض شامل لأوضاع التصيير

100%
flowchart TB
    A[User Request] --> B{Rendering Mode}
    B -->|SSR| C[Server renders HTML<br/>on every request]
    B -->|CSR| D[Browser renders HTML<br/>after JS download]
    B -->|SSG| E[HTML pre-built<br/>at build time]
    B -->|ISR| F[HTML cached +<br/>revalidate on interval]
    B -->|ESR| G[Edge CDN renders<br/>closest to user]
    C --> H[Full HTML response]
    D --> I[Empty shell + JS bundle]
    E --> H
    F --> H
    G --> H

(2) المقارنات الرئيسية للنماذج الخمسة

البُعد SSR CSR SSG ISR ESR
توقيت التصيير لكل طلب جانب المتصفح وقت البناء تخزين مؤقت + تحقق دوري عقدة CDN الحافة
صداقة لـ SEO ✅ ممتاز ❌ ضعيف ✅ ممتاز ✅ ممتاز ✅ ممتاز
سرعة تحميل الشاشة الأولى ⚡ سريع 🐢 بطيء ⚡⚡ الأسرع ⚡⚡ سريع ⚡⚡⚡ الأسرع
حالة البيانات في الوقت الفعلي ✅ فوري ✅ فوري ❌ ثابت ⚠️ تحديثات مجدولة ⚠️ تحديثات مجدولة
حمل الخادم 🔴 عالي 🟢 منخفض 🟢 الأقل 🟡 متوسط 🟡 متوسط
حالات الاستخدام صفحات تفصيلية ديناميكية إدارة الخلفية مدونة/توثيق قوائم المنتجات صفحات دولية

(3) شرح مفصل لسير عمل SSR

SSR (التصيير من جانب الخادم) هو وضع التصيير الافتراضي في Nuxt 3. العملية الأساسية كالتالي:

  1. عنوان URL لطلب المستخدم
  2. تصيير مكونات Vue على جانب خادم Nuxt
  3. توليد سلسلة HTML كاملة
  4. إرسال HTML إلى المتصفح
  5. عرض المتصفح للصفحة (مرئية على الشاشة الأولى)
  6. تحميل ملف JS، "إماهته"، وربط الأحداث

(1) ▶ مثال: مقارنة استجابات SSR و CSR

HTML
<!-- استجابة SSR: HTML كامل بالمحتوى -->
<div id="app">
  <h1>MegaShop - Premium Headphones</h1>
  <p>Price: $299.99 USD</p>
  <p>1.2 thousand reviews</p>
</div>

<!-- استجابة CSR: هيكل فارغ -->
<div id="app"></div>
<script src="/bundle.js"></script>

الناتج:

TEXT
// Execution Successful

(2) ▶ مثال: صفحة SSR في Nuxt 3

VUE
<!-- pages/index.vue -->
<template>
  <div>
    <h1>{{ product.name }}</h1>
    <p>Price: ${{ product.price }} USD</p>
  </div>
</template>

<script setup lang="ts">
// البيانات المُحضّرة على الخادم، مضمّنة في استجابة HTML
const { data: product } = await useFetch('/api/products/featured')
</script>

الناتج:

TEXT
// Execution Successful

(3) ▶ مثال: صفحة وضع CSR

VUE
<!-- pages/dashboard.vue - صفحة من جانب العميل فقط -->
<template>
  <div>
    <h1>Admin Dashboard</h1>
    <p>Welcome, Bob</p>
  </div>
</template>

<script setup lang="ts">
// فرض التصيير من جانب العميل
definePageMeta({
  ssr: false
})

const { data: stats } = await useFetch('/api/admin/stats')
</script>

الناتج:

TEXT
// Execution Successful

5. البنية الأساسية لـ Nuxt 3

(1) مكونات البنية

100%
graph TB
    A[Nuxt 3] --> B[Vite - Build Tool]
    A --> C[Vue 3 - UI Framework]
    A --> D[Nitro - Server Engine]
    A --> E[Auto-imports System]
    D --> F[H3 - HTTP Framework]
    D --> G[Storage Layer]
    D --> H[Cache API]
    E --> I[Components]
    E --> J[Composables]
    E --> K[Utilities]

(2) مسؤوليات الوحدات الأساسية

الوحدة المسؤوليات تطبيق MegaShop
Vite أداة البناء، HMR (إعادة تحميل سريعة فائقة) تحديث صفحات المنتجات خلال ثوانٍ أثناء التطوير
Vue 3 Composition API + التفاعلية مكونات بطاقات المنتجات/سلة التسوق
Nitro محرك جانب الخادم، نشر مسبق الإعداد متعدد توجيه API + تخزين ISR المؤقت
Auto-imports تسجيل تلقائي للمكونات/الدوال استخدام useFetch مباشرة بدون import
H3 إطار HTTP خفيف معالجة طلبات API والوسائط

(1) ▶ مثال: كيف يعمل الاستيراد التلقائي

VUE
<!-- لا حاجة لاستيراد يدوي -->
<template>
  <div>
    <ProductCard :product="item" />
    <!-- ProductCard مستورد تلقائيًا من components/ -->
  </div>
</template>

<script setup lang="ts">
// useFetch، useState، useRouter - جميعها مستوردة تلقائيًا
const { data: item } = await useFetch('/api/products/1')
const router = useRouter()
const cart = useState('cart', () => [])
</script>

الناتج:

TEXT
// Execution Successful

(2) ▶ مثال: مسار API لـ Nitro

TYPESCRIPT
// server/api/products/index.ts
export default defineEventHandler(async (event) => {
  const query = getQuery(event)
  const page = Number(query.page) || 1
  const limit = Number(query.limit) || 20

  # جلب المنتجات مع التصفح
  const products = await fetchProducts(page, limit)

  return {
    items: products,
    total: 1000000, # مليون منتج
    page,
    limit
  }
})

الناتج:

TEXT
// Execution Successful

6. تحليل سيناريو MegaShop

(1) لماذا يجب استخدام SSR لصفحات منتجات بعددها بالملايين؟

المتطلب أداء CSR أداء SSR
معدل فهرسة Google < 5% > 95%
LCP للشاشة الأولى 3.5-5 ث 0.8-1.5 ث
اسم المنتج يظهر في HTML ❌ يتطلب JS ✅ مضمّن مباشرة
دعم البيانات المهيكلة ❌ غير مرئي للزواحف ✅ إخراج كامل
معاينة المشاركة الاجتماعية ❌ فارغة ✅ عرض صحيح

(1) ▶ مثال: مخرجات SSR لصفحة منتج MegaShop

HTML
<!-- HTML مُصيّر من جانب الخادم لـ /products/headphones-123 -->
<!DOCTYPE html>
<html>
<head>
  <title>Premium Headphones - MegaShop</title>
  <meta name="description" content="Premium wireless headphones, $299.99 USD">
  <script type="application/ld+json">
  {
    "@type": "Product",
    "name": "Premium Headphones",
    "price": "299.99",
    "priceCurrency": "USD",
    "aggregateRating": { "ratingValue": "4.8", "reviewCount": "1200" }
  }
  </script>
</head>
<body>
  <div id="app">
    <h1>Premium Headphones</h1>
    <p>$299.99 USD</p>
    <p>1.2 thousand reviews · 4.8 stars</p>
  </div>
</body>
</html>

الناتج:

TEXT
// Execution Successful

7. نظرة عامة على نظام Nuxt 3 البيئي

(1) نظام الوحدات الرسمي

الوحدة الوظيفة الاستخدام في MegaShop
@nuxtjs/tailwindcss تكامل إطار CSS تخطيط متجاوب
@nuxt/image تحسين الصور تحويل WebP + تحميل كسول
@nuxtjs/i18n التدويل صيني/إنجليزي/ياباني
@nuxtjs/sitemap توليد خريطة الموقع SEO لملايين الصفحات
@pinia/nuxt إدارة الحالة سلة التسوق/حالة المستخدم
@nuxt/devtools أدوات المطور التصحيح وتحليل الأداء

(2) حجم المجتمع

(1) ▶ مثال: تثبيت وحدة رسمية

BASH
# تثبيت وحدة Tailwind CSS
npm install @nuxtjs/tailwindcss

# تثبيت إدارة حالة Pinia
npm install @pinia/nuxt

# تثبيت وحدة i18n
npm install @nuxtjs/i18n

الناتج:

TEXT
# Command executed successfully
TYPESCRIPT
// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    '@nuxtjs/tailwindcss',
    '@pinia/nuxt',
    '@nuxtjs/i18n'
  ]
})

8. مثال شامل: صفحة منتج MegaShop بـ SSR

VUE
<!-- pages/products/[id].vue -->
<template>
  <div class="product-page">
    <h1>{{ product?.name }}</h1>
    <p class="price">${{ product?.price }} USD</p>
    <p>{{ product?.reviewCount }} reviews</p>
    <button @click="addToCart(product)">
      Add to Cart
    </button>
  </div>
</template>

<script setup lang="ts">
interface Product {
  id: number
  name: string
  price: number
  reviewCount: number
}

// SSR: البيانات مُحضّرة على الخادم، مضمّنة في HTML الأولي
const route = useRoute()
const { data: product } = await useFetch<Product>(`/api/products/${route.params.id}`)

// بيانات وصفية لـ SEO
useHead({
  title: `${product.value?.name} - MegaShop`,
  meta: [
    { name: 'description', content: `Buy ${product.value?.name} for $${product.value?.price} USD` }
  ]
})

const cart = useState<Product[]>('cart', () => [])
function addToCart(item: Product | null) {
  if (item) cart.value.push(item)
}
</script>

❓ أسئلة شائعة

س ما الفرق بين Nuxt 3 و Next.js؟
ج Nuxt 3 مبني على Vue 3 + Vite، بينما Next.js مبني على React + Webpack/Turbopack. يقدم Nuxt 3 استيرادًا تلقائيًا واصطلاحات ملفات أكثر شمولية، ويدعم محرك Nitro إعدادات نشر أكثر.
س هل سيضع SSR حملاً ثقيلًا على الخادم؟
ج للصفحات ذات الحركة المرورية العالية، يمكنك استخدام تخزين ISR المؤقت أو تصيير ESR الحافي لتقليل الحمل على الخادم. تتيح routeRules في Nuxt 3 إعداد استراتيجية التصيير بشكل مستقل لكل مسار.
س هل يمكنني استخدام Nuxt 3 بدون SSR؟
ج نعم. يمكنك تعطيل SSR عالميًا بتعيين ssr: false في nuxt.config.ts، أو تعطيله لصفحات فردية باستخدام definePageMeta. صفحات الإدارة تستخدم عادةً CSR.
س هل يمكنني استخدام APIs المتصفح على صفحة SSR؟
ج لا توجد بيئة متصفح أثناء مرحلة SSR، لذا استخدام window أو document مباشرة سيؤدي إلى خطأ. تحتاج إلى وضع الكود داخل خطاف onMounted أو استخدام import.meta.client للتحقق من البيئة.
س هل يدعم Nuxt 3 لغة TypeScript؟
ج دعم أصلي. يقوم Nuxt 3 تلقائيًا بتوليد .nuxt/tsconfig.json، وجميع المكونات و Composables و APIs تستنتج الأنواع بالكامل، دون الحاجة لإعداد يدوي.
س كيف يضمن MegaShop سرعة بناء الصفحات لملايين صفحات المنتجات؟
ج لا نقوم ببناء جميع الصفحات مسبقًا. نستخدم التصيير من جانب الخادم (SSR) لكل طلب مع التصيير في المتصفح (ISR) لتخزين الصفحات الشائعة مؤقتًا. أثناء البناء، نُصيّر مسبقًا الصفحات الرئيسية فقط (الصفحة الرئيسية/صفحات الفئات)، بينما تستخدم صفحات تفاصيل المنتجات SSR + ISR.

📖ملخص


📝تمارين

  1. تمرين أساسي (الصعوبة: ⭐): استخدم npx nuxi@latest init لإنشاء مشروع Nuxt 3 وتحقق مما إذا كان SSR مفعّلًا في الإعدادات الافتراضية.
  2. تمرين متقدم (الصعوبة: ⭐⭐): استخدم useFetch في الصفحة الرئيسية للمشروع لاسترجاع البيانات من API عام، ثم تحقق مما إذا كانت البيانات مضمّنة في "عرض المصدر" في المتصفح (للتحقق من SSR).
  3. تحدٍ (الصعوبة: ⭐⭐⭐): أنشئ صفحة باستخدام وضع CSR (definePageMeta({ ssr: false })) وقارن الفروقات بينها وبين صفحة SSR عند عرض المصدر.

---|

Web-Tutorial.com

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

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

100%