Web Development

Web Components: Komponen Web Native

Tutorial lengkap Web Components β€” Shadow DOM, Custom Elements, HTML Templates, Slots, lifecycle callbacks, dan membuat UI reusable tanpa framework

1. Pengenalan Web Components

Web Components adalah sekumpulan API web standar yang memungkinkan Anda membuat elemen HTML kustom yang dapat digunakan kembali (reusable), dengan fungsionalitas terenkapsulasi. Berbeda dengan framework seperti React atau Vue, Web Components menggunakan standar web bawaan yang bekerja di semua browser modern tanpa perlu library tambahan.

Tiga teknologi utama yang membentuk Web Components adalah: Custom Elements (mendefinisikan elemen baru), Shadow DOM (enkapsulasi markup dan style), dan HTML Templates (template yang tidak dirender sampai diaktifkan).

Mengapa Menggunakan Web Components?

Keunggulan Penjelasan
Framework-AgnosticBekerja di React, Vue, Angular, Svelte, atau vanilla JS β€” tanpa lock-in
Standar WebDidukung langsung oleh browser, tidak perlu bundler atau compiler
EnkapsulasiShadow DOM mencegah konflik CSS dan JS antar komponen
ReusabilitasSekali dibuat, bisa dipakai di mana saja β€” bahkan di halaman HTML statis
LongevityKarena ini standar, kode Anda tidak akan obsolete dengan pergantian framework
InteroperabilitasTim berbeda bisa pakai framework berbeda tapi berbagi komponen yang sama

Web Components vs Framework Components

Aspek Web Components React Components Vue Components
StandarW3C Web StandardsLibrary APIFramework API
EnkapsulasiShadow DOM (native)CSS Modules / CSS-in-JSScoped styles
Bundle Size0 KB (native)~42 KB (React)~33 KB (Vue)
ReactivityManual / Attribute APIVirtual DOMReactive Proxy
EcosystemKecil tapi tumbuhSangat besarBesar
Diagram: Arsitektur Web Components
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚               WEB COMPONENTS                          β”‚
β”‚                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚            Custom Elements API                   β”‚  β”‚
β”‚  β”‚   β€’ define() β€” daftarkan elemen baru             β”‚  β”‚
β”‚  β”‚   β€’ extends β€” perluas elemen HTML yang ada       β”‚  β”‚
β”‚  β”‚   β€’ Lifecycle callbacks                          β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚               Shadow DOM                         β”‚  β”‚
β”‚  β”‚   β€’ Encapsulated DOM subtree                     β”‚  β”‚
β”‚  β”‚   β€’ Scoped CSS (tidak bocor masuk/keluar)        β”‚  β”‚
β”‚  β”‚   β€’ Isolated JavaScript scope                    β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚        HTML Templates & Slots                    β”‚  β”‚
β”‚  β”‚   β€’