0Pricing
React Academy · درس

مشاركة الحالة والتوجيه بين التطبيقات البعيدة

شاركوا مثيل React Router واحدًا ومتجر Zustand واحدًا بين الواجهات الأمامية المصغّرة المنشورة بشكل مستقل.

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

تحدي مشاركة الحالة

كل وحدة remote في Module Federation هي تطبيق يُبنى ويُنشر بشكل مستقل. وتعيش حالتها (React useState وContext ومتاجر Zustand) ضمن نطاق وحدة JavaScript الخاص بها. لا يشارك المضيف والوحدات البعيدة الحالة تلقائيًا، بل يجب تصميم هذه المشاركة بشكل صريح.

الخيار 1: عنوان URL كحالة مشتركة

أبسط آلية لمشاركة الحالة هي عنوان URL: إذ يمكن لأي وحدة بعيدة قراءة معاملات URL وسلاسل الاستعلام وقيم التجزئة دون أي اتصال بين الوحدات البعيدة. ويناسب ذلك حالة التنقل الأساسية، وقيم عوامل التصفية، وأي حالة ينبغي حفظها في إشارة مرجعية ومشاركتها عبر رابط.

الخيار 2: CustomEvents للاقتران غير المحكم

تسمح CustomEvents عبر EventTarget في المتصفح للوحدات البعيدة بالتواصل دون عمليات استيراد مباشرة. تستدعي إحدى الوحدات البعيدة window.dispatchEvent(new CustomEvent('cart:updated', { detail: cart }))، وتصغي أي وحدة أخرى (المضيف أو وحدة بعيدة أخرى) باستخدام window.addEventListener('cart:updated', handler). ولا حاجة إلى وحدة مشتركة.

الخيار 3: وحدة بعيدة للحالة المشتركة

أنشئ وحدة بعيدة مخصصة للحالة تعرض متجر Zustand أو Jotai. يستورد كل من المضيف والوحدات البعيدة الأخرى من وحدة الحالة البعيدة هذه، ويحصلون على مثيل المتجر نفسه، لأنه singleton مشترك. يناسب ذلك الحالة المشتركة المعقدة (المصادقة، وسلة التسوق، وتفضيلات المستخدم)، لكنه يضيف اعتمادًا على عملية نشر أخرى.

الخيار 4: المضيف يملك الحالة ويمرر دوال الاستدعاء

يملك الغلاف (المضيف) كل الحالة المشتركة ويمررها إلى الوحدات البعيدة على شكل props أو عبر Context. وتتلقى الوحدات البعيدة دوال استدعاء مثل onCartUpdate، كما تتلقى navigate على شكل props. يحافظ ذلك على مركزية الحالة في المضيف، لكنه يتطلب من المضيف معرفة واجهات برمجة الوحدات البعيدة، ما ينشئ اقترانًا وثيقًا.

React Router في Module Federation

يوفّر مكوّن Router (BrowserRouter أو createBrowserRouter) حالتي السجل والموقع في React Router. يجب أن يوجد Router واحد بالضبط في إعداد Module Federation، إذ إن وضعه في كل وحدة بعيدة سينشئ سياقات توجيه متعددة متنافسة، ما يؤدي إلى تعارضات في التنقل.

المضيف يملك Router

القاعدة المعمارية هي أن المضيف (الغلاف) هو الذي يوفر Router. وتتلقى الوحدات البعيدة خصائص التوجيه من المضيف (أو تقرأ URL مباشرةً). ويجب ألا تنشئ الوحدة البعيدة BrowserRouter خاصًا بها مطلقًا، لأنه سيتعارض مع Router الخاص بالمضيف ويعطّل التنقل في التطبيق بأكمله.

مشاركة Context بين الوحدات البعيدة

ترتبط قيم React Context بمثيل React وكائن Context محددين. لكي يعمل Context بين المضيف والوحدة البعيدة، يجب أن يستوردا كائن Context نفسه من المصدر نفسه، وعادةً ما يكون وحدة الحالة البعيدة أو حزمة أدوات مشتركة. ويضمن React singleton عمل Context نفسه عبر جميع الوحدات البعيدة.

نمط بنية الغلاف

في بنية Module Federation مرتبة، يملك الغلاف (المضيف): غلاف HTML، وموفّر Router، وسياق Auth، وموفّر السمات/رموز التصميم، والتنقل العام. أما الوحدات البعيدة فتملك محتوى نطاق ميزاتها. ويجمع الغلاف الوحدات البعيدة في التخطيط دون معرفة تفاصيل تنفيذها.

تجنّب الاقتران الوثيق

أكبر نمط مضاد في Module Federation هو الاقتران الوثيق بين المضيف والوحدة البعيدة: يستورد المضيف الأنواع من الوحدة البعيدة، أو تستورد الوحدة البعيدة المكوّنات من المضيف، أو يتشاركان حزمة npm مشتركة يجب على كليهما تحديثها في الوقت نفسه. وتُفقد هذه الاقترانات الهدف من النشر المستقل.

عقود الاتصال

حدّد عقودًا واضحة بين المضيف والوحدات البعيدة: الخصائص التي يقبلها مكوّن الوحدة البعيدة، وCustomEvents التي يرسلها، ومعاملات URL التي يقرأها. وثّق هذه العقود على شكل واجهات TypeScript في حزمة أنواع مشتركة. ويسمح ذلك للفرق بالتطور بشكل مستقل ضمن العقد المتفق عليه.

موضع React Router في Module Federation

أين ينبغي وضع موفّر React Router‏ (BrowserRouter) في بنية Module Federation؟

مراجعة الدرس

يمكن مشاركة الحالة بين الوحدات البعيدة في Module Federation باستخدام حالة URL (وهي الأبسط)، أو CustomEvents (لالقتران غير المحكم)، أو وحدة بعيدة للحالة المشتركة (متجر مركزي)، أو حالة يملكها المضيف ويمررها على شكل props. يجب أن يملك المضيف موفّر Router الوحيد، ويجب ألا تنشئ الوحدات البعيدة Router خاصًا بها مطلقًا. وتحافظ عقود الاتصال الواضحة عبر واجهات TypeScript على استقلالية الفرق وتمكّن النشر المستقل الحقيقي.

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

هل درس «مشاركة الحالة والتوجيه بين التطبيقات البعيدة» مجاني؟

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

ماذا ستتعلم في «مشاركة الحالة والتوجيه بين التطبيقات البعيدة»؟

شاركوا مثيل React Router واحدًا ومتجر Zustand واحدًا بين الواجهات الأمامية المصغّرة المنشورة بشكل مستقل. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «مشاركة الحالة والتوجيه بين التطبيقات البعيدة»؟

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

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

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

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

  1. اتحاد الوحدات: الاستيراد الديناميكي وقت التشغيل
  2. إعداد تطبيقات React المضيفة والبعيدة
  3. مشاركة الحالة والتوجيه بين التطبيقات البعيدة
  4. إدارة الإصدارات والنشر والتنسيق
← العودة إلى React Academy