Skip to content

マイクロフロントエンド

公開日:December 8, 2024更新日:December 8, 2024
ReactTypeScriptCoding📄

マイクロフロントエンドは、モジュール化と分散開発を可能にするアーキテクチャで、特に大規模なアプリケーション開発において有効です。本章では、その基礎と利点、Reactを用いた実装方法、型を跨いだ連携のベストプラクティスについて解説します。

1. マイクロフロントエンドの基礎と利点

マイクロフロントエンドとは

  • マイクロサービスのフロントエンド版。
  • アプリケーションを小さな独立したモジュールに分割し、それぞれが独立してデプロイ可能。

利点

  1. 独立性:

    • 各チームが特定のモジュールに集中して作業できる。
    • 異なる技術スタックを同一アプリ内で併用可能。
  2. スケーラビリティ:

    • 大規模アプリケーションを分割し、スケール可能な開発体制を実現。
  3. 柔軟なデプロイ:

    • モジュール単位での更新が可能。全体を再デプロイする必要がない。
  4. 故障の分離:

    • 1つのモジュールが問題を起こしても他の部分には影響しない。

2. Reactでの実装方法 (Module Federationなど)

Module Federationとは

  • 概要:
    • Webpack 5で導入された仕組みで、複数のプロジェクト間でコードを共有可能。
    • ランタイムで他のアプリケーションからモジュールを動的にインポート。

実装例

設定手順

  1. Webpackの設定:

    • 各プロジェクトでModule Federation Pluginを使用。
    javascript
    const { ModuleFederationPlugin } = require("webpack").container;
    
    module.exports = {
      mode: "development",
      plugins: [
        new ModuleFederationPlugin({
          name: "app1",
          filename: "remoteEntry.js",
          exposes: {
            "./Button": "./src/Button",
          },
          shared: { react: { singleton: true }, "react-dom": { singleton: true } },
        }),
      ],
    };
  2. ホストアプリケーションでの使用:

    • 他のアプリからモジュールを動的に読み込む。
    javascript
    const { ModuleFederationPlugin } = require("webpack").container;
    
    module.exports = {
      mode: "development",
      plugins: [
        new ModuleFederationPlugin({
          name: "host",
          remotes: {
            app1: "app1@http://localhost:3001/remoteEntry.js",
          },
        }),
      ],
    };
  3. 使用例:

    tsx
    import React from "react";
    
    const Button = React.lazy(() => import("app1/Button"));
    
    const App = () => (
      <React.Suspense fallback="Loading...">
        <Button />
      </React.Suspense>
    );
    
    export default App;

3. 型を跨いだ連携のベストプラクティス

型安全性の確保

  • 複数プロジェクト間で型を共有することが重要。

方法1: 型定義パッケージを共有

  • 手順:

    • 共通の型を別のNPMパッケージとして公開。
    • 各プロジェクトでインストールして使用。
    typescript
    // types/index.ts
    export interface ButtonProps {
      label: string;
      onClick: () => void;
    }

方法2: Module Federationと型の統合

  • 手順:

    • 型定義ファイルをModule Federationでエクスポート。
    javascript
    exposes: {
      "./types": "./src/types",
    },
    • ホストアプリケーションでインポートして利用。
    typescript
    import { ButtonProps } from "app1/types";
    
    const props: ButtonProps = { label: "Click Me", onClick: () => {} };

ツールの活用

  • TypeScript Project References:

    • プロジェクト間で型を効率的に参照。
    json
    {
      "compilerOptions": {
        "composite": true
      },
      "references": [
        { "path": "../shared-types" }
      ]
    }

マイクロフロントエンドは、モジュール化された柔軟なアプリケーション開発を可能にします。本章で紹介した手法を活用し、スケーラブルで型安全なマイクロフロントエンドアーキテクチャを構築しましょう。