マイクロフロントエンド間での共有状態
Piniaストアの共有、CustomEventによるイベントバス、共有状態としてのURL
「マイクロフロントエンド間での共有状態」はCoddyKit上の無料Vue Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはVue Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Vue Academyコースには全4レッスンが含まれています。
共有状態の課題
独立したマイクロフロントエンドでも、連携が必要になることがあります。たとえば、あるスライスでのログインによって、別のスライスのヘッダーを更新する必要があります。しかし、強い結合はマイクロフロントエンドの目的に反します。目標は疎結合で意図的な通信です。
暗黙的なグローバル状態を避ける
すべてをwindowや巨大な共有ストアに詰め込むと、モノリスの結合を再現してしまいます。スライス間には明示的で最小限のコントラクトを用意し、チームが独立して進化できるようにします。
通信にCustomEventを使う
ブラウザのCustomEvent APIは、フレームワークに依存しないバスです。1つのマイクロフロントエンドがwindowでイベントを発行し、他のマイクロフロントエンドがリッスンします。共有インポートは必要ありません。
const event = new CustomEvent("cart:add", {
detail: { productId: 42, qty: 1 },
})
window.dispatchEvent(event)イベントをリッスンする
他のスライスはaddEventListenerで購読し、event.detailからペイロードを読み取ります。送信側と受信側はイベント名とデータ形式に合意するだけでよく、両者を疎結合にできます。
window.addEventListener("cart:add", (e) => {
console.log("Added", e.detail.productId)
})Vueでリスナーをクリーンアップする
onMountedでリスナーを登録し、onUnmountedで削除します。これにより、コンポーネントの再マウント時にメモリリークやハンドラーの重複が発生するのを防げます。
import { onMounted, onUnmounted } from "vue"
function onAdd(e) { /* ... */ }
onMounted(() => window.addEventListener("cart:add", onAdd))
onUnmounted(() => window.removeEventListener("cart:add", onAdd))型付きイベントコントラクト
すべてのチームがイベント名とペイロードの形式を把握できるように、イベントをコントラクトとして文書化します。これはマイクロフロントエンド間の公開APIです。
// events contract
// "cart:add" -> { productId: number, qty: number }
// "auth:login" -> { userId: string }
// "auth:logout" -> {}共有状態としてのURL
URLは、ナビゲーションやフィルターの共有ストアとして自然な選択肢です。グローバルで、ブックマークでき、すべてのスライスから読み取れます。アクティブなフィルターやページなど、横断的な状態はクエリパラメーターに入れます。
const params = new URLSearchParams(location.search)
const category = params.get("category") // shared across slicesURL状態の更新
共有するフィルターやナビゲーションの状態は、History APIを使ってURLに書き込みます。これにより、共有しやすく、戻るボタンにも対応できます。すべてのスライスは新しいURLを読み取って反応します。
function setCategory(value) {
const url = new URL(location.href)
url.searchParams.set("category", value)
history.pushState({}, "", url)
}シングルトンPiniaストア
1つのページ内でより豊かな共有状態を扱う場合は、シングルトンPiniaストアが有効です。ただし、フェデレーション全体でPiniaをシングルトンとして共有し、すべてのスライスが同じインスタンスを使う場合に限ります。
// federation config (both sides)
shared: {
pinia: { singleton: true },
vue: { singleton: true },
}共有ストアの利用
Piniaをシングルトンとして共有すると、2つのスライスがインポートしたストアは同じストアインスタンスになります。一方が書き込んだ状態を、もう一方がリアクティブに読み取れます。
// slice A writes
const auth = useAuthStore()
auth.login(user)
// slice B reads the same reactive state
const auth = useAuthStore()
console.log(auth.user)戦略の選択
- CustomEvent — 疎結合でフレームワークに依存しない通知
- URL — ナビゲーション、フィルター、その他の共有・ブックマーク可能な情報
- シングルトンPinia — ページ内の豊かなリアクティブ状態。
singleton: trueが必要
要件を満たす中で、最も疎結合な選択肢を優先します。
クイックチェック
マイクロフロントエンド間の状態共有について、理解度を確認しましょう。
まとめ
マイクロフロントエンド間で状態を共有する方法を学びました:
- 暗黙的なグローバル状態よりも、疎結合で明示的なコントラクトを優先します。
window上のCustomEventとaddEventListenerで、フレームワークに依存しないメッセージングを実現します。onUnmountedでクリーンアップします。- URLには、共有可能なナビゲーションやフィルターの状態を保持します(History API経由のクエリパラメーター)。
- シングルトンPiniaストアで豊かなリアクティブ状態を共有できますが、フェデレーションで
singleton: trueを指定する必要があります。
よくある質問
「マイクロフロントエンド間での共有状態」レッスンは無料ですか?
はい。「マイクロフロントエンド間での共有状態」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Vue Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Vue Academyコースには全4レッスンが含まれています。
「マイクロフロントエンド間での共有状態」で何を学びますか?
Piniaストアの共有、CustomEventによるイベントバス、共有状態としてのURL ブラウザで直接実行するハンズオンコードでVue Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Vue Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのVue Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「マイクロフロントエンド間での共有状態」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このVue Academyレッスンでコードを書いて実行できますか?
はい。すべてのVue Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。