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

การกำหนดค่าแอปรีแอ็กต์โฮสต์และรีโมต

ตั้งค่า exposes, remotes และการพึ่งพาที่ใช้ร่วมกันใน webpack.config.js สำหรับโครงโฮสต์และรีโมตรีแอ็กต์สองชุด

การกำหนดค่าแอปรีแอ็กต์โฮสต์และรีโมต เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

webpack.config.js ของรีโมต: ModuleFederationPlugin

แอปพลิเคชันรีโมตเพิ่ม ModuleFederationPlugin ลงในการกำหนดค่า webpack โดยมีคุณสมบัติสำคัญสามรายการ ได้แก่ name (ตัวระบุที่ไม่ซ้ำกัน เช่น "buttonApp"), filename ("remoteEntry.js" — ไฟล์รายการผลลัพธ์) และ exposes (แผนผังจากชื่อสาธารณะไปยังเส้นทางไฟล์ต้นฉบับ)

การเปิดให้ใช้คอมโพเนนต์จากรีโมต

การกำหนดค่า exposes จะจับคู่เส้นทางมอดูลสาธารณะกับไฟล์ภายใน: { './Button': './src/Button' } ซึ่งหมายความว่าโฮสต์สามารถนำเข้า 'buttonApp/Button' และรับคอมโพเนนต์จาก ./src/Button.tsx ได้ คุณสามารถเปิดให้ใช้คอมโพเนนต์ ชุดเครื่องมือ หรือแม้แต่หน้าทั้งหมดได้หลายรายการ

การกำหนดค่ามอดูลที่ใช้ร่วมกันบนรีโมต

คุณสมบัติ shared จะบอก Module Federation ว่าควรใช้มอดูลใดร่วมกันระหว่างโฮสต์กับรีโมตแทนการทำซ้ำ สำหรับ React: shared: { react: { singleton: true, requiredVersion: deps.react }, 'react-dom': { singleton: true } } โดย singleton:true จะป้องกันไม่ให้อินสแตนซ์หลายตัวโหลดพร้อมกัน

webpack.config.js ของโฮสต์: การอ้างอิงรีโมต

การกำหนดค่า ModuleFederationPlugin ของแอปพลิเคชันโฮสต์มีคุณสมบัติ remotes ดังนี้: { buttonApp: 'buttonApp@http://localhost:3001/remoteEntry.js' } คีย์คือเนมสเปซสำหรับการนำเข้า ส่วนค่าคือชื่อรีโมตกับ URL ที่นำมาประกอบกันด้วย @ ซึ่งจะบอก Webpack ว่าต้องดึงรีโมตจากที่ใดขณะทำงาน

การใช้รีโมตใน React

ในโค้ด React ของโฮสต์ ให้นำเข้าคอมโพเนนต์รีโมตด้วยการนำเข้าแบบไดนามิก: const Button = React.lazy(() => import('buttonApp/Button')) เส้นทางการนำเข้าตรงกับเนมสเปซของรีโมตและชื่อมอดูลที่เปิดให้ใช้ React.lazy ทำให้โค้ดของการนำเข้าถูกแยกเป็นส่วนและโหลดแบบไม่พร้อมกัน

การครอบด้วย Suspense

เนื่องจากมอดูลรีโมตโหลดแบบไม่พร้อมกัน จึงควรครอบคอมโพเนนต์รีโมตที่นำเข้าแบบ lazy ด้วยขอบเขต Suspense เสมอ: Suspense fallback=Loading... / โดย fallback จะแสดงระหว่างที่ Module Federation ดึง remoteEntry.js และส่วนย่อยของคอมโพเนนต์จาก URL ของรีโมต

เหตุใดซิงเกิลตันจึงสำคัญ

ฮุกของ React (useState, useContext, useEffect) อาศัยอินสแตนซ์ React ภายในเพียงตัวเดียวเพื่อติดตามสถานะของคอมโพเนนต์ หากทั้งโฮสต์และรีโมตโหลด React ของตนเองคนละชุด ฮุกจะทำให้เกิดข้อผิดพลาด "invalid hook call" singleton:true บังคับให้ทั้งสองส่วนใช้ React อินสแตนซ์เดียวกัน จึงแก้ไขข้อผิดพลาดกลุ่มนี้ได้ทั้งหมด

การแก้ไขข้อขัดแย้งของรุ่น

เมื่อโฮสต์ใช้ react@18.2.0 และรีโมตใช้ react@18.3.0 ขอบเขตที่ใช้ร่วมกันของ Module Federation จะเจรจาว่าควรใช้รุ่นใด เมื่อใช้ singleton:true ร่วมกับ requiredVersion ระบบมักจะเลือกรุ่นที่สูงกว่าเมื่อเข้ากันได้ การตั้งค่า requiredVersion: '>=18.0.0' แทนรุ่นที่ระบุแน่นอนช่วยให้ใช้ช่วงรุ่นที่ยืดหยุ่นได้

TypeScript: การประกาศมอดูล

TypeScript ไม่รู้จักมอดูลรีโมตขณะคอมไพล์ ดังนั้นการนำเข้าอย่าง import('buttonApp/Button') จะทำให้เกิดข้อผิดพลาดด้านชนิดข้อมูลหากไม่มีการประกาศ ให้ใช้ @module-federation/typescript หรือสร้างไฟล์ .d.ts ที่ประกาศชนิดของมอดูลด้วยตนเอง เพื่อให้ตรวจสอบชนิดข้อมูลของพร็อพส์คอมโพเนนต์รีโมตได้อย่างปลอดภัย

การทดสอบการตั้งค่าในเครื่อง

เรียกใช้แอปทั้งสองพร้อมกัน โดยให้รีโมตทำงานที่พอร์ต 3001 และโฮสต์ทำงานที่พอร์ต 3000 เปิดโฮสต์ แล้วรันไทม์ของ Module Federation จะดึง http://localhost:3001/remoteEntry.js ค้นหามอดูล Button ดาวน์โหลดส่วนย่อย และเรนเดอร์มอดูลนั้นภายในแอปโฮสต์เสมือนเป็นคอมโพเนนต์ภายในแอปเอง

การกำหนดค่า URL สำหรับใช้งานจริง

ในสภาพแวดล้อมใช้งานจริง ให้แทนที่ localhost:3001 ด้วย URL ของรีโมตที่นำไปใช้งานแล้ว แนวทางทั่วไปคือใช้ตัวแปรสภาพแวดล้อมสำหรับ URL ของรีโมต เพื่อให้ CI/CD ใส่ URL ที่ถูกต้องตามแต่ละสภาพแวดล้อมได้: buttonApp: 'buttonApp@' + process.env.BUTTON_REMOTE_URL + '/remoteEntry.js'

มอดูลที่ใช้ร่วมกันแบบซิงเกิลตัน

เหตุใดจึงต้องกำหนดให้ React เป็นซิงเกิลตันในการกำหนดค่ามอดูลที่ใช้ร่วมกันของ Module Federation?

สรุปบทเรียน

การกำหนดค่า Module Federation ต้องมี ModuleFederationPlugin ทั้งบนรีโมต (พร้อม name, filename และ exposes) และบนโฮสต์ (พร้อม remotes) ให้ใช้คอมโพเนนต์รีโมตผ่าน React.lazy + การนำเข้าแบบไดนามิกที่ครอบด้วย Suspense ต้องกำหนดให้ React และ React DOM เป็นซิงเกิลตันที่ใช้ร่วมกัน เพื่อป้องกันข้อผิดพลาดของฮุกจากการมีหลายอินสแตนซ์ การประกาศสำหรับ TypeScript และ URL รีโมตผ่านตัวแปรสภาพแวดล้อมจะช่วยให้การตั้งค่าพร้อมใช้งานจริงอย่างสมบูรณ์

คำถามที่พบบ่อย

บทเรียน “การกำหนดค่าแอปรีแอ็กต์โฮสต์และรีโมต” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การกำหนดค่าแอปรีแอ็กต์โฮสต์และรีโมต” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดค่าแอปรีแอ็กต์โฮสต์และรีโมต”

ตั้งค่า exposes, remotes และการพึ่งพาที่ใช้ร่วมกันใน webpack.config.js สำหรับโครงโฮสต์และรีโมตรีแอ็กต์สองชุด คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การกำหนดค่าแอปรีแอ็กต์โฮสต์และรีโมต” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การรวมโมดูล: การนำเข้าแบบไดนามิกขณะทำงาน
  2. การกำหนดค่าแอปรีแอ็กต์โฮสต์และรีโมต
  3. การแชร์สถานะและการกำหนดเส้นทางระหว่างรีโมต
  4. การกำหนดรุ่น การนำไปใช้งาน และการประสานงาน
← กลับไปที่ React Academy