الفرق بين الـ Real DOM والـ Virtual DOM
| وجه المقارنة | الـ Real DOM التقليدي | الـ Virtual DOM في ريأكت |
|---|---|---|
| طبيعة التواجد والخلية | شجرة حقيقية من كتل الواجهة داخل ذاكرة المتصفح النشطة | نسخة برمجية خفيفة الوزن على شكل كائن جافا سكريبت محايد |
| تكلفة الموارد والأداء | باهظ الثمن ويتسبب في بطء الرندرة وثقل استجابة المتصفح | سريع جداً وخفيف الاستهلاك لموارد الذاكرة والسيرفر |
| آلية تحديث الشاشة | يعيد بناء عناصر الواجهة بالكامل وتحديث أفرع الشجرة يدوياً | يقارن الاختلافات أولاً ويحدث فقط العنصر المتغير بدقة متناهية |
لكي تفهم سر السرعة الخارقة لمواقع ريأكت، يجب أن نغوص قليلاً خلف كواليس المتصفح (Browser). عندما يقرأ المتصفح ملف HTML عادي، فإنه يقوم بتحويله إلى شجرة هيكلية ضخمة يُطلق عليها هندسياً اسم Real DOM (مختصر Document Object Model). هذه الشجرة هي التي تسمح لجافا سكريبت بالوصول لعناصر الموقع وتعديلها. ولكن، مع تطور الويب، ظهرت مشكلة تقنية ضخمة تتعلق بالأداء؛ وهي السبب الأساسي الذي جعل مهندسي فيسبوك يخترعون Virtual DOM. دعنا نفهم الحكاية ببساطة.
الـ Real DOM يشبه مبنى ضخماً من الخرسانة. إذا أردت تعديل نافذة واحدة فقط في الطابق العاشر باستخدام جافا سكريبت العادية، فإن المتصفح يضطر أحياناً إلى إعادة حساب مساحات وأماكن وتنسيقات كافة الطوابق والغرف الأخرى المحيطة بها (عملية تُسمى Reflow & Repaint). في المواقع التفاعلية الضخمة التي تحتوي على آلاف العناصر المتغيرة كشبكات التواصل الاجتماعي، تصبح هذه التحديثات المتكررة مباشرة على الـ Real DOM بمثابة كابوس يُبطئ المتصفح ويجعل الموقع ثقيلاً في الاستجابة.
بدلاً من التعديل المباشر في الخرسانة الحقيقية، قامت ريأكت بابتكار Virtual DOM. وهو عبارة عن نسخة افتراضية خفيفة الوزن ومجردة تماماً من الـ Real DOM، محفوظة داخل الذاكرة ككائن جافا سكريبت بسيط (JavaScript Object). عندما يحدث أي تغيير في بيانات الموقع، لا تذهب ريأكت للمتصفح مباشرة، بل تطبق العملية ضمن آلية ذكية من 3 خطوات:
دعنا نرى كيف تترجم ريأكت عناصر واجهة المستخدم إلى كائن جافا سكريبت خفيف خلف الكواليس لتتمكن من مقارنته بسرعة:
شكل الكود الذي تكتبه (JSX):
| 1 | <div className="box"> |
| 2 | <h1>مرحباً بك في نوفيل</h1> |
| 3 | </div> |
كيف تراه ريأكت في الذاكرة كـ Virtual DOM (كائن مبسط):
| 1 | // هذا كائن خفيف جداً يسهل على الخوارزمية فصحه ومقارنته في أجزاء من المليون من الثانية |
| 2 | { |
| 3 | type: 'div', |
| 4 | props: { className: 'box' }, |
| 5 | children: [ |
| 6 | { type: 'h1', props: null, children: 'مرحباً بك في نوفيل' } |
| 7 | ] |
| 8 | } |