Vue.js: معالجة الأخطاء

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

تعد معالجة الأخطاء إحدى القدرات الأساسية لأي تطبيق مخصص للإنتاج — فهي تتيح لك تحديد سبب التعطل بسرعة، وتقليل الوظائف بشكل سلس، وإخطار المستخدمين. يوفر Vue 3 معالجة أخطاء متعددة المستويات: errorHandler (عالمية)، وonErrorCaptured (محلية)، وخطاف errorCaptured (على مستوى المكونات).

يعد تصحيح الأخطاء وتحسين الأداء أمرين متساويين في الأهمية — وتُعد Vue DevTools أداة أساسية تتيح لك الاطلاع على شجرة المكونات، والstatus، والأحداث، ومواطن الاختناق في الأداء.

1. ما ستتعلمه



2. حادثة «تعطل الشاشة البيضاء» التي «لا يمكن تحديد سببها»

(1) المشكلة: إذا أرجعت إحدى واجهات برمجة التطبيقات (API) خطأً، فإن الصفحة بأكملها تصبح فارغة

كان لدى برنامج «أليس» خطأً فادحًا واحدًا:

JS
// ProductList.vue
const products = ref([])
onMounted(async () => {
  const res = await fetch('/api/products')
  products.value = await res.json()  // ❌ The backend returns non-JSON → throws error
})

تجربة المستخدم:

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

«أليس، يشكو العملاء من ظهور صفحات فارغة. نحتاج إلى: 1) عدم تعطل الصفحة بأكملها، 2) عرض رسالة خطأ، 3) تسجيل الحدث في نظام المراقبة الخاص بنا.»

(2) حلول لـ «Vue Error Boundaries»

VUE
<!-- Parent Component:Error Boundary -->
<template>
  <ErrorBoundary>
    <ProductList />
  </ErrorBoundary>
</template>

<!-- ErrorBoundary.vue -->
<script setup>
import { onErrorCaptured, ref } from 'vue'
const error = ref(null)

onErrorCaptured((err, instance, info) => {
  console.error('Caught:', err)
  // 1. Display error message
  error.value = err.message
  // 2. Report to Sentry
  Sentry.captureException(err)
  // 3. Prevent upward transmission
  return false
})
</script>

<template>
  <div v-if="error" class="error">
    <h3>⚠️ Something went wrong</h3>
    <p>{{ error }}</p>
    <button @click="retry">Retry</button>
  </div>
  <slot v-else />
</template>

تجربة المستخدم:

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

بعد معالجة الأخطاء:



3. معالجة الأخطاء على ثلاثة مستويات

(1) معالجة الأخطاء على المستوى العام: app.config.errorHandler

JS
// main.js
import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)

// ✅ Global Error Handling
app.config.errorHandler = (err, instância, info) => {
  console.erro('Global erro:', err)
  console.log('Component:', instância)
  console.log('Info:', info)  // 'render' / 'watch' / 'lifecycle hook'
  
  // Report to Sentry
  Sentry.captureException(err)
  
  // User Notification
  showErrorNotification('Something went wrong')
}

(2) خطأ على مستوى المكون: onErrorCaptured

VUE
<!-- ErrorBoundary.vue -->
<script setup>
import { onErrorCaptured, ref } from 'vue'

const error = ref(null)

// ✅ Catching Child Component Errors
onErrorCaptured((err, instance, info) => {
  console.error('Boundary caught:', err)
  error.value = {
    message: err.message,
    stack: err.stack,
    info
  }
  
  // Prevent upward transmission
  return false
})
</script>

<template>
  <div v-if="error" class="error-boundary">
    <h3>⚠️ {{ error.message }}</h3>
    <details>
      <summary>Stack trace</summary>
      <pre>{{ error.stack }}</pre>
    </details>
    <button @click="reset">Retry</button>
  </div>
  <slot v-else />
</template>

(3) مقارنة مستويات الخطأ

المستوى واجهة برمجة التطبيقات (API) النطاق ينطبق على
عالمي app.config.errorHandler جميع الأخطاء غير المعالجة مطلوب في بيئة الإنتاج
المكون onErrorCaptured خطأ في المكون الفرعي حدود الخطأ المحلية
غير متزامن try/catch / window.onunhandledrejection خطأ Promise المعالجة اليدوية

(4) المصادر الخمسة الرئيسية للأخطاء

JS
// 1. Rendering Error(Template syntax error)
app.config.errorHandler = (err, instance, info) => {
  if (info === 'render') console.error('Render error:', err)
}

// 2. Lifecycle Hook Error
if (info === 'mounted') console.error('Mounted error:', err)

// 3. watch Callback Error
if (info === 'watcher callback') console.error('Watch error:', err)

// 4. Custom Command Error
if (info === 'directive') console.error('Directive error:', err)

// 5. Error Handling
if (info === 'v-on handler') console.error('Event error:', err)


4. عرض DevTools

(1) 4 لوحات أساسية رئيسية

اللوحة الوظيفة الغرض
المكونات شجرة المكونات، الstatus، الخصائص، الإشارات فهم بنية المكونات، بيانات التصحيح
الخط الزمني الأحداث، دورة الحياة، الأداء تتبع تدفقات الأحداث ومواطن الاختناق في الأداء
Pinia/Vuex تخزين الstatus تصحيح أخطاء الstatus العامة
المسارات سجل المسارات تصحيح عمليات إعادة التوجيه للمسارات

(2) استخدام لوحة المكونات

TEXT 📖 للعرض فقط
1. Open DevTools(F12 / Cmd+Opt+I)
2. Switch to Vue Tags
3. Click a component in the component tree
4. Display on the right:
   - State(Responsive Data)
   - Props
   - Emits
   - Slots
   - Lifecycle

(3) أهم 5 نصائح حول أدوات المطورين

JS
// 1. Real-time editing state(Development Mode)
// DevTools Edit directly in the document,Watch the component respond in real time

// 2. Time Travel(Pinia)
// Switch to Pinia Panel → Base → You can replay each step state Changes

// 3. Performance Labels
// import { markRaw } from 'vue'
// Big Data Objects Used For markRaw Mark,DevTools Does not perform a deep traversal

// 4. Components highlight
// DevTools → top right corner"Eyes"Icon → Highlight Components on Mouse Hover

// 5. Route Redirection
// DevTools → Routing Tags → Look at each redirect path + params

(4) تثبيت Vue DevTools

BASH
# Chrome Extensions
# https://chromewebstore.google.com/detail/vuejs-devtools/odjccnclnlddjlajjphfdmhnlhaglgki

# Firefox Extensions
# https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/

# or a standalone app(Recommendations)
# https://devtools.vuejs.org/


5. تحليل الأداء

(1) عرض واجهة برمجة تطبيقات الأداء 3

JS
import { onMounted, onUnmounted } from 'vue'

onMounted(() => {
  performance.mark('app-start')
  
  // Your code
  loadData()
  
  performance.mark('app-end')
  performance.measure('app-load', 'app-start', 'app-end')
  
  const measure = performance.getEntriesByName('app-load')[0]
  console.log(`App loaded in ${measure.duration}ms`)
})

(2) أهم 5 نصائح لتحسين الأداء

JS
// 1. v-once:Render only once
<h1 v-once>{{ title }}</h1>

// 2. v-memo:Cache Subtree
<div v-memo="[item.id, item.updatedAt]">
  <!-- Only re-render on id or updatedAt changes -->
</div>

// 3. shallowRef:Big Data Does Not Respond Deeply
const bigList = shallowRef([...10000 item])

// 4. markRaw:Third-party library is not responding
const map = markRaw(new Map())

// 5. Lazy Loading:Routing / Components
const Heavy = defineAsyncComponent(() => import('./Heavy.vue'))

(3) 5 مؤشرات أداء رئيسية

المقياس الهدف طريقة القياس
FCP (أول رسم لمحتوى مرئي) < 1.8 ثانية Lighthouse
LCP (أول ظهور للمحتوى المرئي) < 2.5 ثانية Lighthouse
TTI (وقت التفاعل) < 3.8 ثانية Lighthouse
TBT (إجمالي وقت الحجب) < 200 مللي ثانية Lighthouse
CLS (تغير التخطيط) < 0.1 Lighthouse


6. تكامل Sentry

(1) التثبيت

BASH
npm install @sentry/vue @sentry/tracing

(2) تهيئة ملف main.js

JS
import { createApp } from 'vue'
import * as Sentry from '@sentry/vue'
import { Integrations } from '@sentry/tracing'
import App from './App.vue'

// 1. Initialization Sentry
Sentry.init({
  app,
  dsn: 'https://your-dsn@sentry.io/123',
  integrations: [
    new Integrations.BrowserTracing()
  ],
  tracesSampleRate: 1.0,
  // Reduce Sampling in the Production Environment
  // tracesSampleRate: process.env.NODE_ENV === 'production' ? 0.1 : 1.0
  
  // Vue Specific Placement
  logErrors: true,
  release: '1.0.0',
  environment: process.env.NODE_ENV
})

const app = createApp(App)

// 2. Global Error Reporting
app.config.errorHandler = (err, instance, info) => {
  Sentry.captureException(err, {
    extra: {
      component: instance?.$options.name,
      info
    }
  })
}

(3) تكوين خريطة المصدر

JS
// vite.config.js
export default {
  build: {
    sourcemap: true  // Generated in the production environment as well source map
  }
}

// Sentry Upload source map
// @sentry/cli releases -o your-org -p your-project files upload-sourcemaps ./dist

(4) 5 ميزات رئيسية لـ Sentry

الميزة الغرض
مراقبة الأخطاء تسجيل جميع الأخطاء تلقائيًا؛ يمكن الاطلاع عليها على لوحة التحكم
تتبع الأداء تحديد الطلبات البطيئة واستعلامات قاعدة البيانات البطيئة
إعادة تشغيل الجلسة تسجيل إجراءات المستخدم لمعرفة مكان حدوث الخطأ
النشرات الصحية مقارنة معدلات الأخطاء حسب النشرة
تنبيه إشعار عبر Slack / البريد الإلكتروني


7. مثال كامل: 5 تقنيات رئيسية لتصحيح الأخطاء

▶ مثال: 1. معالجة الأخطاء على ثلاثة مستويات

JS
// main.js:Global
app.config.errorHandler = (err, instance, info) => {
  console.error('Global:', err, info)
  Sentry.captureException(err)
}
▶ جرّب الكود
VUE
<!-- ErrorBoundary.vue:Components -->
<script setup>
import { onErrorCaptured, ref } from 'vue'
const error = ref(null)
onErrorCaptured((err, instance, info) => {
  error.value = err.message
  return false
})
</script>
JS
// Asynchronous:Manual try/catch
try {
  await fetch('/api/data')
} catch (err) {
  console.error('Async:', err)
  Sentry.captureException(err)
}

▶ مثال: 2. 5 المصادر الرئيسية للأخطاء

JS
// 1. Rendering Error
if (info === 'render') console.error('Render')

// 2. Life Cycle Errors
if (info === 'mounted') console.error('Mounted')

// 3. watch Error
if (info === 'watcher callback') console.error('Watch')

// 4. Command error
if (info === 'directive') console.error('Directive')

// 5. Event Error
if (info === 'v-on handler') console.error('Event')
▶ جرّب الكود

▶ مثال: 3. عرض DevTools: 4 لوحات

لوحة الغرض
المكونات شجرة المكونات + الstatus + الخصائص
الجدول الزمني تدفق الأحداث + دورة الحياة
بينيا status المتجر
المسارات سجل المسارات

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

JS
// 1. v-once
<h1 v-once>{{ title }}</h1>

// 2. v-memo
<div v-memo="[item.id]">...</div>

// 3. shallowRef
const list = shallowRef([...])

// 4. markRaw
const map = markRaw(new Map())

// 5. Lazy Loading
const Heavy = defineAsyncComponent(() => import('./Heavy.vue'))
▶ جرّب الكود

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

الخطأ الأعراض الحل
تعطل الشاشة البيضاء خطأ في مكون واحد يتسبب في تعطل كل شيء استخدام Wrap مع ErrorBoundary
تم تسجيل خطأ فشل المكون الفرعي دون إظهار أي رسالة لا تنسَ إرجاع القيمة false في دالة onErrorCaptured
خريطة المصدر مفقودة تعذر تحديد موقع خطأ في الإنتاج vite build sourcemap: true
الأداء الضعيف حدوث تأخير عند عرض قائمة تضم 1,000 عنصر v-memo + shallowRef
تسرب الذاكرة استمرار تشغيل المؤقت بعد إزالة المكون عملية التنظيف في onUnmounted

▶ مثال: 6. 5 سيناريوهات رئيسية لتصحيح الأخطاء

السيناريو الأداة
خطأ في status المكون Vue DevTools → الstatus
لم يتم تشغيل الحدث Vue DevTools → الخط الزمني
خطأ في إعادة التوجيه DevTools → التوجيه
تعطل بيئة الإنتاج لوحة معلومات Sentry
الأداء البطيء أداء Lighthouse + DevTools


❓ أسئلة شائعة

س هل يمكن لـ errorHandler اكتشاف الأخطاء غير المتزامنة؟
ج لا. يكتشف errorHandler الأخطاء المتزامنة داخل Vue فقط. أما الأخطاء غير المتزامنة (Promise / setTimeout) فتتطلب استخدام try/catch أو window.addEventListener('unhandledrejection').
س هل يجب على onErrorCaptured إرجاع false؟
ج لا، ليس بالضرورة. إرجاع false يمنع انتشار الخطأ إلى المستويات الأعلى. أما إرجاع true (أو عدم إرجاع أي قيمة) فيسمح للخطأ بالاستمرار في الانتشار إلى المستويات الأعلى حتى errorHandler العالمية.
س هل يمكن استخدام Vue DevTools في بيئة الإنتاج؟
ج نعم. تعمل نسخة الإنتاج على تمكين DevTools تلقائيًا (دون التأثير على الأداء). ومع ذلك، يُنصح بتعطيلها في بيئة الإنتاج باستخدام Vue.config.devtools = false (لتجنب الكشف عن البنية الداخلية).
س كيف يتم تحديد أسعار Sentry؟
ج تشمل الخطة المجانية 5,000 حدث و10,000 معاملة أداء شهريًّا. وهذا يكفي للمشاريع متوسطة الحجم. أما الاستخدام الذي يتجاوز هذه الحدود، فيتم احتسابه على أساس الدفع الفوري.
س كيف يعمل كل من v-memo و v-for معًا؟
ج <div v-for="item in items" :key="item.id" v-memo="[item.id, item.updatedAt]">، لا يتم إعادة عرض عنصر div هذا إلا عند تغيير المعرف (id) أو قيمة updatedAt.
س كيف يمكنني تصحيح أخطاء تطبيق SSR؟
ج استخدم أداة تصحيح الأخطاء في VS Code مع وضع الفحص في Node.js. أو يمكنك استخدام Sentry لالتقاط الأخطاء من جانب الخادم. أو استخدم أداة تصحيح الأخطاء Nitro في Nuxt 3.
س ما الفرق بين onErrorCaptured في Vue 3 وVue 2؟
ج في Vue 2، يُعد هذا هوك errorCaptured؛ أما في Vue 3، فهو واجهة برمجة تطبيقات التركيب onErrorCaptured. كما يقدم Vue 3 متغيرًا عالميًا جديدًا هو app.config.errorHandler.

📖 ملخص


📝 تمارين

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

    تنفيذ مكون ErrorBoundary:

    • onErrorCaptured: يلتقط الأخطاء من المكونات الفرعية
    • عرض صفحة خطأ سهلة الاستخدام
    • توفير زر «إعادة المحاولة»
  2. مسائل متقدمة (مستوى الصعوبة: ⭐⭐)

    تنفيذ نظام شامل لمعالجة الأخطاء:

    • يقوم errorHandler العالمي بتسجيل البيانات في وحدة التحكم
    • ErrorBoundary على مستوى المكون
    • الأخطاء غير المتزامنة: try/catch
    • 5 فئات لمصادر الخطأ
  3. مسألة التحدي (مستوى الصعوبة: ⭐⭐⭐)

    تنفيذ عملية شاملة لتصحيح الأخطاء ومراقبة الأخطاء «على مستوى الإنتاج»:

    1. مكون ErrorBoundary + 3 مواقع مختلفة
    2. تكامل Sentry (بيئة الإنتاج)
    3. تكوين خريطة المصدر
    4. أهم 5 نصائح لتصحيح الأخطاء باستخدام Vue DevTools
    5. 5 تحسينات رئيسية للأداء (v-memo / shallowRef / markRaw / التحميل المتأخر / v-once)
    6. مراقبة 5 مؤشرات أداء رئيسية (تكامل Lighthouse)
Web-Tutorial.com

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

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

100%