Vue.js: معالجة الأخطاء
آخر تحديث: 2026-10-20
تعد معالجة الأخطاء إحدى القدرات الأساسية لأي تطبيق مخصص للإنتاج — فهي تتيح لك تحديد سبب التعطل بسرعة، وتقليل الوظائف بشكل سلس، وإخطار المستخدمين. يوفر 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»
تجربة المستخدم:
- تم اكتشاف الخطأ ولن ينتشر
- عرض صفحة خطأ سهلة الاستخدام
- الإبلاغ التلقائي عن الأخطاء إلى 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
(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)
▶ مثال: 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')
الإخراج:
كل مصدر خطأ يمرر قيمة info مختلفة: render، mounted، watcher callback، directive، v-on handler
يُطبع السطر المطابق فقط، ما يساعد على تحديد مكان الخطأ بدقة
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 |
▶ مثال: 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'))
الإخراج:
v-once يوقف تحديث العنوان بعد أول عرض، وv-memo لا يعيد العرض إلا عند تغير item.id
shallowRef لا يتتبع التغييرات الداخلية، وmarkRaw يمنع تحويل الكائن إلى proxy
defineAsyncComponent يحمّل المكوّن الثقيل عند الحاجة فقط
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. تمرين شامل: معالجة الأخطاء على ثلاثة مستويات
▶ مثال: معالجة الأخطاء على ثلاثة مستويات
// 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)
}
الإخراج:
خطأ داخل شجرة المكوّنات → يلتقطه ErrorBoundary فيظهر نص الخطأ بدل الشاشة البيضاء
خطأ خارج المكوّنات → يصل إلى errorHandler العام ويُرسل إلى Sentry
خطأ غير متزامن → يلتقطه try/catch ويُطبع Async: ثم يُرسل إلى Sentry
(1) 📊 3. عرض DevTools: 4 لوحات
| لوحة | الغرض |
|---|---|
| المكونات | شجرة المكونات + الstatus + الخصائص |
| الجدول الزمني | تدفق الأحداث + دورة الحياة |
| بينيا | status المتجر |
| المسارات | سجل المسارات |
(2) 📊 5. مرجع سريع لـ 5 أخطاء شائعة
| الخطأ | الأعراض | الحل |
|---|---|---|
| تعطل الشاشة البيضاء | خطأ في مكون واحد يتسبب في تعطل كل شيء | استخدام Wrap مع ErrorBoundary |
| تم تسجيل خطأ | فشل المكون الفرعي دون إظهار أي رسالة | لا تنسَ إرجاع القيمة false في دالة onErrorCaptured |
| خريطة المصدر مفقودة | تعذر تحديد موقع خطأ في الإنتاج | vite build sourcemap: true |
| الأداء الضعيف | حدوث تأخير عند عرض قائمة تضم 1,000 عنصر | v-memo + shallowRef |
| تسرب الذاكرة | استمرار تشغيل المؤقت بعد إزالة المكون | عملية التنظيف في onUnmounted |
(3) 📊 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)