Table of Contents
導入事例
Microfrontend アーキテクチャは、フロントエンド アプリケーションを小さく、独立してデプロイ可能なモジュールに分解します。このモジュール性は、共有された状態、構成、コミュニケーションを境界線で管理するチャレンジを紹介します。シングルトンパターンは、クラスまたはモジュールが 1 つのインスタンスしか 1 つしかなく、単一のアクセスポイントを提供することを保証することで、制御されたソリューションを提供します。ただし、このパターンをマイクロフロントエンドのコンテキストで適用することで、緊密なカップリング、一貫性のある状態、ライフサイクルの問題を回避できます。この記事では、シングルトンを使用して、各チームを効果的にサポートするという利点を集中的に理解できる限りの達成できる限りの達成を説明します。
マイクロフロントエンドのシングルトンは異なるのは何ですか?
単一ページアプリケーションでは、シングルトンはグローバルで簡単に実装できます。マイクロフロントエンドの設定では、各モジュールは独立して構築、テスト、およびデプロイされる場合があります。同じアプリケーションは、独自のJavaScriptバンドルで、異なる起源から複数のマイクロフロントエンドをロードできます。この環境は、モジュールが明示的に設定されていない限り、古典的なシングルトンパターンを複雑にします。マイクロフロントエンドの真のシングルトンは、通常、共有されたシェルまたはWebサイトを介して、または共有されたイベントとして、またはWebアプリケーションを経由して、共有されるように設定されたモジュールを使用することができます。
共有シングルトンの一般的な使用例には以下が含まれます。
- [] 設定と機能フラグ[ - マイクロフロントエンドが動作を決定するために相談する単一のオブジェクト。
- []認証トークン[]] - ユーザーの資格情報と有効期限の1つの真実のソース。
- []クロスモジュールイベントバス - 直接カップリングを防止するパブ/サブ機構。
- [ 管理ストア] – モジュールの共有の集中管理ストア(例、ReduxまたはZustand)。
- [ローカリゼーションと国際化 - 単一のローカリゼーションオブジェクトと翻訳辞書。
適切に実装すると、単調で一貫性が確保され、冗長な初期化が削減されます。誤った場合、カプセル化を破り、悪夢をデバッグする隠れたグローバルになります。
シングルトンの実装のためのコアベストプラクティス
1. モジュールの規模およびBuild-Timeの共有を使用して下さい
Webpack 5 のモジュール フェデレーションのようなモダンビルドツールは、チームが共有の依存関係を指定できるようにします。ライブラリ(シングルトンサービスのような)を共有モジュールとしてマークすることで、シェルは一度に読み込まれ、すべてのマイクロフロントエンドに同じインスタンスを供給することができます。このアプローチは、実行時に 1 つのインスタンスだけが存在することを保証しながら、グローバルスコープを汚染することを避けます。
例えば、共有モジュールから工場機能を露出します。
[]]
すると、このモジュールはフェデレーション設定で共有されます。[をインポートするすべてのマイクロフロントエンドは、ランタイムで管理された同じインスタンスを受け取ります。
2. 趣味の怠惰な初期化
アプリケーションが読み込まれるときに単一トンを作成することを熱心に活用する microfrontend がマウントしないようにメモリを無駄にすることができます。 怠惰な初期化を実行: リクエストした時にのみ、単トンを作成します。 このパターンは、テストのセットアップ中にシングルトンがリセットまたは置換できるため、テストのシンプルになります。 上記のようにキャッシュ変数の check-and-create アプローチを使用して、または非同期初期化(例: API から fetching)の ]]を使用します。
3.グローバルアクセス制限
モジュールフェデレーションでも、アクセスの容易さのために、シングルトンをに配置するのが魅力的です。 その衝動に抵抗します。 グローバル変数は、命名衝突を作成し、テストを難しにコードを行ない、マイクロフロントエンド分離の原則に違反します。 代わりに、モジュールのインポートまたは依存注入を使用します。 ブラウザのグローバルスコープを使用する必要がある場合は、シングルトンを慎重に名前空間 (例えば、 ) とそれを明確に文書化します。
4. ライフサイクルを明示的に管理
マイクロフロントエンドは、動的に追加、削除、および再初期化することができます。 ユーザーが逃げ、戻ってくると、状態をキャッシュするシングルトンがスタントされることがあります。 ライフサイクルインターフェイスを実行します。
- 初期化 - 最初に必要なときに怠惰な作成。
- []Reset] - キャッシュされた状態をクリアする方法、マイクロフロントエンドのアンマウントまたはユーザーログアウトでトリガーしました。
- [Disposal] – シングルトンが保持するイベントリスナーやタイマーをクリーンアップしてメモリリークを回避します。
例えば、認証単調は、ユーザトークンをクリアし、加入者に通知するメソッドを明示すべきである。
5. 適当なところ糸の安全を保障して下さい
WebワーカーやSharedArrayBufferに依存するMicrofrontendsは、レース条件から守る必要があります。 メインスレッドのJavaScriptは単一スレッドですが、非同期コードはレースハザードを生成することができます。 約束、ミュートア(]のようなライブラリ)、またはシングルトンが複数のモジュールから同時アクセスされている場合、アトミック操作を使用して、それは迅速な成功にそれを呼び出します。 ほとんどのブラウザアプリケーションでは、これはNodeやワーカーの作業環境に問題の少ないです。
6. インフラ上の懸念へのシングルトンを制限する
共有リソースがシングルトンを必要としません。 1 つを作成する前に、このリソースを真に単一のインスタンスでなければなりませんか? 複数のコピーが、調和せずに共存できますか? シングルトンは、アプリケーション固有の状態ではなく、インフラストラクチャレベルの懸念(ログ、構成、ルーティング)に最適です。 単行を過剰に使用すると、すべてのマイクロフロントエンドが依存する「対象」が、マイクロフロントエンドが目的とする独立したデプロイ可能性を弱まっています。
一般的な落札とテムを避ける方法
隠された依存関係と試験の難易度
インポートを介してアクセスできるシングルトンは、暗黙の依存性を作成します。隔離でマイクロフロントエンドをテストするとき、シングルトンの状態はテスト間で引き出すことができます。シングルトンがモックに交換できるようにすることで緩和します。 または [] を露出し、開発/テストでのみ使用し、環境チェックでそれをガードします。また、各マイクロフロントエンドが完全にシングルトンをコントロールできるように、依存注射を使用して、テストをシングルトンを完全に制御できます。
モジュールの分離を壊すこと
マイクロフロントエンドは独立して失敗することができるようにする必要があります。 シングルトンがクラッシュしたり、無効な状態を保持している場合は、それに依存するすべてのモジュールをダウンさせることができます。 シングルトンのアクセスをトライキャッチでラップすることでレジリエンスを構築し、フォールバック動作を提供します。 例えば、コンフィグシングルトンがロードできなかった場合は、各マイクロフロントエンドはハードコードされたデフォルトに戻すことができます。
負荷の下のスケーラビリティ
シングルトンが集中バス(例:グローバルイベントエミッタ)を介してアクセスされると、高周波イベントはボトルネックを作成できます。 シングルトンがパフォーマンスホットスポットになるのを防ぐには、回転、減衰、またはワーカースレッドを使用します。 単純なシングルトンではなく、複雑なクロスモジュール通信のためのCQRSやイベントソーシングなどのパターンを使用して検討してください。
共有依存関係のバージョンのミスマッチ
2つのマイクロフロントエンドがシングルトンとして使用される同じライブラリの異なるバージョンを必要とする場合、モジュールフェデレーションは、一般的なバージョンにダウングレードまたはアップグレードできます。 これはしばしば安全ですが、ライブラリのAPIが変更された場合に破棄することができます。 ピンは、バージョン範囲にシングルトンの依存性を共有し、生産をミラーリングするステージング環境で徹底的にテストします。
シングルトンパターンへの代替
共有リソースがシングルトンパターンを必要としません。 古典的なシングルトンがあまりにも硬さを感じるときに、これらの選択肢を評価します。
- [コンテキストプロバイダ] - React microfrontendsでは、コンフィギュレーションやプロパティをプロップを介して渡するコンテキストでシェルをラップします。 各マイクロフロントエンドは、グローバルに依存することなくコンテキストを消費することができます。
- []カスタムイベントとメッセージの渡 - または軽量イベントバスを使用します。 これはモジュールを分離し、必要に応じて複数のインスタンスを共存させることができます。
- [] スコープインスタンス の反応ストア – マイクロフロントエンドごとに別のストアインスタンスを作成しますが、軽量ブリッジを介して重要な状態を同期します。 これは、共有されたデータを有効にしながら、一対モジュール分離を与えます。
- [ 依存注入フレームワーク[ - InversifyJSやカスタムDIコンテナなどのフレームワークは、シェルやマイクロフロントエンドサブツリーにスコープをスコープとして表示できるコンテナレベルで単元スコープを登録することができます。
コンテンツ
シングルトンパターンは、慎重に適用されたときにマイクロフロントエンドアーキテクチャで貴重なツールを残します。 それは、構成、認証、およびロギングなどの非揮発性サービスのための真実の単一のソースを提供することで優れています。 モジュールベースの共有、レイジー初期化、明示的なライフサイクル管理、および管理されたアクセスを活用することで、チームは、グローバル状態とタイトなカップリングの罠に陥ることなく、シングルトンの利点を享受することができます。 常に、これらの方法が、必要に応じて、マイクロフロントの原則と組み合わせて、微分スケールの異なる方法が維持されると、これらの方法が、これらの方法が、これらに限定される必要があります。