0Pricing
React Academy · درس

الحالة المشتركة والتوجيه بين MFEs

شارك ناقل أحداث عامًا أو سياقًا عبر Micro-Frontend ونسّق التوجيه من جانب العميل.

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

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

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

أحداث المتصفح المخصصة

استخدم واجهة CustomEvent البرمجية في المتصفح بوصفها ناقل أحداث بسيطًا بين الواجهات الأمامية المصغّرة، دون ربطها ببعضها.

// Remote emits:
window.dispatchEvent(new CustomEvent('cart:add', { detail: { productId: '123' } }));

// Host listens:
useEffect(() => {
  const handler = (e: CustomEvent) => addToCart(e.detail.productId);
  window.addEventListener('cart:add', handler);
  return () => window.removeEventListener('cart:add', handler);
}, []);

مكتبة ناقل أحداث مشتركة

توفّر مكتبة صغيرة للنشر والاشتراك، مشتركة عبر Module Federation أو نسخة مفردة محمّلة من عنوان URL، ناقل أحداث محدد الأنواع ويمكن لجميع الواجهات الأمامية المصغّرة الوصول إليه.

// Singleton event bus
const bus = {
  listeners: new Map<string, Function[]>(),
  emit(event: string, data: unknown) {
    this.listeners.get(event)?.forEach(fn => fn(data));
  },
  on(event: string, fn: Function) {
    if (!this.listeners.has(event)) this.listeners.set(event, []);
    this.listeners.get(event)!.push(fn);
    return () => this.off(event, fn);
  },
  off(event: string, fn: Function) {
    const list = this.listeners.get(event) || [];
    this.listeners.set(event, list.filter(f => f !== fn));
  },
};
export default bus;

عنوان URL بوصفه حالة مشتركة

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

// Remote reads from URL:
const params = new URLSearchParams(window.location.search);
const productId = params.get('product');

// Remote navigates via history API (or exposes a navigate callback from host):
window.history.pushState({}, '', '/products?product=456');

بنية التوجيه

عادةً ما يملك تطبيق الغلاف/المضيف موجّه المستوى الأعلى. وتتلقى الواجهات الأمامية المصغّرة البعيدة المسار الحالي واستدعاء navigate بوصفهما خصائص.

// Host passes routing control to remote:
<RemoteProductsApp
  basepath="/products"
  navigate={(path) => router.push(path)}
/>

// Remote uses basepath for its internal router:
<BrowserRouter basename={basepath}>
  <Routes>...</Routes>
</BrowserRouter>

React Router مع Module Federation

يمكن لكل واجهة أمامية مصغّرة تشغيل React Router الخاص بها ضمن مسارها الأساسي. ويتولى موجّه التطبيق المضيف التنقل على المستوى الأعلى، بينما يتولى كل تطبيق بعيد التنقل الفرعي باستقلالية.

// Remote App component:
export function ProductsApp({ basepath = '/products' }) {
  return (
    <BrowserRouter basename={basepath}>
      <Routes>
        <Route path="/" element={<ProductList />} />
        <Route path="/:id" element={<ProductDetail />} />
      </Routes>
    </BrowserRouter>
  );
}

حالة المصادقة المشتركة

يمتلك الغلاف عادةً حالة المصادقة (user، token) ويمررها إلى التطبيقات البعيدة بوصفها خصائص، أو يتيحها عبر مخزن مشترك مفرد.

// Host provides auth via props:
<RemoteCheckout
  userId={currentUser.id}
  token={accessToken}
  onLogout={handleLogout}
/>

استخدام Zustand كمخزن مشترك

عند مشاركة مخزن Zustand عبر Module Federation بوصفه نسخة مفردة، تقرأ جميع الواجهات الأمامية المصغّرة من نسخة المخزن نفسها الموجودة في الذاكرة.

// shared/store.ts (exposed as singleton)
import { create } from 'zustand';
export const useCartStore = create(set => ({
  items: [],
  addItem: (item) => set(state => ({ items: [...state.items, item] })),
}));

// Configured as singleton in MF shared config

أنماط التواصل السيئة بين الواجهات الأمامية المصغّرة

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

اختبار التفاعلات بين الواجهات الأمامية المصغّرة

اختبر عقود الأحداث (أسماء الأحداث وأشكال البيانات) بصورة منفصلة عن واجهة المستخدم. واستخدم اختبار العقود للتحقق من اتفاق المنتج والمستهلك على مخطط الأحداث.

تحقق سريع

ما أبسط طريقة لمشاركة حالة التنقل أو التصفية بين عدة واجهات أمامية مصغّرة دون ربطها ببعضها؟

مراجعة

شارك الحالة بين الواجهات الأمامية المصغّرة باستخدام الأحداث المخصصة، أو ناقل أحداث مفرد، أو عنوان URL، أو المخازن المشتركة (Zustand/نسخة مفردة). يمتلك الغلاف موجّه المستوى الأعلى ويمرر المسار الأساسي واستدعاء navigate إلى التطبيقات البعيدة. اجعل العقود بين الواجهات الأمامية المصغّرة عامة ومحددة الأنواع جيدًا.

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

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

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

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

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

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

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

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

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

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

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

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

  1. مفاهيم Micro-Frontend والمفاضلات
  2. Module Federation باستخدام Webpack 5
  3. الحالة المشتركة والتوجيه بين MFEs
  4. النشر المستقل وخطوط CI لـ MFEs
← العودة إلى React Academy