إعداد تطبيقات React المضيفة والبعيدة
أعدد exposes وremotes والتبعيات المشتركة في webpack.config.js لهيكل مضيف وتطبيقَي React بعيدين
إعداد تطبيقات React المضيفة والبعيدة درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
ملف webpack.config.js للتطبيق البعيد: ModuleFederationPlugin
يضيف التطبيق البعيد ModuleFederationPlugin إلى إعداد Webpack الخاص به مع ثلاث خصائص رئيسية: name (معرّف فريد، مثل "buttonApp")، وfilename ("remoteEntry.js" — ناتج البيان)، وexposes (خريطة من الاسم العام إلى مسار الملف المصدر).
كشف المكونات من التطبيق البعيد
يربط إعداد exposes مسار وحدة عامًا بملف محلي: { './Button': './src/Button' }. وهذا يعني أن المضيف يستطيع استيراد 'buttonApp/Button' والحصول على المكوّن من ./src/Button.tsx. ويمكنكم كشف مكونات متعددة أو أدوات مساعدة أو حتى صفحات كاملة.
الإعداد المشترك في التطبيق البعيد
تخبر الخاصية shared Module Federation بالوحدات التي ينبغي مشاركتها بين المضيف والتطبيق البعيد بدلًا من تكرارها. بالنسبة إلى React: shared: { react: { singleton: true, requiredVersion: deps.react }, 'react-dom': { singleton: true } }. تمنع singleton:true تحميل نسخ متعددة في الوقت نفسه.
ملف webpack.config.js للمضيف: الإشارة إلى التطبيقات البعيدة
يتضمن إعداد ModuleFederationPlugin في تطبيق المضيف خاصية remotes: { buttonApp: 'buttonApp@http://localhost:3001/remoteEntry.js' }. المفتاح هو مساحة أسماء الاستيراد، والقيمة هي اسم التطبيق البعيد وعنوان URL الخاص به مدمجان باستخدام @ — لإخبار Webpack بمكان جلب التطبيق البعيد أثناء التشغيل.
استهلاك التطبيق البعيد في React
في شيفرة React الخاصة بالمضيف، استوردوا المكوّن البعيد باستخدام استيراد ديناميكي: const Button = React.lazy(() => import('buttonApp/Button')). يطابق مسار الاستيراد مساحة أسماء التطبيق البعيد واسم الوحدة المكشوفة. يجعل React.lazy الاستيراد مقسّمًا إلى أجزاء ويُحمّل بصورة غير متزامنة.
التغليف باستخدام Suspense
بما أن الوحدات البعيدة تُحمّل بصورة غير متزامنة، احرصوا دائمًا على تغليف المكوّن البعيد المستورد بطريقة lazy داخل حدّ Suspense: Suspense fallback=Loading... /. يُصيّر البديل أثناء جلب Module Federation لملف remoteEntry.js وجزء المكوّن من عنوان URL الخاص بالتطبيق البعيد.
أهمية المفردات المشتركة
تعتمد hooks الخاصة بـ React (useState وuseContext وuseEffect) على نسخة داخلية واحدة من React لتتبّع حالة المكوّن. إذا حمّل كل من المضيف والتطبيق البعيد نسخته الخاصة من React، فستؤدي hooks إلى طرح أخطاء "invalid hook call". تفرض singleton:true مشاركة نسخة واحدة من React، مما يحل هذه الفئة من الأخطاء بالكامل.
حل تعارض الإصدارات
عندما يستخدم المضيف react@18.2.0 ويستخدم التطبيق البعيد react@18.3.0، يتفاوض النطاق المشترك في Module Federation على الإصدار الذي سيُستخدم. مع singleton:true وrequiredVersion، يُستخدم عادةً الإصدار الأعلى إذا كان متوافقًا. يتيح ضبط requiredVersion: '>=18.0.0' بدلًا من إصدار محدد نطاقات إصدارات مرنة.
TypeScript: تعريفات الوحدات
لا يعرف TypeScript الوحدات البعيدة أثناء الترجمة، لذلك ستؤدي عمليات الاستيراد مثل import('buttonApp/Button') إلى أخطاء في الأنواع من دون تعريفات. استخدموا @module-federation/typescript أو أنشئوا يدويًا ملفات .d.ts تعرّف أنواع الوحدات، لتحصلوا على أمان الأنواع للخصائص الممررة إلى المكونات البعيدة.
اختبار الإعداد محليًا
شغّلوا التطبيقين في الوقت نفسه: التطبيق البعيد على المنفذ 3001 والمضيف على المنفذ 3000. افتحوا المضيف — سيجلب وقت تشغيل Module Federation الخاص به http://localhost:3001/remoteEntry.js، ويكتشف وحدة Button، وينزّل الجزء الخاص بها، ثم يصيّرها داخل تطبيق المضيف كما لو كانت مكوّنًا محليًا.
إعداد عنوان URL للإنتاج
في بيئة الإنتاج، استبدلوا localhost:3001 بعنوان URL المنشور للتطبيق البعيد. من الأنماط الشائعة استخدام متغير بيئة لعنوان URL الخاص بالتطبيق البعيد، بحيث يتمكن CI/CD من حقن العنوان الصحيح لكل بيئة: buttonApp: 'buttonApp@' + process.env.BUTTON_REMOTE_URL + '/remoteEntry.js'.
الوحدات المشتركة المفردة
لماذا يجب إعداد React كمفردة في إعداد shared الخاص بـ Module Federation؟
مراجعة الدرس
يتطلب إعداد Module Federation استخدام ModuleFederationPlugin في كل من التطبيق البعيد (مع name وfilename وexposes) والمضيف (مع remotes). استهلكوا المكونات البعيدة عبر React.lazy + الاستيراد الديناميكي المغلف داخل Suspense. يجب مشاركة React وReact DOM كمفردتين لمنع أخطاء hooks الناتجة عن تعدد النسخ. وتكمل تعريفات TypeScript وعناوين URL للتطبيقات البعيدة المعتمدة على متغيرات البيئة إعدادًا جاهزًا للإنتاج.
الأسئلة الشائعة
هل درس «إعداد تطبيقات React المضيفة والبعيدة» مجاني؟
نعم — نص درس «إعداد تطبيقات React المضيفة والبعيدة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «إعداد تطبيقات React المضيفة والبعيدة»؟
أعدد exposes وremotes والتبعيات المشتركة في webpack.config.js لهيكل مضيف وتطبيقَي React بعيدين تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «إعداد تطبيقات React المضيفة والبعيدة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- اتحاد الوحدات: الاستيراد الديناميكي وقت التشغيل
- إعداد تطبيقات React المضيفة والبعيدة
- مشاركة الحالة والتوجيه بين التطبيقات البعيدة
- إدارة الإصدارات والنشر والتنسيق