0Pricing
React Academy · درس

Module Federation باستخدام Webpack 5

اضبط تطبيقًا مضيفًا وتطبيقًا بعيدًا باستخدام Webpack Module Federation لمشاركة المكوّنات أثناء التشغيل.

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

نظرة عامة على Module Federation

يتيح Module Federation في Webpack 5 مشاركة وحدات JavaScript بين تطبيقات مجمّعة بصورة منفصلة في وقت التشغيل — إذ يكشف تطبيق واحد المكوّنات، ويستهلكها تطبيق آخر دون خطوة بناء.

الأدوار: المضيف مقابل البعيد

يكشف التطبيق البعيد الوحدات. ويستهلك التطبيق المضيف الوحدات من تطبيق بعيد واحد أو أكثر. ويمكن للتطبيق أن يكون مضيفًا وبعيدًا في الوقت نفسه.

إعداد التطبيق البعيد

في ملف webpack.config.js الخاص بالتطبيق البعيد، استخدم ModuleFederationPlugin لكشف المكوّنات.

// Remote: apps/products/webpack.config.js
const { ModuleFederationPlugin } = require('webpack').container;

module.exports = {
  plugins: [
    new ModuleFederationPlugin({
      name: 'products',              // remote name
      filename: 'remoteEntry.js',    // entry file
      exposes: {
        './ProductCard': './src/components/ProductCard', // exposed module
        './CartButton': './src/components/CartButton',
      },
      shared: ['react', 'react-dom'], // share deps to avoid duplication
    }),
  ],
};

إعداد التطبيق المضيف

في إعدادات webpack الخاصة بالتطبيق المضيف، حدّد التطبيقات البعيدة التي تريد استهلاكها ومكان تحميلها منه.

// Host: apps/shell/webpack.config.js
new ModuleFederationPlugin({
  name: 'shell',
  remotes: {
    products: 'products@http://localhost:3001/remoteEntry.js',
    cart: 'cart@http://localhost:3002/remoteEntry.js',
  },
  shared: ['react', 'react-dom'],
})

استهلاك وحدة بعيدة

استورد الوحدات البعيدة باستخدام اسم التطبيق البعيد كبادئة للمسار. وغلّفها داخل React.lazy وSuspense لتحميلها بشكل كسول.

import React, { lazy, Suspense } from 'react';

const ProductCard = lazy(() => import('products/ProductCard'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <ProductCard productId="123" />
    </Suspense>
  );
}

مشاركة التبعيات

أدرج الحزم المشتركة مع singleton: true حتى لا تُحمّل سوى نسخة واحدة من React عبر جميع الواجهات الأمامية المصغّرة.

shared: {
  react: { singleton: true, requiredVersion: '^18.0.0' },
  'react-dom': { singleton: true, requiredVersion: '^18.0.0' },
  '@company/design-system': { singleton: true },
},

التطبيقات البعيدة الديناميكية

حمّل التطبيقات البعيدة ديناميكيًا في وقت التشغيل من الإعدادات (مثل نقطة نهاية للبيان) بدلًا من تثبيت عناوين URL في إعدادات webpack.

async function loadRemote(scope, module) {
  await __webpack_init_sharing__('default');
  const container = window[scope];
  await container.init(__webpack_share_scopes__.default);
  const factory = await container.get(module);
  return factory();
}

const ProductCard = React.lazy(() => loadRemote('products', './ProductCard'));

TypeScript مع Module Federation

استخدم إضافة @module-federation/typescript لإنشاء تصريحات الأنواع للوحدات المكشوفة، حتى يحصل التطبيق المضيف على إكمال تلقائي كامل.

حدود الأخطاء لفشل التطبيقات البعيدة

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

<ErrorBoundary fallback={<div>Product unavailable</div>}>
  <Suspense fallback={<Skeleton />}>
    <ProductCard productId={id} />
  </Suspense>
</ErrorBoundary>

Module Federation في Vite

تجلب إضافة @originjs/vite-plugin-federation Module Federation إلى المشاريع المعتمدة على Vite باستخدام واجهة برمجية مشابهة.

// vite.config.ts (remote)
import federation from '@originjs/vite-plugin-federation';

export default defineConfig({
  plugins: [
    federation({
      name: 'products',
      filename: 'remoteEntry.js',
      exposes: { './ProductCard': './src/ProductCard' },
      shared: ['react'],
    }),
  ],
});

تحقق سريع

ماذا يفعل ضبط singleton: true لحزمة مشتركة في Module Federation؟

مراجعة

يستخدم Module Federation إضافة ModuleFederationPlugin في التطبيقات البعيدة (للكشف) والتطبيقات المضيفة (للاستهلاك). استورد الوحدات البعيدة باستخدام lazy()، وشارك react بوصفه نسخة مفردة لتجنب التكرار، وغلّف التطبيقات البعيدة داخل حدود أخطاء للتدهور السلس.

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

هل درس «Module Federation باستخدام Webpack 5» مجاني؟

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

ماذا ستتعلم في «Module Federation باستخدام Webpack 5»؟

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

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

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

كم من الوقت يستغرق درس «Module Federation باستخدام Webpack 5»؟

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

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

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

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

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