Web-Components | https://webcomponents.github.io/assets/
Web-Components | https://webcomponents.github.io/assets/

Mengenal Teknologi Web-Components

Edwin Tantawi
10 min readSep 10, 2021

--

Pernahkah kamu membanyangkan membuat element HTML kita sendiri? Wah kalau bisa itu sungguh luar biasa bukan? Ternyata benaran kita bisa melakukannya, wah penasaran bagaimana? Kenalkan dia adalah Web-Components.

Tulisan ini saya buat karena terinspirasi dan termotivasi oleh Insinyur Online, melalui Live Stream Bedah Praktek Episode #003: Scaling Frontend Development. Dari sana saya termotivasi untuk mengulik lebih jauh topik Web-Components ini dan menjadikan proses explorasi saya sebagai tulisan di sini. Terima kasih banyak untuk Insinyur Online. Yuk kenal Insinyur Online lebih jauh melalui http://insinyur.online/

Web-Components adalah teknologi yang memungkinkan Kita membuat elemen kustom yang dapat digunakan berulang. Mungkin bagi yang sudah pernah mencicipi Library/Framework Javascript seperti ReactJS, VueJS, Angular, Svelte, dll pasti tidak asing dengan konsep component, Kita bisa membuat element yang reusable (dapat dipakai berulang), luar biasa kan? mari kita explore lebih jauh lagi. Dengan memahami Web-Component kita akan lebih mudah memahami Library/Framework tersebut dan dengan mudah berpindah antar Library/Framework, karena Library/Framework tersebut terdapat penerapan Web-Component didalamnya.

Sebagai developer terutama Front-End, jika kita bisa membuat komponent yang dapat di pakai berulang baik itu di halamn yang berbeda merupakan hal yang sangat bagus, code kita pun akan terlihat lebih clean, mudah di baca, dan memudahkan kita dalam development.

Web-Components bertujuan untuk memecahkan masalah seperti di atas. Web-Components sendiri merupakan teknologi yang terdiri dari tiga teknologi utama, yang dapat digunakan bersama untuk membuat elemen kustom yang terenkapsulasi yang dapat digunakan kembali dimana saja tanpa merusak sistem yang berjalan.

Ketiga teknologi itu antara lain:

  • Custom Element: Sebuah API yang memungkinkan kita menentukan elemen kustom dan perilakunya, yang kemudian dapat digunakan sesuai keinginan di tampilan pengguna.
  • Shadow DOM: Sebuah API untuk membuat Shadow DOM Tree “Pohon DOM bayangan” yang dienkapsulasi ke elemen yang dirender secara terpisah dari DOM dokumen utama dan mengontrol fungsionalitas tersendiri. Dengan cara ini, kita dapat merahasiakan fitur pada elemen, sehingga dapat ditulis tanpa takut bertabrakan dengan bagian lain dari dokumen / dari luar custom element tersebut.
  • HTML Template: Dengan element <template> dan <slot> memungkinkan kita untuk menulis template markup yang tidak ditampilkan di halaman yang dirender. Dengan ini kita dapat menggunakan kembali beberapa template yang ada.

Ketiga teknologi ini yang membangun Web-Components menjadi sangat powerfull.

Bagaimana menggunakan Web-Components?

Untuk membangun Web-Components kita memerlukan ketiga teknologi yang kita bahas sebelumnya, Pertama kita akan mencoba membuat Custom Element, Shadow DOM, dan HTML Template untuk membangun Web-Components.

Custom Element

Ada 2 jenis Custom Element, yang antara lain:

  • Autonomous custom elements: Custom elements yang berdiri sendiri (standalone), element ini tidak mewarisi standart HTML element yang ada. Dengan kata lain kita benar benar membuat element kita sendiri, sebagai contoh standart penamaan element untuk Autonomous custom elements adalah wajib terdiri dari 2 kata dan dihubungkan dengan (-) jika tidak maka tidak akan berhasil, contohnya: <app-card>, <edwin-tantawi>.
  • Customized built-in elements: Customized build-in element merupakan kebalikan dari Autonomous custom elements, dimana custom element yang akan di buat mewarisi standart HTML element yang ada, dengan kata lain kita dapat melakukan customisasi pada element HTML yang sudah ada seperti <p> , <div> . Penggunaanya juga sedikit berbeda dari Autonomous custom elements, penamaan elementnya sendiri akan sama seperti element yang mewarisinya tetapi jika ingin menggunakan Customized built-in elements, kita perlu memperikan attribute is pada element tersebut dengan value nama dari custom element yang di buat, contohnya: <p is="app-text"> , attribute is di sana berfungsi untuk menandai bahwa element tersebut menggunakan custom element tertentu. Dengen demikian kita tetap bisa menggunakan Standart HTML element bersamaan dengan Customized built-in elements.

Penasaran bagaimana penggunaanya? yuk kita lanjut.

Autonomous custom elements.

Pertama kita perlu mendefenisikan custom element kita di file javascript dengan menggunakan class dengan nama bebas yang penting merepresentasikan custom element kita nantinya, dalam kasus ini kita akan namakan AppCard dan extends ke interface HTMLElement agar mewarisi sifat HTMLElement, dan merepresentasikan HTML element.

Kita bisa berikan constructor dan memanggil super agar custom element kita mewarisi HTMLElement.

yey kita berhasil membuat custom element kita sendiri, tetapi kita masih perlu medefenisikannya agar dapat di gunakan, caranya cukup mudah dengan menggunakan customElements.define() dengan 2 parameter wajib, dan 1 parameter opsional.

Parameter pertama adalah name yang akan digunakan nantinya untuk memanggil custom element kita, perlu diingat name wajib terdiri dari 2 kata dan dihubungkan dengan (-) jika tidak maka tidak akan berhasil.

Parameter kedua adalah constructor atau class custom element kita, di sini class custom element kita adalah AppCard.

Parameter ketiga adalah options yang bersifat opsional.

mendefenisikan custom element

Selanjutnya kita dapat menggunakannya, dengan cara mengimport file javascript yang berisi custom element kita di HTML, lalu kita dapat memanggil custom element kita sesuai dengan name yang kita berikan saat mendefenisikan custom element.

menggunakan custom element

maka akan terlihat sebagai berikut pada browser:

custom element

Mantap, kita berhasil membuat custom element kita sendiri. Jika kita cek pada browser maka tidak akan ada apa-apa yang mundul, ini karena custom elment kita belum berisi apapun.

Cara paling mudah adalah langsung memasukan konten pada children custom element kita. Selain itu kita dapat memasukan konten hingga memanipulasi custom element kita pada class custom element tersebut.

kita akan coba memberikan konten pada custom element kita. Kita bisa memasukan konten text maupun element HTML lain ke dalam custom element kita dengan menggunakan keyword this yang merujuk pada custom element kita lalu .innerHTML untuk memasukan konten ke dalam custom element kita.

maka akan terlihat seperti berikut pada browser:

custom element dengan konten di dalamnya

Keren, kita berhasil membuatnya, selanjutnya kita akan masuk lebih dalam lagi, kita akan membahas Components Lifecycle / siklus hidup komponent.

Components Lifecycle

Components Lifecycle atau Siklus Hidup komponen, yups setiap komponen akan memiliki sikulus hidupnya tersendiri, kita bisa mengatur bagaimana perilaku komponen pada sikulus hidup nya dengan memanfaatkan lifecycle callbacks/hooks. Ada beberapa siklus hidup yang terjadi pada sebuah komponen. Ketika sebuah JavaScript class mewarisi sifat dari HTMLElement maka class tersebut akan memiliki siklus hidup layaknya sebuah elemen HTML.

Pertama ada constructor, ini bukan bagian dari lifecycle callback tapi kita juga perlu tau, constructor akan di panggil ketika kita membuat web component tersebut, di sini kita bisa meletakan logic yang akan dijalankan ketika komponen di buat. Mari kita lanjutkan ke Lifecycle callback yang bisa kita gunakan:

  • connectedCallback: Dijalankan setiap kali komponen berhasil ditambahkan ke DOM. Ketika komponen / element kita tampil di DOM, cocok untuk melakukan konfigurasi.
  • disconnectedCallback: Dijalankan setiap kali komponen keluar dari DOM. Ketika komponen / element hilang/keluar dari DOM (remove), cocok untuk melakukan cleanup.
  • attributeChangedCallback: Dijalankan setiap kali value atribut yang di lakukan observe dengan fungsi get observedAttributes berubah, cocok untuk memuat ulang data yang akan ditampilkan
  • adoptedCallback: Dijalankan setiap kali elemen dipindahkan ke dokumen baru. Lifecycle ini jarang digunakan. Pada kasus penggunaakn iframe maka lifecycle ini akan di jalankan.

Mari kita coba beberapa lifecycle yang sering di gunakan.

lifecycle callbacks | app-card.js

Jika kita coba jalankan di browser, maka yang akan terjadi seperti berikut:

lifecycle callbacks | browser

Keren, berikutnya tergantung kita untuk mengatur perilaku komponen yang kita buat berdasarkan lifecycle nya. Pada beberapa framework/library javascript juga memiliki beberapa lifecycle tersebut mungkin akan sedikit berbeda implementasi setiap framework/library.

Customized built-in elements

Tidak jauh berbeda dengan Autonomous custom elements, hanya saja pada Customized built-in elements kita akan melakukan nya pada standart HTML Element yang sudah ada seperti <p>, <div>, dan lainnya. Jika sebelumnya pada Autonomous custom elements, kita membuat nya benar benar Element yang baru.

Cara menggunakannya juga tidak berbeda jauh dari sebelumnya, semua lifecycle callback sebelumnya juga dapat digunakan, yang menjadi pembeda adalah class yang kita extends bukan ke interface HTMLElement , melainkan ke interface standart element HTML yang tersedia seperti HTMLParagraphElement, HTMLUListElement, dan masih banyak lagi, alih alih membuat element dari awal, kita bisa extend element yang sudah ada.

Pada contoh kali ini kita akan coba menambah fungsionalitas element <p> , dimana setiap akhir text pada paragraph akan kita tambahkan

. . . (read more)

Yang berbeda dari sebelumnya hanya interface yang di extends, di sini kita gunakan HTMLParagraphElement yang merupahan interface untuk element <p> / paragraph .

pada kasus ini ketika lifecycle connectedCallback kita akan menambahkan “…(read more)” dengan cara menambahkannya dengan innerHTML .

Letak perbedannya berikutnya adalah pada saat mendefenisikan custom element kita, kita perlu menambahkan parameter ketiga yang opsional sebuah object lalu tambahkan key-value:

{ extends: 'p' } 

yang merepresentasikan HTML element yang akan di extends. Perlu diingat juga parameter pertama name disini bukan berperan sebagai nama TAG melainkan akan digunakan pada attribute is.

Yups.. dengan menggunakan is untuk memberitaukan bahkan itu adalah custom element maka kita tetap dapat menggunakan default element tersebut dengan cara tanpa menuliskan attribute is .

menggunakan Customized built-in elements

Makin tertarik? kita bisa explore lebih jauh di: https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements

Shadow DOM

Sebuah API untuk membuat Shadow DOM Tree “Pohon DOM bayangan” yang dienkapsulasi ke elemen yang dirender secara terpisah dari DOM dokumen utama dan mengontrol fungsionalitas tersendiri. Dengan cara ini, kita dapat merahasiakan fitur pada elemen, sehingga dapat ditulis tanpa takut bertabrakan dengan bagian lain dari dokumen / dari luar custom element tersebut.

https://www.ionos.com/digitalguide/websites/web-development/shadow-dom/
Shadow DOM | https://www.ionos.com/digitalguide/websites/web-development/shadow-dom/

Karena komponent yang kita buat dapat digunakan kembali dimana saja, Sebaiknya komponen tidak bisa mendapat gangguan luar agar tampilan atau fungsinya tetap dalam keadaan aslinya. Maka kita perlu menerapkan konsep enkapsulasi pada komponen.

Dengan ShadowDOM kita bisa membuat DOM tree lain secara terisolasi di dalam DOM tree. Terdapat beberapa komponen yang menyusun ShadowDOM yang bisa kita lihat pada illustrasi di atas, antara lain:

  • Shadow Host: Node yang berada pada regular DOM dan sebagai wadah ShadowDOM.
  • Shadow Tree: DOM Tree yang terdapat pada ShadowDOM.
  • Shadow Root: Node Root / akar Node dari ShadowDOM.
  • Shadow Boundary: Pembatas antara regular DOM dengan ShadowDOM.

Kita dapat memerlakukan ShadowDOM seperti regular DOM biasanya, hanya saja andara regular DOM dan ShadowDOM tidak dapat memanipulasi satu sama lain, karena terenkapsulasi baik dari dalam maupun luar.

Langsung saja kita coba dari code kita sebelumnya. Pertama-tama kita akan melihat masalah yang timbul jika tidak menerapkan ShadowDOM.

app-card.js | tanpa shadowDOM
index.html
tanpa shadowDOM

yups masalah yang muncul dari sisi styling, awalnya kita membuat style untuk button dengan warna lightcoral, namun pada custom element kita, kita menerapkan warna lightblue, maka terjadi override style, semua button menjadi biru, ini bukan yang kita inginkan. Mari kita implementasikan ShadowDOM.

membuat shadowDOM cukup mudah dengan cara:

const shadowDOM = this.attachShadow({ mode: 'open' });

sekarang kamu berhasil membuat shadow-root , pada kasus ini kita attach shadow pada constructor this . pada parameter attachShadow kita bisa memberikan mode, ada dua mode yang bisa di berikan yaoitu open dan close, jika close maka kita sama sekali tidak bisa mengakses ShadowDOM dari luar, sedangkan pada mode open, kita bisa mengaksesnya dari luar ShadowDOM.

Selanjutnya kita rumbah dari yang sebelumnya kita menambahkan style dan element lain pada komponent kita melalui this, sekarang kita bisa menggunakan variabel shadowDOM .

app-card.js | dengan shadowDOM
dengan ShadowDOM

keren sekarang komponen kamu sudah terenkapsulasi dengan ShadowDOM.

HTML Template

Terdapat dua element yang dapat kita gunakan dalam membuat HTML template yaitu <template> dan <slot> yang memungkinkan kita untuk menulis template markup yang tidak ditampilkan di halaman yang dirender. Dengan ini kita dapat menggunakan kembali beberapa template yang ada.

Jika kita coba menggunakan element template, maka tidak akan ditampilkan di browser.

seluruh element yang ada pada template tidak muncul pada browser, untuk menggunakan nya kita perlu merendernya melalui javascript.

html template dan slot

Selanjutnya kita akan render template yang kita buat dengan memanfaatkan custom komponen kita sebelumnya.

pertama kita akan ambil element template yang kira buat sebelumnya melalui id yang kita berikan.

selanjutnya kita perlu hanya mengambil konten di dalam template saja dengan cara mengakses .content .

sebelum kita menggunakannya kita perlu cloneNode content kita, agar content pada template tidak hilang dan dapat digunakan kembali.

selanjutnya kita bisa attach template content yang telah di clone.

Sekarang kita sudah bisa melihat template kita melalui custom element pada browser.

Selanjutnya kita akan memanfaatkan slot untuk membuat template kita lebih dinamis, pada template yang kita buat sebelumnya kita melihat adalah element slot disana, slot berperan seperti placeholder, kita bisa memberikannya nilai berbeda beda, kita juga memerlukan atribut name pada slot .

penggunaan slot

dengan begitu nilai awal pada slot akan di gantikan dengan nilai yang baru.

implementasi slot bersama template, custom element, dan shadowDOM

Mantap, kita berhasil menggunakan 3 Teknologi dalam membangun Web-Components, antara lain Custom Element, ShadowDOM dan HTML Template.

Masih banyak lagi pembahasan Web-Components ini yang tidak bisa saya tuliskan semua dalam tulisan ini, semoga dengan tulisan ini di Medium dapat memberikan gambaran teknologi Web-Components .

Jika tertarik membahas materi ini lebih lanjut, jangan sungkan berikan komentar agar saya usahakan membuatkannya.

Akhir Kata

Terima kasih atas antusias nya, jika ada salah / salah kata mohon di maafkan, semoga dengan tulisan ini dapat berguna bagi banyak orang.

jangan sungkan untuk berbincang dengan saya melalui beberapa media-sosial yang bisa di lihat di sini https://edwintantawi.vercel.app/contact

--

--

Edwin Tantawi

"If you have knowledge, let others light their candles at it" ~ Margaret Fuller