Vue.js: معالجة الأخطاء
آخر تحديث: 2026-08-26
تعد معالجة الأخطاء إحدى القدرات الأساسية لأي تطبيق مخصص للإنتاج — فهي تتيح لك تحديد سبب التعطل بسرعة، وتقليل الوظائف بشكل سلس، وإخطار المستخدمين. يوفر Vue 3 معالجة أخطاء متعددة المستويات: errorHandler (عالمية)، وonErrorCaptured (محلية)، وخطاف errorCaptured (على مستوى المكونات).
يعد تصحيح الأخطاء وتحسين الأداء أمرين متساويين في الأهمية — وتُعد Vue DevTools أداة أساسية تتيح لك الاطلاع على شجرة المكونات، والstatus، والأحداث، ومواطن الاختناق في الأداء.
1. ما ستتعلمه
- معالجة الأخطاء على 3 مستويات: errorHandler / onErrorCaptured / errorBoundary
- الميزات الأساسية الأربع لـ Vue DevTools (شجرة المكونات / الstatus / الأحداث / الأداء)
- تحليل الأداء (واجهة برمجة تطبيقات الأداء + أدوات المطورين)
- تكامل Sentry (مراقبة الأخطاء في بيئة الإنتاج)
- موقع خريطة المصدر غير صحيح
- 5 نصائح شائعة لتصحيح الأخطاء
2. حادثة «تعطل الشاشة البيضاء» التي «لا يمكن تحديد سببها»
(1) المشكلة: إذا أرجعت إحدى واجهات برمجة التطبيقات (API) خطأً، فإن الصفحة بأكملها تصبح فارغة
كان لدى برنامج «أليس» خطأً فادحًا واحدًا:
// 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
})
تجربة المستخدم:
- تظهر صفحة ProductList بأكملها شاشة فارغة
- تظهر رسائل الخطأ في وحدة التحكم فقط
- يرى المستخدمون صفحة فارغة، ولا يجدي تجديد الصفحة نفعًا
مدير المنتج تشارلي:
«أليس، يشكو العملاء من ظهور صفحات فارغة. نحتاج إلى: 1) عدم تعطل الصفحة بأكملها، 2) عرض رسالة خطأ، 3) تسجيل الحدث في نظام المراقبة الخاص بنا.»
(2) حلول لـ «Vue Error Boundaries»
<!-- 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>
تجربة المستخدم:
- تم اكتشاف الخطأ ولن ينتشر
- عرض صفحة خطأ سهلة الاستخدام
- الإبلاغ التلقائي عن الأخطاء إلى Sentry
- يمكن للمستخدمين النقر على «إعادة المحاولة»
(3) الإيرادات
بعد معالجة الأخطاء:
- تعطل الشاشة البيضاء: 100% → 0
- موقع الخطأ: وحدة التحكم → لوحة معلومات Sentry
- تجربة المستخدم: حدوث عطل → ظهور رسالة إرشادية سهلة الفهم
- قابلية المراقبة: يتم توثيق جميع الأخطاء
3. معالجة الأخطاء على ثلاثة مستويات
(1) معالجة الأخطاء على المستوى العام: app.config.errorHandler
// 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
<!-- 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) المصادر الخمسة الرئيسية للأخطاء
// 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) استخدام لوحة المكونات
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 نصائح حول أدوات المطورين
// 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
# 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
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 نصائح لتحسين الأداء
// 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) التثبيت
npm install @sentry/vue @sentry/tracing
(2) تهيئة ملف main.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) تكوين خريطة المصدر
// 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. معالجة الأخطاء على ثلاثة مستويات
// main.js:Global
app.config.errorHandler = (err, instance, info) => {
console.error('Global:', err, info)
Sentry.captureException(err)
}
<!-- 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>
// Asynchronous:Manual try/catch
try {
await fetch('/api/data')
} catch (err) {
console.error('Async:', err)
Sentry.captureException(err)
}
▶ مثال: 2. 5 المصادر الرئيسية للأخطاء
// 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 تحسينات رئيسية للأداء
// 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.config.devtools = false (لتجنب الكشف عن البنية الداخلية).<div v-for="item in items" :key="item.id" v-memo="[item.id, item.updatedAt]">، لا يتم إعادة عرض عنصر div هذا إلا عند تغيير المعرف (id) أو قيمة updatedAt.onErrorCaptured في Vue 3 وVue 2؟errorCaptured؛ أما في Vue 3، فهو واجهة برمجة تطبيقات التركيب onErrorCaptured. كما يقدم Vue 3 متغيرًا عالميًا جديدًا هو app.config.errorHandler.📖 ملخص
- معالجة الأخطاء على 3 مستويات: مستوى عام (errorHandler) + مستوى المكون (onErrorCaptured) + مستوى غير متزامن (try/catch)
- 5 مصادر رئيسية للأخطاء: العرض / دورة الحياة / المراقبة / التوجيهات / الأحداث
- لوحات Vue DevTools 4: المكونات / الخط الزمني / Pinia / المسارات
- 5 تحسينات رئيسية للأداء: v-once / v-memo / shallowRef / markRaw / التحميل المتأخر
- تكامل Sentry: التسجيل التلقائي + تتبع الأداء + خرائط المصادر
- 5 مؤشرات أداء رئيسية: FCP / LCP / TTI / TBT / CLS
- العناصر الأساسية لبيئات الإنتاج: ErrorBoundary + Sentry + Source Map
📝 تمارين
-
أسئلة أساسية (مستوى الصعوبة: ⭐)
تنفيذ مكون ErrorBoundary:
- onErrorCaptured: يلتقط الأخطاء من المكونات الفرعية
- عرض صفحة خطأ سهلة الاستخدام
- توفير زر «إعادة المحاولة»
-
مسائل متقدمة (مستوى الصعوبة: ⭐⭐)
تنفيذ نظام شامل لمعالجة الأخطاء:
- يقوم
errorHandlerالعالمي بتسجيل البيانات في وحدة التحكم - ErrorBoundary على مستوى المكون
- الأخطاء غير المتزامنة: try/catch
- 5 فئات لمصادر الخطأ
- يقوم
-
مسألة التحدي (مستوى الصعوبة: ⭐⭐⭐)
تنفيذ عملية شاملة لتصحيح الأخطاء ومراقبة الأخطاء «على مستوى الإنتاج»:
- مكون ErrorBoundary + 3 مواقع مختلفة
- تكامل Sentry (بيئة الإنتاج)
- تكوين خريطة المصدر
- أهم 5 نصائح لتصحيح الأخطاء باستخدام Vue DevTools
- 5 تحسينات رئيسية للأداء (v-memo / shallowRef / markRaw / التحميل المتأخر / v-once)
- مراقبة 5 مؤشرات أداء رئيسية (تكامل Lighthouse)