สถานะร่วมและการกำหนดเส้นทางระหว่าง MFE
แบ่งปันบัสอีเวนต์ส่วนกลางหรือ Context ระหว่าง micro-frontend และประสานการกำหนดเส้นทางฝั่งไคลเอ็นต์
สถานะร่วมและการกำหนดเส้นทางระหว่าง MFE เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
ความท้าทายในการแชร์สถานะ
ไมโครฟรอนต์เอนด์ที่อยู่ในบันเดิลต่างกันไม่สามารถแชร์สถานะหรือคอนเท็กซ์ของ React โดยตรงได้ จึงต้องใช้กลยุทธ์ทางเลือก ได้แก่ เหตุการณ์กำหนดเอง ที่เก็บสถานะที่ใช้ร่วมกัน URL หรือบัสเหตุการณ์แบบเผยแพร่/สมัครรับ
เหตุการณ์กำหนดเองของเบราว์เซอร์
ใช้ API CustomEvent ของเบราว์เซอร์เป็นบัสเหตุการณ์แบบง่ายระหว่างไมโครฟรอนต์เอนด์ โดยไม่ทำให้ทั้งสองส่วนเชื่อมโยงกันแน่นเกินไป
// Remote emits:
window.dispatchEvent(new CustomEvent('cart:add', { detail: { productId: '123' } }));
// Host listens:
useEffect(() => {
const handler = (e: CustomEvent) => addToCart(e.detail.productId);
window.addEventListener('cart:add', handler);
return () => window.removeEventListener('cart:add', handler);
}, []);ไลบรารีบัสเหตุการณ์ที่ใช้ร่วมกัน
ไลบรารีเผยแพร่/สมัครรับขนาดเล็กที่แชร์ผ่าน Module Federation หรือซิงเกิลตันที่โหลดจาก URL จะมอบบัสเหตุการณ์ที่มีชนิดข้อมูลและเข้าถึงได้จาก MFE ทั้งหมด
// Singleton event bus
const bus = {
listeners: new Map<string, Function[]>(),
emit(event: string, data: unknown) {
this.listeners.get(event)?.forEach(fn => fn(data));
},
on(event: string, fn: Function) {
if (!this.listeners.has(event)) this.listeners.set(event, []);
this.listeners.get(event)!.push(fn);
return () => this.off(event, fn);
},
off(event: string, fn: Function) {
const list = this.listeners.get(event) || [];
this.listeners.set(event, list.filter(f => f !== fn));
},
};
export default bus;URL ในฐานะสถานะที่ใช้ร่วมกัน
URL (พาธและพารามิเตอร์คำค้น) เป็นข้อมูลที่ MFE ทั้งหมดใช้ร่วมกันโดยธรรมชาติ ใช้ URL สำหรับสถานะการนำทาง เช่น รายการที่เลือก แท็บที่ใช้งานอยู่ หรือค่าตัวกรอง
// Remote reads from URL:
const params = new URLSearchParams(window.location.search);
const productId = params.get('product');
// Remote navigates via history API (or exposes a navigate callback from host):
window.history.pushState({}, '', '/products?product=456');สถาปัตยกรรมการกำหนดเส้นทาง
โดยทั่วไป แอปเชลล์/โฮสต์จะเป็นเจ้าของเราเตอร์ระดับบนสุด ไมโครฟรอนต์เอนด์รีโมตจะได้รับพาธปัจจุบันและโคลแบ็ก navigate ผ่านพร็อพ
// Host passes routing control to remote:
<RemoteProductsApp
basepath="/products"
navigate={(path) => router.push(path)}
/>
// Remote uses basepath for its internal router:
<BrowserRouter basename={basepath}>
<Routes>...</Routes>
</BrowserRouter>React Router กับ Module Federation
MFE แต่ละรายการสามารถเรียกใช้ React Router ของตนเองโดยจำกัดขอบเขตไว้ที่ basepath ของตน เราเตอร์ของโฮสต์จัดการการนำทางระดับบนสุด ส่วนรีโมตแต่ละรายการจัดการการนำทางย่อยอย่างเป็นอิสระ
// Remote App component:
export function ProductsApp({ basepath = '/products' }) {
return (
<BrowserRouter basename={basepath}>
<Routes>
<Route path="/" element={<ProductList />} />
<Route path="/:id" element={<ProductDetail />} />
</Routes>
</BrowserRouter>
);
}สถานะการยืนยันตัวตนที่ใช้ร่วมกัน
โดยทั่วไปเชลล์จะเป็นเจ้าของสถานะการยืนยันตัวตน (ผู้ใช้และโทเค็น) แล้วส่งต่อไปยังรีโมตผ่านพร็อพ หรือเปิดเผยผ่านที่เก็บสถานะแบบซิงเกิลตันที่ใช้ร่วมกัน
// Host provides auth via props:
<RemoteCheckout
userId={currentUser.id}
token={accessToken}
onLogout={handleLogout}
/>Zustand ในฐานะที่เก็บสถานะร่วมกัน
เมื่อแชร์ที่เก็บสถานะของ Zustand ผ่าน Module Federation (ในรูปแบบซิงเกิลตัน) MFE ทั้งหมดจะอ่านข้อมูลจากอินสแตนซ์ที่เก็บสถานะเดียวกันในหน่วยความจำ
// shared/store.ts (exposed as singleton)
import { create } from 'zustand';
export const useCartStore = create(set => ({
items: [],
addItem: (item) => set(state => ({ items: [...state.items, item] })),
}));
// Configured as singleton in MF shared configรูปแบบการสื่อสารข้าม MFE ที่ควรหลีกเลี่ยง
ควรหลีกเลี่ยงสิ่งต่อไปนี้: โซ่โคลแบ็กที่ซ้อนกันลึก การแชร์สถานะภายในคอมโพเนนต์ หรือการผูกแน่นกับ API ภายในของ MFE อื่น ให้การสื่อสารใช้เหตุการณ์ระดับกว้างและสัญญาสาธารณะ
การทดสอบการโต้ตอบข้าม MFE
ทดสอบสัญญาเหตุการณ์ (ชื่อเหตุการณ์และรูปแบบข้อมูล) แยกจากส่วนติดต่อผู้ใช้ ใช้การทดสอบสัญญาเพื่อตรวจสอบว่าผู้ผลิตและผู้บริโภคเห็นพ้องกันเกี่ยวกับสคีมาของเหตุการณ์
ตรวจสอบอย่างรวดเร็ว
วิธีที่ง่ายที่สุดในการแชร์สถานะการนำทางหรือค่าตัวกรองระหว่างไมโครฟรอนต์เอนด์หลายรายการโดยไม่ผูกแน่นเข้าด้วยกันคืออะไร
สรุปทบทวน
แชร์สถานะระหว่าง MFE ผ่านเหตุการณ์กำหนดเอง บัสเหตุการณ์แบบซิงเกิลตัน URL หรือที่เก็บสถานะที่ใช้ร่วมกัน (Zustand/ซิงเกิลตัน) เชลล์เป็นเจ้าของเราเตอร์ระดับบนสุดและส่ง basepath กับ navigate ไปยังรีโมต ควรรักษาสัญญาข้าม MFE ให้มีขอบเขตกว้างและมีชนิดข้อมูลชัดเจน
คำถามที่พบบ่อย
บทเรียน “สถานะร่วมและการกำหนดเส้นทางระหว่าง MFE” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สถานะร่วมและการกำหนดเส้นทางระหว่าง MFE” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สถานะร่วมและการกำหนดเส้นทางระหว่าง MFE”
แบ่งปันบัสอีเวนต์ส่วนกลางหรือ Context ระหว่าง micro-frontend และประสานการกำหนดเส้นทางฝั่งไคลเอ็นต์ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “สถานะร่วมและการกำหนดเส้นทางระหว่าง MFE” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แนวคิด Micro-Frontend และข้อแลกเปลี่ยน
- Module Federation ด้วย Webpack 5
- สถานะร่วมและการกำหนดเส้นทางระหว่าง MFE
- การปรับใช้แยกอิสระและ CI Pipelines สำหรับ MFE