تعمق في بنية React Fiber، وشرح عملية التوفيق وفوائدها وكيف تحسن أداء التطبيق.
بنية React Fiber: فهم عملية التوفيق
لقد أحدث React ثورة في تطوير الواجهة الأمامية ببنيتها القائمة على المكونات ونموذج البرمجة التصريحي. يكمن جوهر كفاءة React في عملية التوفيق - الآلية التي تقوم React من خلالها بتحديث DOM الفعلي لتعكس التغييرات في شجرة المكونات. خضعت هذه العملية لتطور كبير، وبلغت ذروتها في بنية Fiber. تقدم هذه المقالة فهمًا شاملاً لـ React Fiber وتأثيره على التوفيق.
ما هو التوفيق؟
التوفيق هو الخوارزمية التي تستخدمها React لمقارنة DOM الافتراضي السابق مع DOM الافتراضي الجديد وتحديد الحد الأدنى من التغييرات المطلوبة لتحديث DOM الفعلي. DOM الافتراضي هو تمثيل في الذاكرة لواجهة المستخدم. عندما تتغير حالة المكون، تقوم React بإنشاء شجرة DOM افتراضية جديدة. بدلاً من معالجة DOM الفعلي مباشرةً، وهي عملية بطيئة، تقارن React شجرة DOM الافتراضية الجديدة بالشجرة السابقة وتحدد الاختلافات. تسمى هذه العملية الفرق.
تسترشد عملية التوفيق بافتراضين رئيسيين:
- ستنتج العناصر من أنواع مختلفة أشجارًا مختلفة.
- يمكن للمطور الإشارة إلى عناصر الطفل التي قد تكون مستقرة عبر عمليات العرض المختلفة باستخدام خاصية
key
.
التوفيق التقليدي (قبل Fiber)
في التنفيذ الأولي لـ React، كانت عملية التوفيق متزامنة وغير قابلة للتجزئة. هذا يعني أنه بمجرد أن تبدأ React في عملية مقارنة DOM الافتراضي وتحديث DOM الفعلي، لا يمكن مقاطعتها. يمكن أن يؤدي ذلك إلى مشاكل في الأداء، خاصة في التطبيقات المعقدة التي تحتوي على أشجار مكونات كبيرة. إذا استغرق تحديث المكون وقتًا طويلاً، فسيصبح المستعرض غير مستجيب، مما يؤدي إلى تجربة مستخدم سيئة. يُشار إلى هذا غالبًا باسم مشكلة "الارتجاج".
تخيل موقعًا معقدًا للتجارة الإلكترونية يعرض كتالوج المنتجات. إذا تفاعل المستخدم مع عامل تصفية، مما أدى إلى إعادة عرض الكتالوج، فقد تحظر عملية التوفيق المتزامنة سلسلة التعليمات الرئيسية، مما يجعل واجهة المستخدم غير مستجيبة حتى يتم إعادة عرض الكتالوج بأكمله. قد يستغرق هذا عدة ثوانٍ، مما يسبب إحباطًا للمستخدم.
تقديم React Fiber
React Fiber هي إعادة كتابة كاملة لخوارزمية التوفيق الخاصة بـ React، والتي تم تقديمها في React 16. هدفها الأساسي هو تحسين استجابة وأداء تطبيقات React المتصورة، خاصة في السيناريوهات المعقدة. تحقق Fiber ذلك عن طريق تقسيم عملية التوفيق إلى وحدات عمل أصغر قابلة للمقاطعة.
المفاهيم الأساسية وراء React Fiber هي:
- Fibers: Fiber هو كائن JavaScript يمثل وحدة عمل. يحمل معلومات حول مكون ومدخلاته ومخرجاته. يحتوي كل مكون React على fiber مطابق.
- WorkLoop: حلقة العمل هي حلقة تتكرر عبر شجرة fiber وتنفذ العمل الضروري لكل fiber.
- Scheduling: يقرر المجدول متى يبدأ وحدة العمل أو يوقفها مؤقتًا أو يستأنفها أو يتخلى عنها بناءً على الأولوية.
فوائد بنية Fiber
توفر بنية Fiber العديد من الفوائد الهامة:
- التوفيق القابل للمقاطعة: تسمح Fiber لـ React بإيقاف عملية التوفيق مؤقتًا واستئنافها، مما يمنع المهام طويلة الأمد من حظر سلسلة التعليمات الرئيسية. يضمن ذلك بقاء واجهة المستخدم مستجيبة، حتى أثناء التحديثات المعقدة.
- التحديثات المستندة إلى الأولوية: تمكن Fiber React من تحديد أولويات أنواع مختلفة من التحديثات. على سبيل المثال، يمكن إعطاء تفاعلات المستخدم، مثل الكتابة أو النقر، أولوية أعلى من مهام الخلفية، مثل جلب البيانات. يضمن ذلك معالجة أهم التحديثات أولاً.
- العرض غير المتزامن: تسمح Fiber لـ React بتنفيذ العرض بشكل غير متزامن. هذا يعني أن React يمكن أن تبدأ في عرض مكون ثم تتوقف مؤقتًا للسماح للمتصفح بمعالجة المهام الأخرى، مثل إدخال المستخدم أو الرسوم المتحركة. يؤدي هذا إلى تحسين الأداء العام واستجابة التطبيق.
- معالجة الأخطاء المحسنة: توفر Fiber معالجة أفضل للأخطاء أثناء عملية التوفيق. في حالة حدوث خطأ أثناء العرض، يمكن لـ React التعافي بشكل أكثر سلاسة ومنع التطبيق بأكمله من التعطل.
ضع في اعتبارك تطبيق تحرير مستندات تعاوني. باستخدام Fiber، يمكن معالجة التعديلات التي يجريها مستخدمون مختلفون بأولويات مختلفة. تحصل الكتابة في الوقت الفعلي من المستخدم الحالي على أعلى أولوية، مما يضمن ردود فعل فورية. يمكن معالجة التحديثات من المستخدمين الآخرين، أو الحفظ التلقائي في الخلفية، بأولوية أقل، مما يقلل من تعطيل تجربة المستخدم النشط.
فهم بنية Fiber
يتم تمثيل كل مكون React بواسطة عقدة Fiber. تحمل عقدة Fiber معلومات حول نوع المكون وخصائصه وحالته وعلاقاته بعقد Fiber الأخرى في الشجرة. فيما يلي بعض الخصائص الهامة لعقدة Fiber:
- type: نوع المكون (على سبيل المثال، مكون دالة، مكون فئة، عنصر DOM).
- key: خاصية المفتاح التي تم تمريرها إلى المكون.
- props: الخصائص التي تم تمريرها إلى المكون.
- stateNode: مثيل المكون (لمكونات الفئة) أو فارغ (لمكونات الدالة).
- child: مؤشر إلى عقدة Fiber الطفل الأولى.
- sibling: مؤشر إلى عقدة Fiber الشقيقة التالية.
- return: مؤشر إلى عقدة Fiber الأصل.
- alternate: مؤشر إلى عقدة Fiber التي تمثل الحالة السابقة للمكون.
- effectTag: علامة تشير إلى نوع التحديث الذي يجب إجراؤه على DOM.
خاصية alternate
مهمة بشكل خاص. إنها تسمح لـ React بتتبع الحالات السابقة والحالية للمكون. أثناء عملية التوفيق، تقارن React عقدة Fiber الحالية مع alternate
الخاصة بها لتحديد التغييرات التي يجب إجراؤها على DOM.
خوارزمية WorkLoop
حلقة العمل هي جوهر بنية Fiber. وهي مسؤولة عن اجتياز شجرة fiber وتنفيذ العمل الضروري لكل fiber. يتم تنفيذ حلقة العمل كدالة متكررة تعالج fibers واحدًا تلو الآخر.
تتكون حلقة العمل من مرحلتين رئيسيتين:
- مرحلة العرض: خلال مرحلة العرض، تجتاز React شجرة fiber وتحدد التغييرات التي يجب إجراؤها على DOM. هذه المرحلة قابلة للمقاطعة، مما يعني أن React يمكنها إيقافها مؤقتًا واستئنافها في أي وقت.
- مرحلة الالتزام: خلال مرحلة الالتزام، تطبق React التغييرات على DOM. هذه المرحلة غير قابلة للمقاطعة، مما يعني أنه يجب على React إكمالها بمجرد أن تبدأ.
مرحلة العرض بالتفصيل
يمكن تقسيم مرحلة العرض أيضًا إلى مرحلتين فرعيتين:
- beginWork: دالة
beginWork
مسؤولة عن معالجة عقدة Fiber الحالية وإنشاء عقد Fiber للطفل. تحدد ما إذا كان يجب تحديث المكون، وإذا كان الأمر كذلك، فإنها تنشئ عقد Fiber جديدة لأطفاله. - completeWork: دالة
completeWork
مسؤولة عن معالجة عقدة Fiber الحالية بعد معالجة أطفالها. تقوم بتحديث DOM وحساب تخطيط المكون.
تنفذ دالة beginWork
المهام التالية:
- يتحقق مما إذا كان يجب تحديث المكون.
- إذا كان يجب تحديث المكون، فإنه يقارن الخصائص والحالة الجديدة بالخصائص والحالة السابقة لتحديد التغييرات التي يجب إجراؤها.
- ينشئ عقد Fiber جديدة لأطفال المكون.
- يقوم بتعيين خاصية
effectTag
على عقدة Fiber للإشارة إلى نوع التحديث الذي يجب إجراؤه على DOM.
تنفذ دالة completeWork
المهام التالية:
- يقوم بتحديث DOM بالتغييرات التي تم تحديدها أثناء دالة
beginWork
. - يحسب تخطيط المكون.
- يجمع التأثيرات الجانبية التي يجب إجراؤها بعد مرحلة الالتزام.
مرحلة الالتزام بالتفصيل
مرحلة الالتزام مسؤولة عن تطبيق التغييرات على DOM. هذه المرحلة غير قابلة للمقاطعة، مما يعني أنه يجب على React إكمالها بمجرد أن تبدأ. تتكون مرحلة الالتزام من ثلاث مراحل فرعية:
- beforeMutation: يتم تنفيذ هذه المرحلة قبل تغيير DOM. يتم استخدامه لتنفيذ مهام مثل إعداد DOM للتحديثات.
- mutation: هذه المرحلة هي المكان الذي يتم فيه إجراء تغييرات DOM الفعلية. تقوم React بتحديث DOM بناءً على خاصية
effectTag
لعقد Fiber. - layout: يتم تنفيذ هذه المرحلة بعد تغيير DOM. يتم استخدامه لتنفيذ مهام مثل تحديث تخطيط المكون وتشغيل طرق دورة الحياة.
أمثلة عملية ومقتطفات التعليمات البرمجية
دعنا نوضح عملية التوفيق Fiber بمثال مبسط. ضع في اعتبارك مكونًا يعرض قائمة بالعناصر:
```javascript function ItemList({ items }) { return (-
{items.map(item => (
- {item.name} ))}
عندما تتغير خاصية items
، تحتاج React إلى التوفيق بين القائمة وتحديث DOM وفقًا لذلك. إليك كيف ستتعامل Fiber مع هذا:
- مرحلة العرض: ستقارن دالة
beginWork
مصفوفةitems
الجديدة بمصفوفةitems
السابقة. سيحدد العناصر التي تمت إضافتها أو إزالتها أو تحديثها. - سيتم إنشاء عقد Fiber جديدة للعناصر المضافة، وسيتم تعيين
effectTag
للإشارة إلى أن هذه العناصر يجب إدراجها في DOM. - سيتم وضع علامة على عقد Fiber للعناصر التي تمت إزالتها للحذف.
- سيتم تحديث عقد Fiber للعناصر المحدثة بالبيانات الجديدة.
- مرحلة الالتزام: ستقوم مرحلة
commit
بعد ذلك بتطبيق هذه التغييرات على DOM الفعلي. سيتم إدراج العناصر المضافة، وسيتم حذف العناصر التي تمت إزالتها، وسيتم تعديل العناصر المحدثة.
يعد استخدام خاصية key
أمرًا بالغ الأهمية لتحقيق التوفيق الفعال. بدون خاصية key
، سيتعين على React إعادة عرض القائمة بأكملها عندما تتغير مصفوفة items
. باستخدام خاصية key
، يمكن لـ React تحديد العناصر التي تمت إضافتها أو إزالتها أو تحديثها بسرعة، وتحديث هذه العناصر فقط.
على سبيل المثال، تخيل سيناريو حيث يتغير ترتيب العناصر في عربة التسوق. إذا كان لكل عنصر key
فريد (على سبيل المثال، معرف المنتج)، فيمكن لـ React إعادة ترتيب العناصر في DOM بكفاءة دون الحاجة إلى إعادة عرضها بالكامل. يؤدي هذا إلى تحسين الأداء بشكل كبير، خاصة بالنسبة للقوائم الكبيرة.
الجدولة وتحديد الأولويات
تتمثل إحدى الفوائد الرئيسية لـ Fiber في قدرتها على جدولة التحديثات وتحديد أولوياتها. تستخدم React مجدولًا لتحديد متى تبدأ وحدة العمل أو توقفها مؤقتًا أو تستأنفها أو تتخلى عنها بناءً على أولويتها. يتيح ذلك لـ React تحديد أولويات تفاعلات المستخدم والتأكد من أن واجهة المستخدم تظل مستجيبة، حتى أثناء التحديثات المعقدة.
توفر React العديد من واجهات برمجة التطبيقات لجدولة التحديثات بأولويات مختلفة:
React.render
: يجدول تحديثًا بالأولوية الافتراضية.ReactDOM.unstable_deferredUpdates
: يجدول تحديثًا بأولوية أقل.ReactDOM.unstable_runWithPriority
: يسمح لك بتحديد أولوية التحديث بشكل صريح.
على سبيل المثال، يمكنك استخدام ReactDOM.unstable_deferredUpdates
لجدولة التحديثات غير الضرورية لتجربة المستخدم، مثل تتبع التحليلات أو جلب بيانات الخلفية.
معالجة الأخطاء باستخدام Fiber
توفر Fiber معالجة محسنة للأخطاء أثناء عملية التوفيق. عند حدوث خطأ أثناء العرض، يمكن لـ React التقاط الخطأ ومنع التطبيق بأكمله من التعطل. تستخدم React حدود الأخطاء للتعامل مع الأخطاء بطريقة خاضعة للرقابة.
حد الخطأ هو مكون يلتقط أخطاء JavaScript في أي مكان في شجرة مكوناته الفرعية، ويسجل هذه الأخطاء، ويعرض واجهة مستخدم احتياطية بدلاً من شجرة المكونات التي تعطلت. تلتقط حدود الأخطاء الأخطاء أثناء العرض، في طرق دورة الحياة، وفي مُنشئات الشجرة بأكملها أسفلها.
```javascript class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } static getDerivedStateFromError(error) { // Update state so the next render will show the fallback UI. return { hasError: true }; } componentDidCatch(error, errorInfo) { // You can also log the error to an error reporting service logErrorToMyService(error, errorInfo); } render() { if (this.state.hasError) { // You can render any custom fallback UI returnSomething went wrong.
; } return this.props.children; } } ```يمكنك استخدام حدود الأخطاء لتضمين أي مكون قد يطرح خطأ. يضمن ذلك بقاء تطبيقك مستقرًا حتى إذا فشلت بعض المكونات.
```javascriptتصحيح أخطاء Fiber
قد يكون تصحيح أخطاء تطبيقات React التي تستخدم Fiber أمرًا صعبًا، ولكن هناك العديد من الأدوات والتقنيات التي يمكن أن تساعد. يوفر ملحق متصفح React DevTools مجموعة قوية من الأدوات لفحص شجرة المكونات وتوصيف الأداء وتصحيح الأخطاء.
يسمح لك React Profiler بتسجيل أداء تطبيقك وتحديد الاختناقات. يمكنك استخدام Profiler لمعرفة المدة التي يستغرقها كل مكون في العرض وتحديد المكونات التي تسبب مشاكل في الأداء.
توفر React DevTools أيضًا عرضًا لشجرة المكونات يسمح لك بفحص الخصائص والحالة وعقدة Fiber لكل مكون. قد يكون هذا مفيدًا لفهم كيفية هيكلة شجرة المكونات وكيف تعمل عملية التوفيق.
الخلاصة
تمثل بنية React Fiber تحسينًا كبيرًا على عملية التوفيق التقليدية. من خلال تقسيم عملية التوفيق إلى وحدات عمل أصغر قابلة للمقاطعة، تمكن Fiber React من تحسين استجابة وأداء التطبيقات المتصورة، خاصة في السيناريوهات المعقدة.
يعد فهم المفاهيم الأساسية وراء Fiber، مثل fibers وحلقات العمل والجدولة، أمرًا ضروريًا لبناء تطبيقات React عالية الأداء. من خلال الاستفادة من ميزات Fiber، يمكنك إنشاء واجهات مستخدم أكثر استجابة وأكثر مرونة وتوفر تجربة مستخدم أفضل.
مع استمرار تطور React، ستظل Fiber جزءًا أساسيًا من بنيتها. من خلال البقاء على اطلاع دائم بأحدث التطورات في Fiber، يمكنك التأكد من أن تطبيقات React الخاصة بك تستفيد بشكل كامل من مزايا الأداء التي توفرها.
فيما يلي بعض النقاط الرئيسية:
- React Fiber هي إعادة كتابة كاملة لخوارزمية التوفيق الخاصة بـ React.
- تسمح Fiber لـ React بإيقاف عملية التوفيق مؤقتًا واستئنافها، مما يمنع المهام طويلة الأمد من حظر سلسلة التعليمات الرئيسية.
- تمكن Fiber React من تحديد أولويات أنواع مختلفة من التحديثات.
- توفر Fiber معالجة أفضل للأخطاء أثناء عملية التوفيق.
- خاصية
key
ضرورية للتوفيق الفعال. - يوفر ملحق متصفح React DevTools مجموعة قوية من الأدوات لتصحيح أخطاء تطبيقات Fiber.
من خلال تبني React Fiber وفهم مبادئها، يمكن للمطورين في جميع أنحاء العالم بناء تطبيقات ويب أكثر أداءً وسهولة في الاستخدام، بغض النظر عن موقعهم أو مدى تعقيد مشاريعهم.