0Pricing
React Academy · درس

مشكلة الاشتراك في المخازن الخارجية

تعرّفوا إلى tearing وسبب عدم أمان الاشتراكات في المخازن الخارجية باستخدام useState أو useRef ضمن React المتزامن.

مشكلة الاشتراك في المخازن الخارجية درس مجاني في React Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

ما هو المخزن الخارجي

المخزن الخارجي هو أي مصدر للحالة يعيش خارج شجرة React، مثل مخزن Redux، أو واجهة متصفح مثل matchMedia، أو كائن عادي على مستوى الوحدة يملك آلية subscribe الخاصة به.

لا يملك React هذه الحالة، لذلك يجب عليه الاشتراك في التغييرات وقراءة لقطات الحالة للحفاظ على مزامنة المكوّنات مع ما يحتفظ به المخزن حاليًا.

الاشتراك الساذج باستخدام useState + useEffect

تقرأ إحدى الطرق الشائعة قيمة المخزن في useState، ثم تستخدم useEffect للاشتراك واستدعاء setState كلما تغيّر المخزن. ويبدو هذا ظاهريًا كافيًا لإبقاء المكوّن محدّثًا.

تنجح هذه الطريقة في التصيير المتزامن البسيط، لكنها تحتوي على عيب دقيق يظهر عندما يصيّر React بشكل متزامن ويتمكن من إيقاف العمل أو إعادة تشغيله في منتصفه.

مشكلة التمزق

يحدث التمزق عندما تعرض أجزاء مختلفة من واجهة المستخدم قيمًا مختلفة للمخزن نفسه أثناء دورة تصيير واحدة. فقد يقطع التصيير المتزامن العمل ويستأنفه، وقد يتغير المخزن في أثناء ذلك.

تكون النتيجة شاشة غير متسقة يعرض فيها أحد المكوّنات القيمة القديمة بينما يعرض الآخر القيمة الجديدة، وهو تناقض كان مستحيلًا عمليًا قبل ظهور الميزات المتزامنة.

مثال: تمزق العرض عند تبديل الوضع الداكن أثناء التصيير

تخيّل أن مكوّنات كثيرة تقرأ مخزن السمة بينما يصيّر React بشكل متزامن. إذا بدّل المستخدم إلى الوضع الداكن في منتصف العملية، فستعرض المكوّنات التي صُيّرت قبل التبديل السمة الفاتحة، بينما تعرض المكوّنات التي صُيّرت بعده السمة الداكنة.

ستحصل على شاشة نصفها فاتح ونصفها داكن لإطار واحد، لأن قيمة المخزن تغيّرت أثناء تصيير لم يتعامل معه React بوصفه عملية ذرّية.

لماذا يأتي useEffect متأخرًا

تعمل التأثيرات بعد تثبيت التصيير، ولذلك لا يستطيع اشتراك يعتمد على useEffect ضمان تطابق القيمة المقروءة أثناء التصيير مع قيمة المخزن عند وقت التثبيت. إذ يُنفّذ الاشتراك متأخرًا بحيث لا يمنع عرضًا غير متسق.

وبحلول الوقت الذي يعيد فيه التأثير إنشاء الاشتراك ويحدّث الحالة، قد يكون الإطار غير المتسق عُرض للمستخدم بالفعل.

useMutableSource المهجور

حاولت واجهة تجريبية سابقة تُسمى useMutableSource حل مشكلة القراءة الآمنة من المصادر الخارجية أثناء التصيير المتزامن، لكن ثبت أن استخدام واجهتها استخدامًا صحيحًا صعب، ولم تُطرح قط بإصدار مستقر.

استبدلها فريق React ببدائية أبسط وأسهل استخدامًا، تحقق ضمانات الاتساق نفسها من دون مواطن الخطأ الدقيقة في الواجهة السابقة.

useSyncExternalStore بوصفه الحل

يُعد useSyncExternalStore الخطاف الرسمي للاشتراك في المخازن الخارجية بطريقة آمنة أثناء التصيير المتزامن. فهو ينسّق مع React للحفاظ على اتساق القراءات خلال التصيير، ومنع حدوث التمزق في المكوّنات.

وأصبح البدائية الموصى بها لمؤلفي المكتبات الذين يحتاجون إلى ربط الحالة الخارجية بـ React بشكل موثوق أثناء التصيير المتزامن.

ما المكتبات التي تأثرت

تأثرت مباشرةً مكتبات الحالة التي تشترك في المخازن الخارجية، ومنها Redux وMobX وValtio. وكان على كل منها اعتماد البدائية الجديدة للحفاظ على الأمان بعد إطلاق الميزات المتزامنة.

ولهذا حُدّثت روابط React الخاصة بها لاستدعاء useSyncExternalStore داخليًا بدلًا من الاعتماد على النمط الأقدم useState مع useEffect.

اتساق اللقطات والأمان مع التزامن

تضمن هذه الوصلة أن كل مكوّن يقرأ من المخزن أثناء عملية تصيير واحدة يرى اللقطة نفسها، كما تفرض إعادة تصيير متزامنة إذا تغيّر المخزن بطريقة قد تؤدي بخلاف ذلك إلى التمزق.

يمثّل هذا الجمع بين اللقطة المتسقة والأمان مع التزامن القيمة الأساسية التي توفرها الوصلة مقارنةً بالاشتراكات المُنفّذة يدويًا.

بدائية تواكب المستقبل

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

وهذا يجعلها الطريقة المستدامة والموصى بها لربط أي مصدر خارجي للحقيقة بمكوّنات React.

تحقق سريع: مشكلة التمزق

تحقق من معنى التمزق في التصيير المتزامن.

مراجعة: مشكلات الاشتراك في المخزن الخارجي

تعيش المخازن الخارجية خارج React، ولا يستطيع الاشتراك الساذج باستخدام useState مع useEffect منع التمزق عندما يصبح التصيير متزامنًا. إذ تعمل التأثيرات بعد فوات الأوان للحفاظ على اتساق القراءات أثناء عملية التصيير.

تستبدل useSyncExternalStore ‏useMutableSource المهجورة، وتوفر لقطة متسقة مع الأمان أثناء التزامن. وقد اعتمدتها مكتبات مثل Redux وMobX وValtio بوصفها البدائية التي تواكب المستقبل لاشتراكات المخازن.

الأسئلة الشائعة

هل درس «مشكلة الاشتراك في المخازن الخارجية» مجاني؟

نعم — نص درس «مشكلة الاشتراك في المخازن الخارجية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «مشكلة الاشتراك في المخازن الخارجية»؟

تعرّفوا إلى tearing وسبب عدم أمان الاشتراكات في المخازن الخارجية باستخدام useState أو useRef ضمن React المتزامن. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «مشكلة الاشتراك في المخازن الخارجية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مشكلة الاشتراك في المخازن الخارجية
  2. واجهة API useSyncExternalStore ومعلماتها
  3. الاشتراك في واجهات API للمتصفح
  4. بناء مخزن مخصص باستخدام useSyncExternalStore
← العودة إلى React Academy