Web Components: Standar Browser untuk Komponen UI yang Benar-benar Portabel

Web Components

JAKARTA, cssmayo.com – Salah satu tantangan terbesar dalam pengembangan web modern adalah fragmentasi ekosistem. Komponen yang dibangun untuk React tidak bisa digunakan di Vue. Komponen Angular tidak berjalan di Svelte. Setiap framework memiliki cara tersendiri untuk mendefinisikan dan mengonsumsi komponen — menciptakan pulau-pulau yang tidak saling terhubung. Web Components hadir untuk menyelesaikan masalah tersebut dengan pendekatan yang paling mendasar: menggunakan standar yang sudah ada di browser itu sendiri.

Web Components adalah kumpulan standar web API yang memungkinkan developer membuat elemen HTML kustom yang bisa digunakan kembali, bersifat self-contained, dan bekerja di semua browser modern tanpa memerlukan framework atau library apapun. Selain itu, karena Web Components adalah bagian dari standar web platform yang didukung langsung oleh browser, komponen yang dibuat sekali bisa digunakan di React, Vue, Angular, Svelte, atau bahkan HTML biasa tanpa modifikasi.

Tiga Teknologi Inti Web Components

Web Components

Web Components dibangun di atas tiga standar yang bekerja bersama:

Custom Elements: API yang memungkinkan developer mendefinisikan elemen HTML baru dengan nama kustom. Elemen kustom harus mengandung tanda hubung (misalnya <my-button>, <user-card>, atau <data-table>) agar tidak konflik dengan elemen HTML bawaan. Selain itu, elemen kustom bisa memiliki lifecycle callbacks seperti connectedCallback, disconnectedCallback, dan attributeChangedCallback yang dipanggil saat elemen ditambahkan, dihapus, atau atributnya berubah.

javascript
class MyButton extends HTMLElement {
  connectedCallback() {
    this.innerHTML = `<button>${this.getAttribute('label')}</button>`;
  }
}
customElements.define('my-button', MyButton);

Hasilnya, elemen <my-button label="Klik Saya"> bisa digunakan di HTML seperti elemen biasa.

Shadow DOM: Mekanisme enkapsulasi yang memungkinkan komponen memiliki DOM dan CSS sendiri yang terisolasi dari halaman utama. Style dari halaman luar tidak akan mempengaruhi Shadow DOM, dan style di dalam Shadow DOM tidak akan “bocor” ke luar. Dengan demikian, komponen benar-benar mandiri dan tidak bergantung pada atau mengganggu style global halaman.

javascript
class MyCard extends HTMLElement {
  connectedCallback() {
    const shadow = this.attachShadow({ mode: 'open' });
    shadow.innerHTML = `
      <style>
        .card { padding: 16px; border-radius: 8px; background: #fff; }
      </style>
      <div class="card"><slot></slot></div>
    `;
  }
}

HTML Templates (<template> dan <slot>): Elemen <template> memungkinkan pendefinisian markup HTML yang tidak langsung dirender oleh browser — ia “tidur” di DOM dan baru diaktifkan saat JavaScript mengkloningnya. Sementara itu, elemen <slot> adalah mekanisme composition yang memungkinkan konten dari luar komponen disisipkan ke dalam template — mirip dengan children props di React atau slot di Vue.

Keunggulan Web Components

Menggunakan Web Components memberikan beberapa keuntungan yang signifikan:

  • Framework-agnostic: Sekali dibangun, bisa digunakan di framework mana pun. Ini sangat berharga untuk design system yang digunakan oleh tim dengan stack berbeda.
  • Tidak ada dependency runtime: Tidak perlu mengunduh React, Vue, atau Angular untuk menggunakan komponen. Browser sudah memiliki semua yang dibutuhkan secara native.
  • Enkapsulasi sempurna: Shadow DOM mencegah style conflict yang sering menjadi sumber masalah di aplikasi besar dengan banyak library CSS.
  • Longevity: Standar web platform berumur panjang. Komponen yang dibangun dengan Web Components standar tidak akan rusak saat framework populer berganti versi major.
  • Interoperabilitas dengan framework: Semua framework modern mendukung penggunaan Web Components. Selain itu, library seperti Lit (dari Google) mempermudah pembuatan Web Components dengan sintaks yang lebih ergonomis.

Keterbatasan Web Components

Web Components bukan solusi sempurna untuk semua situasi:

  • Server-side rendering (SSR): Web Components secara tradisional berjalan di client-side. SSR memerlukan pendekatan khusus seperti Declarative Shadow DOM yang masih relatif baru.
  • Developer experience: Membangun WebComponents dengan pure vanilla API cukup verbose dibanding menulis komponen React atau Vue. Library seperti Lit sangat membantu mengurangi boilerplate ini.
  • Form participation: Custom elements secara default tidak berpartisipasi dalam form submission. Diperlukan ElementInternals API untuk mengatasi ini.
  • Debugging: Shadow DOM membuat inspeksi menjadi lebih kompleks di browser DevTools.

Lit: Library Terbaik untuk Web Components

Lit adalah library ringan dari Google yang mempermudah pembuatan Web Components dengan template literal yang reaktif:

javascript
import { LitElement, html, css } from 'lit';

class MyCounter extends LitElement {
  static properties = { count: { type: Number } };
  static styles = css`.btn { padding: 8px 16px; }`;

  constructor() { super(); this.count = 0; }

  render() {
    return html`
      <button class="btn" @click=${() => this.count++}>
        Klik: ${this.count}
      </button>
    `;
  }
}
customElements.define('my-counter', MyCounter);

Oleh karena itu, banyak perusahaan besar seperti Google, Adobe, Salesforce, dan Microsoft menggunakan Lit sebagai fondasi design system mereka yang cross-framework.

Kesimpulan

Web Components mewakili pendekatan yang paling fundamental dan tahan lama untuk membangun komponen UI di web. Dengan berpegang pada standar platform yang sudah ada di browser, WebComponents menghasilkan komponen yang benar-benar portabel, berumur panjang, dan tidak terikat pada siklus hidup framework tertentu. Selain itu, dengan semakin matangnya dukungan browser dan library seperti Lit yang membuat pengembangannya semakin mudah, WebComponents adalah pilihan yang semakin relevan untuk design system dan komponen yang perlu hidup lintas ekosistem.

Eksplorasi lebih dalam Tentang topik: Techno

Cobain Baca Artikel Lainnya Seperti: 

Author