Chuyển đến nội dung chính

レッスン 11: マイクロ フロントエンド統合戦略 — ビルド時と実行時

マイクロ フロントエンドを構成する 7 つの戦略: iframe、Web コンポーネント、ビルド時統合、JavaScript バンドル、モジュール フェデレーション、サーバーサイド インクルード、エッジサイド インクルード。 Compare details and choose the right approach.

🏗️ アーキテクチャ — レッスン 11 レッスン 11: マイクロ フロントエンドの統合 戦略 - ビルド時間と実行時間

マイクロサービスとマイクロ フロントエンドのシステム設計 — 基本から運用まで

パート 4: マイクロ フロントエンド — アーキテクチャと原則

xdev.asia

はじめに

マイクロ フロントエンド アプリケーションを作成するには、さまざまな方法があります。各アプローチには独自のトレードオフがあります。この記事では、各戦略を詳しく説明し、適切な戦略を選択するのに役立ちます。

4 マイクロ フロントエンド統合戦略


1. ビルド時の統合 (NPM パッケージ)

各 MFE は npm パッケージとして公開され、ホスト アプリはビルド時にインポートされます。

host-app/package.json:
  "@company/product-mfe": "^2.1.0"
  "@company/cart-mfe": "^1.3.0"

利点: シンプル、タイプセーフ、ツリーシェイク可能 欠点: MFE の更新時にホスト アプリを再構築および再デプロイする必要がある 評決: ❌ 「実際には」Micro Frontend ではない - 独立した展開はありません


2. 実行時の統合

2.1 iframe

<iframe src="https://product.example.com/embed" />

利点: 完全な分離、シンプル 短所: 共有スタイルがない、コミュニケーションが難しい、SEO がひどい、パフォーマンスが低い 使用例: 従来のアプリの埋め込み、サンドボックス化されたウィジェット

2.2 Web コンポーネント

<product-catalog data-category="electronics"></product-catalog>
<script src="https://product.cdn.com/product-catalog.js"></script>

利点: フレームワークに依存しない、Shadow DOM 分離、ブラウザ標準 欠点: 複雑な SSR、React ラッパーが必要、Shadow DOM のスタイリングが難しい

2.3 JavaScript の統合 (動的スクリプト読み込み)

function loadMicroFrontend(name, containerId) {
  const script = document.createElement('script');
  script.src = `https://${name}.cdn.com/bundle.js`;
  script.onload = () => {
    window[`render_${name}`](document.getElementById(containerId));
  };
  document.body.appendChild(script);
}

利点: シンプル、柔軟、不可知論的なフレームワーク 欠点: 依存関係の共有がない、大きなバンドル

2.4 モジュールフェデレーション (Webpack 5) ⭐

┌─────────────────────────────┐
│        Shell App (Host)     │
│                             │
│  import('product/Catalog')  │──► Product MFE (Remote)
│  import('cart/MiniCart')     │──► Cart MFE (Remote)
│                             │
│  Shared: React, React-DOM   │
│  (loaded once, shared)      │
└─────────────────────────────┘

利点: ランタイム統合、共有依存関係、遅延読み込み、TypeScript 欠点: Webpack 固有の学習曲線 評決: ⭐ ほとんどのユースケースで 推奨。


3. サーバー側のアプローチ

3.1 サーバー側インクルード (SSI)

<!--# include virtual="/fragments/product?id=123" -->

3.2 エッジサイド インクルード (ESI)

<esi:include src="https://product.service/fragment/header" />

使用例: SEO と TTFB が重要な場合の、コンテンツの多いページ。


4. 意思決定マトリックス

戦略独立パフォーマンス複雑さ最適な用途
NPMパッケージ❌ 低い✅ ベスト低い共有ライブラリ
iフレーム✅ 高❌ 悪い低いレガシー組み込み
Web コンポーネント✅ 高✅ 良い中マルチフレームワーク
JS の統合✅ 高⚠️ わかりました中単純なケース
モジュールフェデレーション✅ 高✅ 良い中ほとんどのプロジェクト
SSI/ESI✅ 高✅ 素晴らしい TTFB高コンテンツ サイト

概要

  • ビルド時間 (npm): シンプルですが、独立したデプロイメントはありません
  • モジュールフェデレーション: 同じフレームワークの最適なバランス — ⭐推奨
  • Web コンポーネント: マルチフレームワークに最適
  • SSI/ESI: サーバーレンダリングのコンテンツサイトに最適

次の記事: レッスン 12: Webpack モジュール フェデレーションと Vite — 詳細