0Pricing
React Academy · レッスン

Webpack 5によるModule Federation

Webpack Module Federationでhost appとremote appを設定し、runtimeでコンポーネントを共有します。

「Webpack 5によるModule Federation」はCoddyKit上の無料React Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

Module Federationの概要

Webpack 5のModule Federationを使うと、別々にバンドルされたアプリケーション間でJavaScriptモジュールを実行時に共有できます。一方のアプリがコンポーネントを公開し、もう一方のアプリがビルド手順なしで利用します。

役割:ホストとリモート

リモートはモジュールを公開します。ホストは1つ以上のリモートからモジュールを利用します。1つのアプリが同時にホストとリモートの両方になることもできます。

リモートの設定

リモートアプリの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が1つだけ読み込まれるようにします。

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

動的なリモート

webpack設定にURLをハードコードする代わりに、設定(例:マニフェストエンドポイント)から実行時にリモートを動的に読み込みます。

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'));

Module FederationとTypeScript

@module-federation/typescriptプラグインを使用して、公開されたモジュールの型宣言を生成します。これにより、ホストで完全な自動補完を利用できます。

リモートの障害に対するエラーバウンダリ

リモートコンポーネントをエラーバウンダリでラップしてください。リモートの読み込みに失敗しても、ホスト全体がクラッシュせず、適切に機能を縮退できます。

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

ViteのModule Federation

@originjs/vite-plugin-federationプラグインを使うと、同様のAPIで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'],
    }),
  ],
});

クイックチェック

Module Federationで共有パッケージにsingleton: trueを設定すると、どうなりますか?

まとめ

Module Federationでは、リモートでModuleFederationPluginを使って公開し、ホストで使って利用します。リモートモジュールはlazy()でインポートし、重複を避けるためにreactをシングルトンとして共有してください。また、リモートをエラーバウンダリでラップし、適切に機能を縮退できるようにします。

よくある質問

「Webpack 5によるModule Federation」レッスンは無料ですか?

はい。「Webpack 5によるModule Federation」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「Webpack 5によるModule Federation」で何を学びますか?

Webpack Module Federationでhost appとremote appを設定し、runtimeでコンポーネントを共有します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Webpack 5によるModule Federation」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Micro-Frontendの概念とトレードオフ
  2. Webpack 5によるModule Federation
  3. MFE間の共有StateとRouting
  4. MFEの独立デプロイとCI Pipeline
← React Academyに戻る