Membedah arsitektur micro-frontends untuk aplikasi berskala tim besar: alasan memecah frontend monolitik, pola integrasi build-time vs runtime, Module Federation, dan trade-off yang jujur — dengan studi kasus pemecahan TokoKita

Semua episode sebelumnya membangun TokoKita sebagai satu aplikasi. Episode 17 menjawab pertanyaan yang muncul saat organisasi membesar: bagaimana memecah frontend raksasa agar banyak tim bisa bekerja dan deploy secara independen? Jawabannya — micro-frontends — adalah salah satu tren arsitektur yang paling matang di 2026.
Penting: micro-frontends bukan teknologi wajib, melainkan keputusan organisasional dengan harga yang nyata. Memahami kapan ia layak — dan kapan monolith justru lebih baik — adalah tanda kedewasaan engineer. Episode ini membahas keduanya.
Saat satu kodebase frontend dilayani banyak tim:
Dampaknya: satu fitur kecil di tim Promo memaksa seluruh tim menunggu satu pipeline deploy, satu build raksasa, dan konflik codebase yang terus-menerus. Micro-frontends memecah hal ini per-tim.
Micro-frontend membagi frontend menjadi beberapa aplikasi kecil yang dimiliki dan di-deploy tim berbeda, lalu dirangkai menjadi satu pengalaman:
| Aspek | Monolith | Micro-frontends |
|---|---|---|
| Pemilikan kode | Satu tim/regu besar | Per tim fitur |
| Deploy | Satu pipeline, sinkron | Independen per aplikasi |
| Teknologi | Satu framework | Per tim boleh beda |
| Build | Satu build raksasa | Build kecil per bagian |
| Pengalaman user | Satu halaman utuh | Tetap satu halaman utuh (dirangkai) |
Yang paling penting: pengguna tidak boleh tahu bahwa halaman sebenarnya terdiri dari beberapa aplikasi.
Ada tiga pendekatan merangkai:
Module Federation (dari Webpack, kini didukung Vite/RSBuild) memungkinkan satu aplikasi memuat kode aplikasi lain pada runtime — seperti import biasa, tetapi lintas aplikasi:
import { federation } from "@module-federation/vite";
export default defineConfig({
plugins: [
federation({
name: "host",
remotes: {
cart: "http://localhost:5002/assets/remoteEntry.js",
},
}),
],
});import { CartApp } from "cart/CartApp";
export function Page() {
return (
<main>
<h1>Katalog</h1>
<CartApp /> {/* dimuat dari remote di runtime */}
</main>
);
}remoteEntry.js bertindak sebagai "menu runtime" yang bisa diperbarui tanpa men-deploy ulang host — inilah kunci independensi tim.
Note
Shared dependencies adalah bagian rumit Module Federation: library seperti React harus "dipinjamkan" (shared) supaya tidak dimuat dua kali dengan state yang terpisah. Konfigurasikan shared dengan hati-hati — kesalahan di sini menyebabkan bug halus yang sulit dilacak.
Micro-frontends tidak gratis. Sebelum memilih, hitung harga ini:
| Keuntungan | Harga |
|---|---|
| Tim deploy independen | Kompleksitas integrasi runtime |
| Skala tim lebih baik | Duplikasi dependency & style |
| Isolasi kegagalan (satu bagian down) | Overhead network & bundle |
| Teknologi per tim | Konsistensi UX lebih sulit dijaga |
Kapan pakai: organisasi sudah puluhan tim, alur deploy satu monolith benar-benar menjadi bottleneck, dan tim punya kapasitas mengelola infrastruktur tambahan.
Kapan jangan: tim kecil/medium, satu aplikasi yang masih bisa dirawat — di sana micro-frontends hanya menambah biaya tanpa manfaat. Seperti kata pepatah arsitektur: solve the problem you actually have.
Simulasi arsitektur jika TokoKita membesar:
toko-kita-host/ → shell: navigasi, routing, layout (Next.js)
app-catalog/ → katalog & pencarian produk (Vite + React)
app-cart/ → keranjang & checkout (Vite + React)
app-account/ → profil & pesanan (Next.js)Aturan yang harus dijaga: shell memegang navigasi & shared design system (episode 25), tiap app mandiri, dan kontrak antar-app adalah data (props/URL/state) — bukan import internal yang sembarangan.
| Kesalahan | Dampak | Perbaikan |
|---|---|---|
| Micro-frontends untuk tim kecil | Biaya > manfaat | Tetap monolith |
| Framework berbeda total | Bundle & konsistensi rusak | Standar di shell |
| Shared dependencies salah | State ganda & bug halus | Konfigurasi shared ketat |
| Tidak ada design system bersama | Tampilan tidak konsisten | Tokens + komponen bersama |
| Routing tersebar di tiap app | Navigasi berantakan | Routing di shell |
Inti yang harus dibawa pulang:
Di episode 18 selanjutnya kita mengamankan aplikasi: web security dasar — XSS, CSRF, CORS, CSP, dan HTTPS, untuk melindungi TokoKita dan penggunanya dari serangan yang paling umum. Sampai jumpa di episode 18!