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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Micro-Frontendの概念とトレードオフ
- Webpack 5によるModule Federation
- MFE間の共有StateとRouting
- MFEの独立デプロイとCI Pipeline