0Pricing
React Academy · บทเรียน

สถานะร่วมและการกำหนดเส้นทางระหว่าง 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แนวคิด Micro-Frontend และข้อแลกเปลี่ยน
  2. Module Federation ด้วย Webpack 5
  3. สถานะร่วมและการกำหนดเส้นทางระหว่าง MFE
  4. การปรับใช้แยกอิสระและ CI Pipelines สำหรับ MFE
← กลับไปที่ React Academy