MFC (Module Federation) là gì? Khái niệm và bản chất

MFC (Module Federation) là một kiến trúc plugin do Webpack giới thiệu từ phiên bản 5, cho phép một ứng dụng JavaScript có thể tải mã nguồn (code) từ một ứng dụng khác một cách linh hoạt trong thời gian chạy (runtime). Về bản chất, Module Federation giải quyết bài toán phân tách ứng dụng thành các micro-frontend một cách liền mạch, không cần phải build toàn bộ dự án thành một khối duy nhất. Thay vì phải xuất bản và cài đặt các package qua npm, MFC cho phép các ứng dụng “host” (chủ) và “remote” (khách) chia sẻ trực tiếp các module với nhau. Điều này có nghĩa là một phần giao diện của ứng dụng A có thể được render trực tiếp từ ứng dụng B mà không cần phải đồng bộ phiên bản thông qua registry. Kiến trúc này đặc biệt hữu ích cho các tập đoàn lớn với nhiều đội ngũ phát triển độc lập, mỗi đội phụ trách một phân hệ riêng nhưng vẫn cần thống nhất về giao diện và logic dùng chung.
HMR (Hot Module Replacement) là gì? Khái niệm cốt lõi
HMR (Hot Module Replacement) là một tính năng có trong các bundler như Webpack, Vite hay Parcel, cho phép cập nhật mã nguồn trong trình duyệt ngay lập tức mà không cần tải lại toàn bộ trang web (full reload). Khi bạn sửa một file CSS hoặc một component React, HMR sẽ chỉ thay thế đúng module đó trong runtime, giữ nguyên trạng thái (state) hiện tại của ứng dụng. Cơ chế hoạt động của HMR dựa trên việc thiết lập một kết nối WebSocket giữa trình duyệt và dev server. Khi file thay đổi, server sẽ gửi tín hiệu cập nhật, trình duyệt sẽ nhận diện module bị ảnh hưởng và thực hiện các hàm callback (như `module.hot.accept`) để thay thế nó. Điều này tạo ra trải nghiệm “phát triển tức thì” (instant feedback), giúp lập trình viên thấy được kết quả chỉnh sửa trong vài mili giây mà không mất đi dữ liệu đã nhập trên form hay vị trí cuộn trang.
So sánh chi tiết MFC vs HMR: Sự khác biệt về mục đích và cơ chế

Để hiểu rõ MFC vs HMR, trước tiên cần khẳng định rằng đây là hai công nghệ phục vụ hai mục đích hoàn toàn khác nhau, không phải là đối thủ trực tiếp của nhau. HMR tập trung vào môi trường phát triển (development), trong khi MFC tập trung vào kiến trúc sản phẩm (production architecture). | Tiêu chí | MFC (Module Federation) | HMR (Hot Module Replacement) |
|:— |:— |:— |
| Mục đích chính | Chia sẻ mã nguồn giữa các ứng dụng độc lập (Micro-frontend) | Tăng tốc vòng lặp phát triển (Dev Loop) |
| Môi trường hoạt động | Production & Development | Chủ yếu trong Development |
| Cơ chế hoạt động | Tải module từ xa qua mạng (HTTP) | Cập nhật module nội bộ qua WebSocket |
| Phạm vi ảnh hưởng | Toàn bộ kiến trúc ứng dụng, nhiều team | Một file hoặc một component cụ thể |
| Yêu cầu cấu hình | Phức tạp, cần khai báo exposes và remotes | Đơn giản, thường được bật sẵn bởi framework |
| Tác động đến State | Không liên quan trực tiếp, tạo instance mới | Giữ nguyên state của component không thay đổi |
| Ứng dụng thực tế | Hệ thống e-commerce lớn, dashboard tổng hợp | Mọi dự án frontend hiện đại |
Phân tích sâu về cơ chế hoạt động của MFC
Module Federation hoạt động dựa trên nguyên lý “biên dịch động” (dynamic compilation). Ứng dụng host sẽ khai báo danh sách các remote module mà nó cần. Khi người dùng truy cập, host sẽ tải xuống một file manifest (thường là `remoteEntry.js`) từ remote server. File này chứa thông tin về các module có sẵn và cách chúng được export. Sau đó, host có thể import các component này như một dependency thông thường, nhưng thực chất chúng được tải qua mạng. Điểm mạnh của MFC là khả năng chia sẻ dependency dùng chung (shared dependencies). Ví dụ, nếu cả host và remote đều dùng React, Khi nào nên sử dụng HMR?
Việc lựa chọn giữa MFC vs HMR không phải là câu hỏi “hoặc là hoặc”, mà là “kết hợp cả hai”. Tuy nhiên, bạn cần xác định rõ ưu tiên của dự án.
Trường hợp nên ưu tiên áp dụng MFC
Bạn nên sử dụng Module Federation khi dự án của bạn có quy mô lớn, được chia thành nhiều team phát triển độc lập. Ví dụ, một trang thương mại điện tử có team chuyên về trang chủ, team chuyên về trang sản phẩm, team chuyên về giỏ hàng. Mỗi team có thể phát triển và deploy độc lập, sau đó host tổng hợp lại. Ngoài ra, nếu bạn có nhu cầu chia sẻ các component dùng chung (như header, footer, hệ thống đăng nhập) giữa nhiều ứng dụng khác nhau (web, mobile web, admin portal), MFC là giải pháp tối ưu. Nó giúp giảm thiểu sự trùng lặp code và đảm bảo tính nhất quán về mặt thương hiệu.
Trường hợp nên ưu tiên áp dụng HMR
HMR là tiêu chuẩn bắt buộc cho mọi dự án frontend hiện đại, từ nhỏ đến lớn. Nếu bạn đang sử dụng Create React App, Next.js, Vite hay bất kỳ framework nào, HMR đã được tích hợp sẵn. Bạn không cần phải suy nghĩ về việc “có nên dùng hay không”, mà chỉ cần tận dụng tối đa nó. Trong các dự án nhỏ hoặc prototype, HMR giúp bạn nhanh chóng thử nghiệm ý tưởng.
Có, MFC và HMR hoàn toàn có thể hoạt động song song. Trong quá trình phát triển, HMR giúp bạn cập nhật nhanh chóng các module trong từng ứng dụng. Khi bạn cấu hình MFC, HMR vẫn hoạt động bình thường trên các component cục bộ. Tuy nhiên, khi bạn thay đổi cấu trúc `exposes` hoặc `remotes`, bạn cần restart lại dev server để áp dụng thay đổi.
HMR có phải là một phần của MFC không?
Không, HMR và MFC là hai khái niệm hoàn toàn độc lập. HMR là tính năng của bundler (Webpack, Vite) giúp cập nhật module trong thời gian thực. MFC là một plugin của Webpack giúp chia sẻ module giữa các ứng dụng khác nhau.
MFC có lợi thế hơn trong việc tối ưu hiệu suất production vì nó cho phép tải theo nhu cầu (lazy-load) và chia sẻ dependency. HMR không có tác động đến production vì nó bị loại bỏ trong quá trình build. Tuy nhiên, MFC cũng có thể gây ra chi phí network overhead nếu không được cấu hình tối ưu.
Tôi có thể sử dụng MFC với Vite thay vì Webpack không?
Có, hiện tại đã có plugin `@originjs/vite-plugin-federation` cho phép sử dụng Module Federation với Vite. Tuy nhiên, hệ sinh thái và tài liệu vẫn chưa phong phú bằng Webpack. Nếu bạn đang bắt đầu một dự án mới và muốn sử dụng MFC, Webpack vẫn là lựa chọn an toàn và ổn định nhất.
Làm thế nào để debug lỗi khi sử dụng MFC?
Để debug lỗi MFC, bạn nên sử dụng các công cụ như Chrome DevTools để kiểm tra network requests, xem các file `remoteEntry.js` có được tải thành công hay không. Ngoài ra, hãy bật source map trong cấu hình webpack để có thể xem mã nguồn gốc của remote. Sử dụng Error Boundary trong React để bắt lỗi từ các component remote và hiển thị thông báo thân thiện.
Kết luận: Lựa chọn thông minh giữa MFC và HMR

Sau khi phân tích chi tiết MFC vs HMR, có thể thấy rằng đây không phải là một cuộc cạnh tranh trực tiếp mà là hai công cụ bổ trợ cho nhau trong vòng đời phát triển phần mềm. HMR là “người hùng thầm lặng” giúp tăng tốc độ phát triển hàng ngày, trong khi MFC là “kiến trúc sư” xây dựng nền tảng vững chắc cho các hệ thống lớn. Đối với hầu hết các dự án, bạn nên bắt đầu với HMR và kiến trúc monolith. Khi dự án phát triển, số lượng thành viên tăng lên và nhu cầu deploy độc lập xuất hiện, hãy cân nhắc chuyển dần sang MFC. Việc áp dụng MFC quá sớm có thể tạo ra sự phức tạp không đáng có, trong khi bỏ qua HMR sẽ khiến năng suất của bạn giảm sút nghiêm trọng. Hãy luôn đặt nhu cầu thực tế của dự án lên hàng đầu, lắng nghe phản hồi từ đội ngũ phát triển và đo lường hiệu quả sau mỗi thay đổi kiến trúc. Sự kết hợp hài hòa giữa HMR cho trải nghiệm phát triển và MFC cho khả năng mở rộng sẽ là chìa khóa thành công cho mọi sản phẩm web hiện đại.







