البدء مع Nuxt: دليل شامل لتطوير الويب الحديث

رائد البحري
رائد البحري
المؤسس و مطور منتجاتa year agoقراءة 15 دقيقة
البدء مع Nuxt: دليل شامل لتطوير الويب الحديث

أصبح Nuxt أحد أكثر الأطر شيوعاً لبناء تطبيقات الويب الحديثة مع Vue.js. سواء كنت تقوم بإنشاء مدونة، موقع تجارة إلكترونية، أو تطبيق ويب معقد، يوفر Nuxt الأدوات والهيكل الذي تحتاجه لبناء مشاريع سريعة ومتوافقة مع SEO وسهلة الصيانة.

سيأخذك هذا الدليل الشامل من الصفر إلى الإنتاجية مع Nuxt، تغطية كل شيء من الإعداد الأساسي إلى الميزات المتقدمة وأفضل الممارسات.

ما هو Nuxt ولماذا يجب استخدامه؟#

Nuxt هو إطار عمل مبني على Vue.js يضيف ميزات قوية للتطبيقات الجاهزة للإنتاج. فكر فيه كـ Vue.js مع قوى خارقة لبناء تطبيقات الويب الكاملة.

الفوائد الرئيسية#

1. الرسم من جانب الخادم (SSR) جاهز على عكس تطبيقات Vue التقليدية التي ترسم على العميل، يمكن لـ Nuxt رسم صفحاتك على الخادم، تسليم HTML مكتمل للمتصفح. هذا يعني:

  • SEO أفضل (محركات البحث ترى محتواك الكامل فوراً)
  • تحميل صفحات أولي أسرع
  • أداء أفضل على الأجهزة البطيئة

2. التوجيه المبني على الملفات لا حاجة لتكوين المسارات يدوياً. أنشئ ملف في مجلد pages، وNuxt ينشئ مسار له تلقائياً:

text
pages/
  index.vue          → /
  about.vue          → /about
  blog/
    index.vue        → /blog
    [slug].vue       → /blog/:slug

3. الاستيراد التلقائي يستورد Nuxt تلقائياً المكونات والوظائف والأدوات. اكتب كود أقل:

vue
<!-- لا حاجة للاستيراد! -->
<script setup>
const count = ref(0)  // ref مستورد تلقائياً
const route = useRoute()  // useRoute مستورد تلقائياً
</script>

4. مبني على أدوات حديثة

  • Vite للتطوير السريع وإعادة التحميل الساخن (HMR)
  • Nitro لمحرك خادم قوي ومحمول
  • دعم TypeScript جاهز
  • Vue 3 مع Composition API

5. أوضاع رسم مرنة اختر النهج الأفضل لكل صفحة:

  • SSR (الرسم من جانب الخادم)
  • SPA (تطبيق صفحة واحدة)
  • SSG (توليد الموقع الثابت)
  • ISR (التجديد الثابت التدريجي)

تثبيت Nuxt#

المتطلبات الأساسية#

تأكد من تثبيت Node.js (الإصدار 18.0.0 أو أعلى). تحقق من إصدارك:

bash
node --version

إنشاء مشروعك الأول#

افتح الطرفية وشغل:

bash
npx nuxi@latest init my-app

سيتم سؤالك عن بعض الأسئلة:

  • مدير الحزم: اختر npm، yarn، pnpm، أو bun
  • تهيئة مستودع git: نعم/لا

بعد الإنشاء، انتقل إلى مشروعك وابدأ خادم التطوير:

bash
cd my-app
npm install
npm run dev

افتح متصفحك على http://localhost:3000 وسترى تطبيق Nuxt الجديد!

هيكل المشروع#

إليك ما ينشئه Nuxt لك:

text
my-app/
├── .nuxt/              # الملفات المولدة (لا تحرر)
├── node_modules/       # التبعيات
├── pages/              # صفحات التطبيق
│   └── index.vue       # الصفحة الرئيسية (/)
├── public/             # الملفات الثابتة
├── server/             # مسارات API الخلفية
├── app.vue             # المكون الجذر
├── nuxt.config.ts      # تكوين Nuxt
└── package.json        # بيانات المشروع

المفاهيم الأساسية#

1. الصفحات والتوجيه#

أنشئ ملف جديد في مجلد pages:

pages/about.vue

vue
<script setup>
definePageMeta({
  title: 'من نحن'
})
</script>

<template>
  <div>
    <h1>عن شركتنا</h1>
    <p>نبني منتجات رائعة...</p>
  </div>
</template>

المسارات الديناميكية:

أنشئ ملف مع أقواس للأجزاء الديناميكية:

pages/blog/slug.vue

vue
<script setup>
const route = useRoute()
const slug = route.params.slug

// جلب منشور المدونة بناءً على slug
const { data: post } = await useFetch(`/api/posts/${slug}`)
</script>

<template>
  <article>
    <h1>{{ post.title }}</h1>
    <div v-html="post.content"></div>
  </article>
</template>

2. التخطيطات#

التخطيطات تغلف صفحاتك بهيكل مشترك (الرأس، التذييل، إلخ).

layouts/default.vue

vue
<template>
  <div>
    <header>
      <nav>
        <NuxtLink to="/">الرئيسية</NuxtLink>
        <NuxtLink to="/about">من نحن</NuxtLink>
        <NuxtLink to="/blog">المدونة</NuxtLink>
      </nav>
    </header>
    
    <main>
      <!-- محتوى صفحتك يأتي هنا -->
      <slot />
    </main>
    
    <footer>
      <p>&copy; 2025 تطبيقي</p>
    </footer>
  </div>
</template>

استخدمه في صفحة:

vue
<script setup>
definePageMeta({
  layout: 'default'
})
</script>

3. المكونات#

المكونات في مجلد components مستوردة تلقائياً:

components/Button.vue

vue
<script setup>
defineProps<{
  label: string
  variant?: 'primary' | 'secondary'
}>()
</script>

<template>
  <button :class="variant">
    {{ label }}
  </button>
</template>

<style scoped>
.primary {
  background: #f97216;
  color: white;
}
.secondary {
  background: #6b7280;
  color: white;
}
</style>

استخدمه في أي مكان بدون استيراد:

vue
<template>
  <Button label="اضغطني" variant="primary" />
</template>

4. جلب البيانات#

يوفر Nuxt وظائف قوية لجلب البيانات:

useFetch - للـ APIs الخارجية

vue
<script setup>
// يجلب تلقائياً على الخادم والعميل
const { data: users, pending, error } = await useFetch('https://api.example.com/users')
</script>

<template>
  <div>
    <p v-if="pending">جاري التحميل...</p>
    <p v-else-if="error">خطأ: {{ error.message }}</p>
    <ul v-else>
      <li v-for="user in users" :key="user.id">
        {{ user.name }}
      </li>
    </ul>
  </div>
</template>

useAsyncData - للمزيد من التحكم

vue
<script setup>
const { data: products } = await useAsyncData('products', async () => {
  // منطق جلب مخصص
  const response = await $fetch('/api/products', {
    params: { category: 'electronics' }
  })
  return response.data
})
</script>

useLazyFetch - للتحميل من جانب العميل

vue
<script setup>
// لا يحجب رسم الصفحة
const { data, pending } = useLazyFetch('/api/heavy-data')
</script>

5. مسارات الخادم (API)#

أنشئ نقاط نهاية خلفية في مجلد server/api:

server/api/hello.ts

typescript
export default defineEventHandler(() => {
  return {
    message: 'مرحباً من الخادم!',
    timestamp: new Date().toISOString()
  }
})

وصولها من الواجهة الأمامية:

vue
<script setup>
const { data } = await useFetch('/api/hello')
</script>

<template>
  <p>{{ data.message }}</p>
</template>

مع المعاملات:

server/api/users/id.ts

typescript
export default defineEventHandler((event) => {
  const id = getRouterParam(event, 'id')
  
  // جلب المستخدم من قاعدة البيانات
  return {
    id,
    name: 'John Doe',
    email: 'john@example.com'
  }
})

6. الوظائف#

الوظائف هي وظائف قابلة لإعادة الاستخدام تغلف منطق تفاعلي:

composables/useCounter.ts

typescript
export const useCounter = (initialValue = 0) => {
  const count = ref(initialValue)
  
  const increment = () => count.value++
  const decrement = () => count.value--
  const reset = () => count.value = initialValue
  
  return {
    count: readonly(count),
    increment,
    decrement,
    reset
  }
}

استخدمها في أي مكان:

vue
<script setup>
const { count, increment, decrement } = useCounter(10)
</script>

<template>
  <div>
    <p>العدد: {{ count }}</p>
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
  </div>
</template>

وحدات Nuxt الأساسية#

وسع Nuxt بوحدات رسمية ومجتمعية:

Tailwind CSS#

bash
npm install @nuxtjs/tailwindcss

nuxt.config.ts

typescript
export default defineNuxtConfig({
  modules: ['@nuxtjs/tailwindcss']
})

Nuxt Content (للمدونات/الوثائق)#

bash
npm install @nuxt/content

رائع للمحتوى المبني على markdown:

vue
<script setup>
const { data: article } = await useAsyncData('article', () => 
  queryContent('/blog/my-post').findOne()
)
</script>

<template>
  <ContentDoc :value="article" />
</template>

Nuxt Image#

bash
npm install @nuxt/image

تحسين الصور التلقائي:

vue
<template>
  <NuxtImg src="/photo.jpg" width="400" height="300" />
</template>

البناء والنشر#

التطوير#

bash
npm run dev

بناء الإنتاج#

bash
npm run build

ينشئ بناء محسن في .output

معاينة بناء الإنتاج#

bash
npm run preview

التوليد الثابت#

للمواقع الثابتة تماماً:

bash
npm run generate

منصات النشر#

يعمل Nuxt في كل مكان:

Vercel:

bash
npm run build
# نشر مع Vercel CLI أو ربط مستودع git

Netlify:

bash
npm run generate  # للثابت
# أو
npm run build     # للـ SSR

Cloudflare Pages: نشر تلقائي من git مع أمر البناء: npm run build

خادمك الخاص:

bash
npm run build
node .output/server/index.mjs

أفضل الممارسات#

1. استخدم TypeScript#

فعل الوضع الصارم لأمان نوع أفضل:

typescript
// nuxt.config.ts
export default defineNuxtConfig({
  typescript: {
    strict: true,
    typeCheck: true
  }
})

2. حسين الصور#

استخدم دائماً <NuxtImg> أو <NuxtPicture> للتحسين التلقائي.

3. معالجة الأخطاء#

أنشئ صفحة خطأ مخصصة:

error.vue

vue
<script setup>
const props = defineProps<{
  error: {
    statusCode: number
    message: string
  }
}>()

const handleError = () => clearError({ redirect: '/' })
</script>

<template>
  <div>
    <h1>{{ error.statusCode }}</h1>
    <p>{{ error.message }}</p>
    <button @click="handleError">العودة للرئيسية</button>
  </div>
</template>

4. تحسين SEO#

استخدم useSeoMeta لـ SEO أفضل:

vue
<script setup>
useSeoMeta({
  title: 'صفحتي الرائعة',
  description: 'هذه الصفحة رائعة',
  ogImage: 'https://example.com/image.jpg',
  twitterCard: 'summary_large_image'
})
</script>

5. الأداء#

  • استخدم useLazyFetch للبيانات غير الحساسة
  • طبق ترقيم الصفحات لمجموعات البيانات الكبيرة
  • استخدم <ClientOnly> للمكونات التي لا تحتاج SSR
  • قم بتحميل الصور والمكونات الثقيلة بطريقة lazy

الأنماط الشائعة#

المصادقة#

typescript
// composables/useAuth.ts
export const useAuth = () => {
  const user = useState('user', () => null)
  
  const login = async (credentials) => {
    const data = await $fetch('/api/auth/login', {
      method: 'POST',
      body: credentials
    })
    user.value = data.user
  }
  
  const logout = () => {
    user.value = null
  }
  
  return { user, login, logout }
}

المسارات المحمية#

typescript
// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
  const { user } = useAuth()
  
  if (!user.value) {
    return navigateTo('/login')
  }
})

استخدم في صفحة:

vue
<script setup>
definePageMeta({
  middleware: 'auth'
})
</script>

استكشاف الأخطاء#

المنفذ مستخدم بالفعل:

bash
npm run dev -- --port 3001

مسح ذاكرة Nuxt المؤقتة:

bash
rm -rf .nuxt
npm run dev

أخطاء TypeScript:

bash
npm run postinstall  # إعادة توليد الأنواع

ما الجديد في Nuxt 4؟#

Nuxt 4 (قيد التطوير حالياً) يجلب تحسينات مثيرة:

  • أداء أفضل مع رسم خادم محسن
  • دعم TypeScript محسن
  • تجربة مطور محسنة
  • أحجام حزم أصغر
  • توافق أفضل مع أحدث ميزات Vue

للتحضير لـ Nuxt 4، حافظ على تحديث مشاريع Nuxt 3 الخاصة بك واتبع دليل الترحيل عند إصدار Nuxt 4.

الخطوات التالية#

الآن بعد فهم الأساسيات:

  1. بنِ مشروعاً: ابدأ بمدونة أو معرض أعمال بسيط
  2. استكشف الوحدات: تحقق من دليل وحدات Nuxt
  3. اقرأ الوثائق: الوثائق الرسمية ممتازة
  4. انضم للمجتمع: Discord، مناقشات GitHub
  5. شاهد الدروس: العديد من الدروس المرئية الرائعة متوفرة

الخاتمة#

يجعل Nuxt بناء تطبيقات الويب الحديثة ممتعاً ومنتجاً. هيكله الرأيي، ميزاته القوية، وتجربة المطور الممتازة تجعله خياراً أعلى لمطوري Vue.

ابدأ صغيراً، جرب الميزات، وتدريجياً بنِ تطبيقات أكثر تعقيداً. أفضل طريقة لتعلم Nuxt هي البناء به!

برمجة سعيدة! 🚀