أصبح Nuxt أحد أكثر الأطر شيوعاً لبناء تطبيقات الويب الحديثة مع Vue.js. سواء كنت تقوم بإنشاء مدونة، موقع تجارة إلكترونية، أو تطبيق ويب معقد، يوفر Nuxt الأدوات والهيكل الذي تحتاجه لبناء مشاريع سريعة ومتوافقة مع SEO وسهلة الصيانة.
سيأخذك هذا الدليل الشامل من الصفر إلى الإنتاجية مع Nuxt، تغطية كل شيء من الإعداد الأساسي إلى الميزات المتقدمة وأفضل الممارسات.
ما هو Nuxt ولماذا يجب استخدامه؟#
Nuxt هو إطار عمل مبني على Vue.js يضيف ميزات قوية للتطبيقات الجاهزة للإنتاج. فكر فيه كـ Vue.js مع قوى خارقة لبناء تطبيقات الويب الكاملة.
الفوائد الرئيسية#
1. الرسم من جانب الخادم (SSR) جاهز على عكس تطبيقات Vue التقليدية التي ترسم على العميل، يمكن لـ Nuxt رسم صفحاتك على الخادم، تسليم HTML مكتمل للمتصفح. هذا يعني:
- SEO أفضل (محركات البحث ترى محتواك الكامل فوراً)
- تحميل صفحات أولي أسرع
- أداء أفضل على الأجهزة البطيئة
2. التوجيه المبني على الملفات
لا حاجة لتكوين المسارات يدوياً. أنشئ ملف في مجلد pages، وNuxt ينشئ مسار له تلقائياً:
pages/
index.vue → /
about.vue → /about
blog/
index.vue → /blog
[slug].vue → /blog/:slug
3. الاستيراد التلقائي يستورد Nuxt تلقائياً المكونات والوظائف والأدوات. اكتب كود أقل:
<!-- لا حاجة للاستيراد! -->
<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 أو أعلى). تحقق من إصدارك:
node --version
إنشاء مشروعك الأول#
افتح الطرفية وشغل:
npx nuxi@latest init my-app
سيتم سؤالك عن بعض الأسئلة:
- مدير الحزم: اختر npm، yarn، pnpm، أو bun
- تهيئة مستودع git: نعم/لا
بعد الإنشاء، انتقل إلى مشروعك وابدأ خادم التطوير:
cd my-app
npm install
npm run dev
افتح متصفحك على http://localhost:3000 وسترى تطبيق Nuxt الجديد!
هيكل المشروع#
إليك ما ينشئه Nuxt لك:
my-app/
├── .nuxt/ # الملفات المولدة (لا تحرر)
├── node_modules/ # التبعيات
├── pages/ # صفحات التطبيق
│ └── index.vue # الصفحة الرئيسية (/)
├── public/ # الملفات الثابتة
├── server/ # مسارات API الخلفية
├── app.vue # المكون الجذر
├── nuxt.config.ts # تكوين Nuxt
└── package.json # بيانات المشروع
المفاهيم الأساسية#
1. الصفحات والتوجيه#
أنشئ ملف جديد في مجلد pages:
pages/about.vue
<script setup>
definePageMeta({
title: 'من نحن'
})
</script>
<template>
<div>
<h1>عن شركتنا</h1>
<p>نبني منتجات رائعة...</p>
</div>
</template>
المسارات الديناميكية:
أنشئ ملف مع أقواس للأجزاء الديناميكية:
pages/blog/slug.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
<template>
<div>
<header>
<nav>
<NuxtLink to="/">الرئيسية</NuxtLink>
<NuxtLink to="/about">من نحن</NuxtLink>
<NuxtLink to="/blog">المدونة</NuxtLink>
</nav>
</header>
<main>
<!-- محتوى صفحتك يأتي هنا -->
<slot />
</main>
<footer>
<p>© 2025 تطبيقي</p>
</footer>
</div>
</template>
استخدمه في صفحة:
<script setup>
definePageMeta({
layout: 'default'
})
</script>
3. المكونات#
المكونات في مجلد components مستوردة تلقائياً:
components/Button.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>
استخدمه في أي مكان بدون استيراد:
<template>
<Button label="اضغطني" variant="primary" />
</template>
4. جلب البيانات#
يوفر Nuxt وظائف قوية لجلب البيانات:
useFetch - للـ APIs الخارجية
<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 - للمزيد من التحكم
<script setup>
const { data: products } = await useAsyncData('products', async () => {
// منطق جلب مخصص
const response = await $fetch('/api/products', {
params: { category: 'electronics' }
})
return response.data
})
</script>
useLazyFetch - للتحميل من جانب العميل
<script setup>
// لا يحجب رسم الصفحة
const { data, pending } = useLazyFetch('/api/heavy-data')
</script>
5. مسارات الخادم (API)#
أنشئ نقاط نهاية خلفية في مجلد server/api:
server/api/hello.ts
export default defineEventHandler(() => {
return {
message: 'مرحباً من الخادم!',
timestamp: new Date().toISOString()
}
})
وصولها من الواجهة الأمامية:
<script setup>
const { data } = await useFetch('/api/hello')
</script>
<template>
<p>{{ data.message }}</p>
</template>
مع المعاملات:
server/api/users/id.ts
export default defineEventHandler((event) => {
const id = getRouterParam(event, 'id')
// جلب المستخدم من قاعدة البيانات
return {
id,
name: 'John Doe',
email: 'john@example.com'
}
})
6. الوظائف#
الوظائف هي وظائف قابلة لإعادة الاستخدام تغلف منطق تفاعلي:
composables/useCounter.ts
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
}
}
استخدمها في أي مكان:
<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#
npm install @nuxtjs/tailwindcss
nuxt.config.ts
export default defineNuxtConfig({
modules: ['@nuxtjs/tailwindcss']
})
Nuxt Content (للمدونات/الوثائق)#
npm install @nuxt/content
رائع للمحتوى المبني على markdown:
<script setup>
const { data: article } = await useAsyncData('article', () =>
queryContent('/blog/my-post').findOne()
)
</script>
<template>
<ContentDoc :value="article" />
</template>
Nuxt Image#
npm install @nuxt/image
تحسين الصور التلقائي:
<template>
<NuxtImg src="/photo.jpg" width="400" height="300" />
</template>
البناء والنشر#
التطوير#
npm run dev
بناء الإنتاج#
npm run build
ينشئ بناء محسن في .output
معاينة بناء الإنتاج#
npm run preview
التوليد الثابت#
للمواقع الثابتة تماماً:
npm run generate
منصات النشر#
يعمل Nuxt في كل مكان:
Vercel:
npm run build
# نشر مع Vercel CLI أو ربط مستودع git
Netlify:
npm run generate # للثابت
# أو
npm run build # للـ SSR
Cloudflare Pages:
نشر تلقائي من git مع أمر البناء: npm run build
خادمك الخاص:
npm run build
node .output/server/index.mjs
أفضل الممارسات#
1. استخدم TypeScript#
فعل الوضع الصارم لأمان نوع أفضل:
// nuxt.config.ts
export default defineNuxtConfig({
typescript: {
strict: true,
typeCheck: true
}
})
2. حسين الصور#
استخدم دائماً <NuxtImg> أو <NuxtPicture> للتحسين التلقائي.
3. معالجة الأخطاء#
أنشئ صفحة خطأ مخصصة:
error.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 أفضل:
<script setup>
useSeoMeta({
title: 'صفحتي الرائعة',
description: 'هذه الصفحة رائعة',
ogImage: 'https://example.com/image.jpg',
twitterCard: 'summary_large_image'
})
</script>
5. الأداء#
- استخدم
useLazyFetchللبيانات غير الحساسة - طبق ترقيم الصفحات لمجموعات البيانات الكبيرة
- استخدم
<ClientOnly>للمكونات التي لا تحتاج SSR - قم بتحميل الصور والمكونات الثقيلة بطريقة lazy
الأنماط الشائعة#
المصادقة#
// 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 }
}
المسارات المحمية#
// middleware/auth.ts
export default defineNuxtRouteMiddleware((to, from) => {
const { user } = useAuth()
if (!user.value) {
return navigateTo('/login')
}
})
استخدم في صفحة:
<script setup>
definePageMeta({
middleware: 'auth'
})
</script>
استكشاف الأخطاء#
المنفذ مستخدم بالفعل:
npm run dev -- --port 3001
مسح ذاكرة Nuxt المؤقتة:
rm -rf .nuxt
npm run dev
أخطاء TypeScript:
npm run postinstall # إعادة توليد الأنواع
ما الجديد في Nuxt 4؟#
Nuxt 4 (قيد التطوير حالياً) يجلب تحسينات مثيرة:
- أداء أفضل مع رسم خادم محسن
- دعم TypeScript محسن
- تجربة مطور محسنة
- أحجام حزم أصغر
- توافق أفضل مع أحدث ميزات Vue
للتحضير لـ Nuxt 4، حافظ على تحديث مشاريع Nuxt 3 الخاصة بك واتبع دليل الترحيل عند إصدار Nuxt 4.
الخطوات التالية#
الآن بعد فهم الأساسيات:
- بنِ مشروعاً: ابدأ بمدونة أو معرض أعمال بسيط
- استكشف الوحدات: تحقق من دليل وحدات Nuxt
- اقرأ الوثائق: الوثائق الرسمية ممتازة
- انضم للمجتمع: Discord، مناقشات GitHub
- شاهد الدروس: العديد من الدروس المرئية الرائعة متوفرة
الخاتمة#
يجعل Nuxt بناء تطبيقات الويب الحديثة ممتعاً ومنتجاً. هيكله الرأيي، ميزاته القوية، وتجربة المطور الممتازة تجعله خياراً أعلى لمطوري Vue.
ابدأ صغيراً، جرب الميزات، وتدريجياً بنِ تطبيقات أكثر تعقيداً. أفضل طريقة لتعلم Nuxt هي البناء به!
برمجة سعيدة! 🚀
