Membedah accessibility & theming di microfrontend: tanggung jawab WCAG per remote, ARIA defaults dari design-system, koordinasi focus management antar remote oleh host, dark mode dengan CSS variables, serta pengujian aksesibilitas dengan axe-core sebagai CI gate.

Dengan banyak remote yang dimiliki banyak tim, aksesibilitas (a11y) bisa terpecah — tiap tim mengabaikannya karena mengira "ada yang mengurus". Faktanya, di microfrontend, aksesibilitas adalah tanggung jawab bersama yang harus dikoordinasikan, terutama soal focus management antar remote.
Mengapa penting? Karena WCAG bukan opsi di banyak industri, dan pengalaman screen-reader yang kacau ketika berpindah remote merusak kepercayaan. Episode ini membahas cara menjaga aksesibilitas dan konsistensi theming di arsitektur ini.
Prinsip: remote yang menampilkan konten adalah yang paling paham kontennya. Setiap remote harus memenuhi WCAG untuk domainnya sendiri — kontras warna, semantic HTML, label, keyboard navigation. Tim pemilik remote bertanggung jawab penuh.
Untuk konsistensi, design-system menyediakan ARIA defaults pada komponen dasarnya:
export function Button({ children, ...rest }: ButtonProps) {
return (
<button {...rest} className="btn">
{children}
</button>
)
}Komponen ini otomatis semantik sebagai <button>, memberi keyboard & screen-reader dukungan dasar tanpa tiap remote menulis ulang.
Saat user berpindah remote (misal dari /catalog ke /cart), focus keyboard harus dipindahkan dengan benar — jika tidak, screen-reader "tersesat" di posisi lama.
Tugas host untuk mengkoordinasikan:
const mainRef = useRef<HTMLElement>(null)
useEffect(() => {
if (location.pathname !== prevPath) {
mainRef.current?.focus()
}
}, [location.pathname])Seperti episode 8, dur tema didefinisikan sebagai CSS variables di design-system. Remote meng-konsumsi var(--ds-*) dan otomatis mengikuti tema aktif:
:root[data-theme='light'] { --ds-bg: #fff; --ds-text: #111; }
:root[data-theme='dark'] { --ds-bg: #111; --ds-text: #eee; }Karena variabel berada di root (host), seluruh remote yang memakai token ikut berubah tanpa deploy ulang.
Integrasikan axe-core di test tiap remote untuk mendeteksi pelanggaran otomatis:
import axe from 'axe-core'
it('lolos aksesibilitas', async () => {
const results = await axe.run(document.body)
expect(results.violations).toHaveLength(0)
})Jadikan uji aksesibilitas CI gate: PR yang melanggar aksesibilitas diblokir sebelum merge. Ini memaksa tiap tim menjaga standar minimal, bukan menundanya.
Note
Axe hanya menangkap pelanggaran otomatis (sekitar 30-50% dari WCAG). Untuk sisanya, kombinasikan dengan review manual dan uji keyboard/screen-reader pada alur kritis lintas remote.
Pada episode 21 ini, kalian telah memahami accessibility & theming di microfrontend.
Inti yang harus dibawa pulang:
Di episode 22 selanjutnya, kita akan membahas server-side composition & Next.js — shell yang di-SSR, remote via fragment/edge, pola Podium Zalando, dan kapan memakai server-side composition. Pastikan aksesibilitas kalian hijau!