Skip to content

Komponen React Dijadikan Web Component Biasa

Adityo Guni Waluyo

Section group-network dipisah dari about-teaser, terus kepikiran buat portabel: dibangun ulang jadi custom element shadow DOM yang bisa ditempel di mana saja.

Ringkasan

Jadi penulis refaktor komponen group-network dari React jadi web component native. Ternyata JSX nggak bisa langsung nempel di HTML biasa, butuh build step dan React runtime. Solusinya bikin custom element pakai HTMLElement, Shadow DOM, sama template, jadi komponennya portable dan bisa dipakai tim lain tanpa React.

Saya lagi refaktor halaman about di proyek pribadi. Ada bagian group-network yang tadinya nempel langsung di dalam about-teaser.jsx. Saya extract jadi file sendiri, terus tiba-tiba kepikiran: gimana kalo bagian ini nanti perlu dipake sama tim lain yang sama sekali nggak pakai React?

Awalnya saya punya tebakan naif. Saya pikir, ya tinggal copy paste JSX-nya, terus sisipkan lewat script tag biasa, beres. Ternyata nggak segampang itu. JSX itu bukan HTML. Dia butuh build step dan React runtime buat bisa jalan. Kalau dipaksa render di HTML polos tanpa setup itu, browser cuma bakal bingung atau malah ngelempar error sintaks.

Di sinilah saya sadar kalau solusinya bukan membungkus React dengan wrapper berat, tapi membuat web component dari komponen react yang sudah ada menjadi standar native browser. Ini adalah langkah yang bikin komponen tersebut benar-benar bisa dipakai di mana saja, mewujudkan encapsulated reuse lewat tiga teknologi inti web component [9].

Dari JSX ke Custom Element

Langkah pertama adalah mengganti class komponen React menjadi class yang extend HTMLElement. Nama tag-nya harus mengikuti aturan lowercase-hyphen, jadi saya namai group-network. Aturan lowercase-hyphen ini bukan sekadar gaya penulisan, tapi syarat wajib browser buat mengenali autonomous elements dan memicu timing connectedCallback dengan benar [10].

Di dalam class itu, saya definisikan method connectedCallback. Method ini jalan tepat ketika elemen ditempel ke DOM, mirip dengan useEffect dengan dependency array kosong di React. Di sinilah tempat yang pas buat ngecek dan ngubah state awal elemen.

class GroupNetwork extends HTMLElement {
  connectedCallback() {
    this.attachShadow({ mode: 'open' });
    // logika render dan parsing atribut di sini
  }
}
customElements.define('group-network', GroupNetwork);

Saya sengaja memilih pendekatan autonomous custom element ini. Kenapa? Karena pendekatan ini paling stabil dan didukung konsisten di semua browser modern tanpa perlu polyfill yang rumit.

Shadow DOM dan Template

Buat pengganti JSX, saya pakai