Konfigurasi Module Federation pertama di Vite: instalasi plugin, konfigurasi host dev shell, konfigurasi remote catalog, penggunaan singleton untuk react, serta verifikasi pertama bahwa host memuat remote dari port berbeda lewat manifest dan network.

Setelah membangun kerangka monorepo storefront di episode 3, kini saatnya momen paling membahagiakan sekaligus menentukan: menghubungkan host dan remote pertama dengan Module Federation. Di episode ini kita akan mengonfigurasi shell (host) dan catalog (remote) sehingga host bisa memuat halaman katalog yang disajikan oleh aplikasi di port lain.
Mengapa episode ini jadi tonggak? Karena di sinilah kalian melihat microfrontend "menyala" — sebuah aplikasi di port 5000 menampilkan UI yang sebenarnya dirender dan di-bundle oleh aplikasi di port 5001, secara runtime. Begitu kalian melihatnya, seluruh konsep episode 2 menjadi konkret.
Mulai dengan menginstall plugin Module Federation untuk Vite di kedua app:
pnpm --filter storefront-shell add -D @module-federation/vite
pnpm --filter storefront-catalog add -D @module-federation/vite@module-federation/vite adalah plugin federasi resmi yang menyatukan federasi dengan Vite. Kita juga memastikan React terinstall di keduanya, nanti diberi opsi singleton: true agar hanya satu React yang berjalan di halaman.
shell)Buka apps/shell/vite.config.ts dan tambahkan plugin federation:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { federation } from '@module-federation/vite'
export default defineConfig({
plugins: [
react(),
federation({
name: 'shell',
filename: 'remoteEntry.js',
exposes: {},
remotes: {
catalog: 'catalog@http://localhost:5001/mf-manifest.json',
},
shared: ['react', 'react-dom'],
}),
],
})Poin penting:
| Opsi | Arti |
|---|---|
name | Identitas app (shell) |
filename | Nama file entry host (remoteEntry.js) |
exposes | (kosong di host) — host tidak mengekspos apa pun |
remotes | Daftar remote yang dimuat host. catalog menunjuk ke manifest remote di port 5001 |
shared | Library yang dibagikan agar tidak diduplikasi |
catalog)Buka apps/catalog/vite.config.ts. Remote berbeda dari host: ia mengekspos module, bukan menerima.
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { federation } from '@module-federation/vite'
export default defineConfig({
plugins: [
react(),
federation({
name: 'catalog',
filename: 'remoteEntry.js',
exposes: {
'./CatalogApp': './src/CatalogApp.tsx',
},
shared: ['react', 'react-dom'],
}),
],
})Kunci perbedaan dengan host:
exposes berisi './CatalogApp': './src/CatalogApp.tsx' — module yang boleh di-load dari luar.name: 'catalog' harus cocok dengan referensi di host (catalog@...)../src/CatalogApp.tsx adalah komponen React sederhana yang menampilkan daftar produk:
export default function CatalogApp() {
return (
<section>
<h2>Katalog Produk Tokoku</h2>
<ul>
<li>MacBook Air M4 - Rp 18.999.000</li>
<li>Logitech MX Master 3S - Rp 1.249.000</li>
</ul>
</section>
)
}Di shell, kita memuat komponen remote dengan React.lazy + Suspense (detail lazy loading kita bahas di episode 6 dan 12):
import { lazy, Suspense } from 'react'
const CatalogApp = lazy(() => import('catalog/CatalogApp'))
export default function App() {
return (
<main>
<h1>Tokoku - Shell</h1>
<Suspense fallback={<p>Memuat katalog...</p>}>
<CatalogApp />
</Suspense>
</main>
)
}import('catalog/CatalogApp') bukan import file biasa — ia memuat module yang di-resolve lewat Module Federation ke aplikasi catalog di port 5001.
pnpm --filter storefront-shell dev
pnpm --filter storefront-catalog devHost di http://localhost:5000, remote di http://localhost:5001.
http://localhost:5000 — kalian harus melihat halaman yang menampilkan komponen katalog.mf-manifest.json dan chunk module remote yang ter-load dari port 5001 — bukti bahwa host memuat remote secara runtime, bukan menyalin kodenya saat build.Tip
Jika halaman katalog tidak tampil, buka DevTools Console. Error "invalid hook call" menandakan shared React belum singleton. Error network 404/500 pada manifest menandakan remote belum berjalan atau referensi URL salah.
Pada episode 4 ini, kalian telah mengonfigurasi dan memverifikasi Module Federation pertama: host shell memuat remote catalog dari port berbeda secara runtime.
Inti yang harus dibawa pulang:
@module-federation/vite menyatukan federasi ke Vite.remotes (apa yang dimuat); remote mendeklarasikan exposes (apa yang disajikan).shared: ['react', 'react-dom'] mencegah duplikasi library.React.lazy + Suspense; verifikasi lewat Network mf-manifest.json.Di episode 5 selanjutnya, kita akan membahas shared dependencies & versioning — mengapa singleton: true wajib untuk React, requiredVersion untuk memaksa versi, dts untuk type-safe, serta auto-singleton & tree-shaking di Module Federation 2.0. Pastikan kedua app kalian berjalan!