- vừa được xem lúc

Từ Zero đến Principal Frontend Engineer (P1: Micro Frontend)

0 0 4

Người đăng: Huỳnh Trọng Thoại

Theo Viblo Asia

Giới thiệu

Micro-frontend là một kiến trúc phần mềm giúp chia nhỏ ứng dụng frontend monolith thành các phần độc lập, có thể triển khai riêng lẻ. Lấy cảm hứng từ microservices, phương pháp này cho phép các team phát triển độc lập, linh hoạt hơn.

Trong bài viết này, chúng ta sẽ tìm hiểu:

  • Nguyên tắc cốt lõi của micro-frontend
  • Lợi ích và thách thức
  • Các chiến lược triển khai phổ biến
  • Kinh nghiệm thực tế khi áp dụng

Dù bạn là kiến trúc sư, team lead hay developer, hiểu rõ micro-frontend sẽ giúp bạn xây dựng ứng dụng web dễ mở rộng và bảo trì hơn.


Nguyên tắc Cốt lõi của Micro-Frontend

Micro-frontend tuân theo các nguyên tắc sau:

  1. Đa công nghệ – Mỗi team có thể chọn stack riêng (React, Vue, Angular, v.v.).
  2. Codebase độc lập – Mỗi micro-frontend có repo và CI/CD pipeline riêng.
  3. Triển khai độc lập – Thay đổi có thể deploy mà không ảnh hưởng đến phần khác.
  4. Tự chủ team – Mỗi team tự quản lý toàn bộ vòng đời sản phẩm.
  5. Giao tiếp qua trình duyệt – Ưu tiên sử dụng Web Components, Custom Events thay vì giải pháp tùy chỉnh.

Lợi ích của Micro-Frontend

Khả năng mở rộng – Nhiều team làm việc song song mà không xung đột.
Dễ bảo trì – Codebase nhỏ giúp debug và cập nhật dễ dàng hơn.
Release nhanh – Triển khai độc lập giúp đẩy nhanh tốc độ phát triển.
Linh hoạt công nghệ – Không bị khóa vào một framework duy nhất.
Khả năng chịu lỗi – Lỗi ở một micro-frontend không làm sập cả ứng dụng.


Thách thức khi Áp dụng

Độ phức tạp tăng – Quản lý nhiều repo, build pipeline đòi hỏi công sức.
Ảnh hưởng hiệu năng – Tải nhiều bundle có thể làm chậm trang.
Xử lý nghiệp vụ chung – Authentication, theming, state management cần được đồng bộ.
Rủi ro tích hợp – Đảm bảo trải nghiệm người dùng mượt mà giữa các thành phần độc lập.


Các Chiến lược Triển khai Micro-Frontend

1. Tích hợp tại Build Time (NPM Packages)

  • Mỗi micro-frontend được đóng gói thành NPM package.
  • App chính import chúng lúc build.

Ưu điểm: Đơn giản, hiệu năng tốt (gộp chung một bundle).
Nhược điểm: Liên kết chặt, cần redeploy app chính khi cập nhật.

// package.json của app chính
{ "dependencies": { "product-list": "1.0.0", "shopping-cart": "2.1.0" }
}

2. Tích hợp tại Runtime qua Iframe

  • Mỗi micro-frontend chạy trong một <iframe> riêng.

Ưu điểm: Cách ly tốt, đa công nghệ dễ dàng.
Nhược điểm: UX kém (khó chia sẻ state/styling), khó SEO.

<div> <iframe src="https://product-list.example.com"></iframe> <iframe src="https://cart.example.com"></iframe>
</div>

3. Tích hợp qua Web Components

  • Micro-frontend được xây dựng thành custom elements (<my-component>).

Ưu điểm: Hỗ trợ sẵn bởi trình duyệt, không phụ thuộc framework.
Nhược điểm: Khó chia sẻ state, cần polyfill cho trình duyệt cũ.

// Micro-frontend (dùng LitElement)
@customElement('product-list')
class ProductList extends LitElement { render() { return html`<h2>Danh sách sản phẩm</h2>`; }
}
<!-- App chính -->
<product-list></product-list>

4. Tích hợp qua JavaScript Modules (Module Federation)

  • Webpack 5 Module Federation tải micro-frontend động lúc runtime.

Ưu điểm: Lazy loading, chia sẻ dependencies, linh hoạt.
Nhược điểm: Cấu hình phức tạp, quản lý dependency khó.

// webpack.config.js (Micro-frontend)
new ModuleFederationPlugin({ name: 'productList', filename: 'remoteEntry.js', exposes: { './ProductList': './src/ProductList' }
});
// App chính tải động
const ProductList = await import('productList/ProductList');

5. Edge Side Includes (ESI) – Tích hợp ở CDN

  • CDN ghép các fragment từ micro-frontend khác nhau.

Ưu điểm: Tốc độ cao (cache tại CDN), đơn giản.
Nhược điểm: Chỉ phù hợp nội dung tĩnh, cần CDN hỗ trợ.

<esi:include src="https://product-list.example.com" />

So sánh Các Chiến lược

Chiến lược Tự chủ Team Đa công nghệ Hiệu năng Độ phức tạp
Build-Time (NPM) Thấp Thấp Cao Thấp
Iframe Cao Cao Thấp Thấp
Web Components Trung bình Trung bình Trung bình Trung bình
Module Federation Cao Cao Trung bình Cao
ESI (CDN) Thấp Thấp Cao Thấp

Kinh nghiệm Thực tế khi Áp dụng

🔹 Dùng Design System thống nhất – Đảm bảo giao diện đồng bộ.
🔹 Chuẩn hóa nghiệp vụ chung – Authentication, logging, error handling.
🔹 Tối ưu hiệu năng – Lazy loading, chia sẻ thư viện chung.
🔹 Kiểm soát dependencies – Tránh xung đột phiên bản.
🔹 Test end-to-end – Đảm bảo tích hợp mượt mà giữa các micro-frontend.


Kết luận

Micro-frontend giúp xây dựng ứng dụng web lớn dễ dàng hơn, nhưng cần cân nhắc kỹ về cơ cấu team, hiệu năng và hạ tầng.

Hướng phát triển tiếp theo:

  • Thử nghiệm Module Federation (Webpack 5).
  • Áp dụng Web Components để không phụ thuộc framework.
  • Kết hợp serverless frontend để tăng tính linh hoạt.

Khi áp dụng đúng cách, micro-frontend giúp tăng tốc phát triển, mở rộng dễ dàng và cải thiện trải nghiệm team. 🚀


Bạn muốn tìm hiểu sâu hơn về chiến lược nào? Hãy để lại bình luận bên dưới! 👇

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thủ thuật nhỏ để căn chỉnh image với object-fit

Chào các bạn,. Có lẽ trong hành trình code của các bạn thì không ít lần gặp vấn đề méo ảnh do fix cứng cả width, height của ảnh nhỉ? Hoặc kể cả khi bạn set value cho 1 thuộc tính weigth hoặc height còn thuộc tính còn lại để auto thì nhiều lúc ảnh cũng không được hiển thị toàn vẹn cho lắm.

0 0 54

- vừa được xem lúc

Tìm hiểu về CSS framework - Bulma

Mở đầu:. Mấy bữa nay đang lướt web thấy có giới thiệu framework bulma này, được mọi người giới thiệu gọn nhẹ và dễ sử dụng, nên mình mới tìm hiểu thử và hôm nay xin viết 1 bài viết giới thiệu sơ qua với các bạn.

0 0 39

- vừa được xem lúc

Một số mẹo vặt "hay ho" của ES6 có thể bạn chưa biết - Phần 4

Xin chào, ở 3 bài trước của series "Một số mẹo vặt "hay ho" của ES6", mình đã chia sẻ 1 số tips/tricks nhỏ với ES6, hy vọng ít nhiều nó sẽ có ích với các bạn khi áp dụng vào thực tế. Hôm nay, xin mời các bạn theo dõi phần 4 của series này.

0 0 50

- vừa được xem lúc

Tìm hiểu về Jest Mocks Test phía frontend

Giới thiệu. Chắc hẳn không ai phủ nhận rằng UnitTest là 1 phần quan trọng trong giai đoạn phát triển phần mềm, đảm bảo cho code được coverage tránh các bug không mong muốn.

0 0 39

- vừa được xem lúc

Convert từ SVG sang Icon Font như thế nào?

Chào các bạn. Như câu hỏi trên title của bài viết, hôm nay mình sẽ hướng dẫn các bạn cách convert 1 file svg 1 cách khá đơn giản và vô cùng tiện lợi cho các bạn. https://icomoon.io/app/#/select.

0 0 61

- vừa được xem lúc

Một vài thủ thuật làm việc với các dạng layout - Phần 4

. Chào mọi người, cũng đã lâu rồi mình không thấy nhau. Để tiếp tục với series's về các dạng layout hôm nay mình sẽ chia sẻ thêm một trick thú vị nữa về step layout.

0 0 49