- Web component terlihat seperti versi browser dari komponen React, tetapi sebenarnya lebih dekat ke model yang menempatkan HTML yang sudah ada sebagai pusat lalu menambahkan fungsionalitas di atasnya
- Perbedaan utamanya ada pada rendering sebelum JavaScript dijalankan: alih-alih mengirim data ke elemen kustom yang kosong, lebih alami untuk membungkus HTML yang bermakna dengan elemen kustom
- HTML web component memperluas markup yang sudah ada, sedangkan elemen kosong yang sepenuhnya menyerahkan isi dan fungsinya kepada JavaScript lebih dekat ke JavaScript web component
- Jika cara membuat komponen ala React terbiasa dengan penggantian (replacement), web component menuntut cara berpikir augmentasi (augmentation), yaitu menambahkan fungsionalitas sambil mempertahankan konten
- Di platform web, seperti pada HTML5,
fetch, dan arus terkait TypeScript, ide-ide bagus cenderung bertahan lama dengan cara memperkuat teknologi yang sudah ada alih-alih menyingkirkannya
Web component dan komponen React punya karakter yang berbeda
- Nama “Web components” bisa terdengar seperti padanan komponen React di platform web
- JSX di React memakai bentuk
<MyComponent>, dan web component bisa memakai bentuk <my-component>
- Namun, jika membuat web component seperti membuat komponen React, kita bisa mudah frustrasi
- Kedua teknologi ini berbeda dalam fitur yang diprioritaskan dalam desain dan cara pemakaiannya
- Jika salah satunya dipakai seperti yang lain, itu akan berbenturan dengan arah alami masing-masing teknologi
HTML web component lebih cocok untuk augmentasi daripada penggantian
- Komponen React pada umumnya bisa berbentuk komponen kosong yang menerima data lewat properti, lalu JavaScript merender seluruh isinya
<UserAvatar
src="https://example.com/path/to/img.jpg"
alt="..."
/>
- Web component juga, dari tampilan luarnya saja, bisa ditulis dengan cara yang sama
<user-avatar
src="https://example.com/path/to/img.jpg"
alt="..."
></user-avatar>
- Namun, kekuatan khas web component adalah kemampuannya untuk dirender sebelum JavaScript
- Komponen React tidak bisa bekerja dengan cara ini
- Karena itu, dibanding “shell component” yang kosong, lebih cocok menyusun konten inti dengan HTML lalu membungkusnya dengan elemen kustom untuk menambahkan fungsi
<user-avatar>
<img src="https://example.com/path/to/img.jpg" alt="..." />
</user-avatar>
- Pembedaan Jeremy dalam “HTML web components” berfokus pada apakah elemen kustom memperluas markup yang sudah ada
- Jika elemen kustom kosong, itu bukan HTML web component
- Jika ia membungkus dan memperluas markup yang sudah ada, itu lebih dekat ke HTML web component
- “JavaScript web component” adalah bentuk di mana isi dan fungsi elemen kosong sepenuhnya bergantung pada JavaScript
<user-avatar
src="https://example.com/path/to/img.jpg"
alt="..."
></user-avatar>
- Dalam bentuk ini, tanpa JavaScript, elemen tersebut tidak punya makna bagi pengguna akhir
- Sebaliknya, HTML web component tetap menyisakan makna dan konten bahkan tanpa JavaScript, dan jika JavaScript ada, fungsionalitas ditambahkan di atasnya
<user-avatar>
<img src="https://example.com/path/to/img.jpg" alt="..." />
</user-avatar>
Di web, pendekatan augmentasi bertahan lebih lama
- Alasan pendekatan augmentatif cocok di web adalah karena karakter web mendorong peningkatan progresif yang tangguh, dan cocok untuk berulang kali mengubah sesuatu sebesar web
- Ide-ide bagus dari framework dan library di sekitar web, meskipun akhirnya diserap ke dalam platform, sering masuk dengan cara memperkuat teknologi yang sudah ada alih-alih menggantikannya sepenuhnya
- XHTML mencoba menggantikan HTML4, tetapi HTML5 mencoba memperkuat HTML4, dan HTML5 yang menang
- Library networking mencoba menggantikan
XMLHttpRequest, dan ide-ide bagusnya pada akhirnya dipindahkan ke standar fetch
fetch kini juga ada di berbagai lingkungan di luar browser
- Ide-ide bagus dari Sass dan jQuery juga dipindahkan ke browser
- Ide-ide bagus dari TypeScript juga masuk ke browser dengan cara memperkuat teknologi yang sudah ada, bukan menggantikannya
- Web component juga bisa dilihat sebagai aliran di mana model komponen React berpindah ke browser, tetapi ia lebih dekat ke sisi memperkuat daripada menggantikan cara kerja web yang sudah ada
- Jika menginginkan pendekatan teknologi yang bertahan lama, memilih augmentasi dan peningkatan lebih selaras dengan arah web daripada penggantian
1 komentar
Opini Hacker News
Saya berharap tulisan ini menjelaskan apa sebenarnya yang dilakukan atau disediakan oleh
user-avatar, tetapi sampai akhir tidak munculKalau isinya hanya style, saya tidak paham kenapa tidak cukup memakai class CSS saja, dan rasanya jauh lebih natural jika
user-avatarmenerima atributsrcdaripada setiap kali harus memasukkan tagimgdi dalamnyaVue/React/Angular menurut saya bukan berusaha “menggantikan” HTML, melainkan lebih seperti dibangun di atas HTML/CSS/JS; kalau pendekatannya merender semuanya dengan canvas, argumen itu mungkin akan terasa lebih meyakinkan
Saat Web Components pertama kali diumumkan saya sempat berharap banyak, tetapi fitur bawaan-nya terlalu minim, dan kesannya tidak banyak membantu secara nyata untuk membuat aplikasi web seperti framework
Alternatif untuk framework besar, khususnya yang seperti htmlx, terlihat seperti keluarga jQuery dengan sedikit syntax sugar, sehingga terasa seperti kemunduran besar untuk membangun aplikasi web
Kalau yang dimaksud ‘aplikasi web’ adalah sesuatu seperti Google Sheets, saya setuju, tetapi arus anti-React ini tampaknya lebih mengkritik kebiasaan memasang framework seolah-olah itu default lalu membangun dari awal, dibanding kasus semacam itu
Dalam praktiknya, ada banyak situs web yang hanya butuh “interaksi tipis di atasnya”
Manfaat utamanya adalah progressive enhancement: karena tag
imgpunya perilaku default, kita bisa mengandalkan rendering dasar lalu hanya “memperkuat” bagian yang perlu dengan web componentKomponen
details-utilsmemperkuat perilaku komponen HTML bawaandetailKalau karena alasan apa pun JavaScript dimatikan, komponen
detailtetap bekerja seperti semula; ketika JavaScript aktif atau selesai diunduh, ia mendapat perilaku yang ditingkatkan seperti menutup saat klik di luarDalam pendekatan ini, bagian yang bisa digunakan ulang adalah penguatan perilaku semacam itu
Setelah melihat web component dari pembuat 11ty ini, saya memahami inti tulisannya, dan bagian yang dulu saya rasakan saat pertama melihat Web Components—“pada akhirnya tetap butuh JavaScript, dan kalau tidak ada JavaScript ya tidak jalan”—juga muncul sebagai poin yang sama dalam tulisan Rich Harris: https://dev.to/richharris/why-i-don-t-use-web-components-2ci...
htmx terutama memperluas paradigma HTML yang dirender server dari refresh seluruh halaman menjadi pembaruan sebagian halaman, sambil menghindari penulisan JavaScript
Untuk melihat lebih jauh ide “HTML Web Components”, tulisan-tulisan ini juga layak dibaca
https://meyerweb.com/eric/thoughts/2023/11/01/blinded-by-the... - “So there you have it: a few thousand words on my journey through coming to understand and work with these fully-Light-DOM web components, otherwise known as custom elements. Now all they need is a catchy name, so we can draw more people to the Light Side of the Web.”
https://adactio.com/journal/20618 mengusulkan nama yang terdengar masuk akal
Karena repot dipakai, pada akhirnya kita butuh framework ringan di atas framework bawaan seperti Lit, padahal Lit lebih besar daripada Preact
Selain itu, ia tidak menyelesaikan masalah nyata seperti manajemen state dan routing, jadi kemungkinan besar kita tetap harus menarik hal-hal lain
Mungkin kita bisa mendapatkan komponen yang dapat digunakan ulang, tetapi kalau membayangkan menggunakan web component yang secara internal memakai Vue di tempat yang memakai React, rasanya kurang masuk akal
Keindahan dan keanggunan web berasal dari struktur deklaratifnya, yang membuatnya bisa diamati dan dimodifikasi
Shadow DOM terasa seperti dorongan korporat untuk membangun penghalang enkapsulasi dan kepastian yang lebih tinggi, dan secara pribadi itu bukan tujuan yang saya bagi
Tulisan ini menunjukkan bagaimana pekerjaan dengan Light DOM dapat dikomposisikan
Saya selalu berpikir web component atau custom element seharusnya bisa memodifikasi DOM internalnya sendiri, memindahkan anak-anaknya, dan membuat konten baru
Misalnya, halaman atau framework bisa memasukkan ikon, lalu elemen avatar pengguna bisa menyisipkan nama atau elemen dekoratif
Namun satu kekhawatiran saya tentang Light DOM/HTML Web Components adalah Shadow DOM memberi beberapa keuntungan performa
Sebagai developer, saya bisa membayangkan bahwa ia dapat mengurangi jumlah elemen yang harus ditelusuri selector CSS, dan saya berharap keuntungan itu juga bisa dimanfaatkan dengan cara tertentu
Saya sangat senang dengan pendekatan yang melihat custom element dan Web Components secara lebih ringan, dan terima kasih untuk tautannya
Ungkapan “bisa dirender sebelum JavaScript. Komponen React tidak akan pernah bisa begitu” sulit dinyatakan secara mutlak; dengan server-side rendering, ia bisa dirender sebelum JavaScript sisi klien
Menurut saya contohnya terlalu sederhana untuk menunjukkan klaim penulis
Web component yang menangani perubahan state akan menjadi pembanding yang lebih baik, dan argumennya juga mungkin akan lebih kuat
Ada solusi hydration, tetapi biasanya lebih buruk, memiliki kompromi yang mengejutkan, dan sering merusak composability
Kalau hanya melihat contoh yang membungkus tag
img, manfaatnya tidak terlalu terasa; memang bisa mengelompokkan dan memakai ulang elemen umum, tetapi untuk interaksi tetap membutuhkan JavaScriptTeks alternatif gambar pada contoh juga sekarang biasanya dinamis karena lokalisasi, jadi tanpa JavaScript kontennya bisa hilang
Sepertinya saya akhirnya mulai memahami Web Components: https://github.com/kennyfrc/cami.js
“No Build Steps, No Client-Side Router, No JSX, No Shadow DOM. We want you to build an MPA, with mainly HTML/CSS, and return HTML responses instead of JSON. Then add interactivity as needed.”
“Declarative templates with lit-html. Supports event handling, attribute binding, composability, caching, and expressions.”
Secara pribadi, saya suka class bergaya komponen class React yang memiliki state machine bawaan yang terinspirasi dari XState
https://github.com/codewithkyle/supercomponent/blob/master/s...
Arahannya terlihat cukup mirip, dan komunitas HTMX mungkin lebih besar
Kalau sudah pernah mencoba, saya ingin tahu bagian mana yang terasa kurang
“web components” bukan satu benda, dan bukan juga membuat “a web component”
“Web Components” adalah nama untuk Web Components API yang menggabungkan tiga hal
Yang sebenarnya Anda buat adalah custom element, dan di situ Anda bisa memakai Shadow DOM atau HTML template
Dari tiga hal itu, yang paling penting adalah custom element
Konsep intinya adalah “membuat lebih banyak elemen HTML”, jadi atribut dan JavaScript API apa yang didukung sepenuhnya Anda tentukan sendiri
Cara menaruhnya di halaman, berinteraksi dengannya, dan mendengarkan event-nya juga sama persis seperti elemen HTML lainnya
Kalau Anda tahu cara menulis halaman web dengan “cara lama”, Anda sebenarnya sudah tahu cara menggunakan custom element; yang perlu dipelajari hanya cara mendeklarasikannya
Belakangan ini saya mulai mencoba Web Components tanpa lingkungan build
Tidak ada npm, bun, webpack, atau semacamnya, tidak ada dependensi, dan ditulis dengan TypeScript
IntelliJ mengompilasinya otomatis ke JavaScript, dan browser view menyuntikkan handler pendeteksi perubahan kecil untuk pembaruan real-time selama pengembangan
Sejauh ini tidak ada masalah
Yang tampaknya menghambat Web Components adalah HTML Modules
Akan bagus jika untuk mengimpor web component kita bisa menautkan ke file
.html, bukan file.js, tetapi saat ini kalau ingin memakai template atau sesuatu yang sedikit lebih kompleks, kita harus melakukan injeksi jelek seperti.innerHtml = \...``Saya sempat mengira ini akan jadi masalah, tetapi IDE ternyata mem-parsing template string dengan cukup baik
Dan itu juga bukan satu-satunya alasan yang menghambat Web Components
Saya kurang bisa menerima klaim bahwa “React adalah pengganti, bukan penguatan”
Pada akhirnya React juga merender elemen HTML dan memasang handler event JavaScript
Membungkus
imgsebagai komponen React bukan berarti mengambil alih fungsiimg, melainkan menambahkan sesuatu di atasnya, yaitu penguatanMungkin penulis pernah bekerja di codebase React yang berbeda, tetapi berdasarkan pengalaman saya, kalau tidak ada alasan khusus kami tetap memakai fitur bawaan browser apa adanya
Mungkin saja saya hanya beruntung
Intinya adalah pendekatan “HTML Web Component” ini, berbeda dari React, tidak bergantung pada JavaScript untuk memulai rendering
Dari sudut pandang rendering browser, React adalah “halaman dimuat → komponen dimuat”, sedangkan Web Component lebih dekat ke “halaman dimuat → rendering dasar → komponen dimuat”
Orang yang mematikan JavaScript masih bisa melihat sesuatu pada web component, tetapi bisa saja tidak melihat apa pun di React; dan jika JavaScript tersedia, status render dapat ditingkatkan lebih jauh
Misalnya, jika
onchangedipasang pada sebuah elemen, React memberikan sesuatu yang lebih mirip eventinput, bukan eventchangeSebenarnya bukan keduanya, melainkan synthetic event yang lebih dekat ke
inputdaripadachangeJika benar-benar menginginkan
change, harus memakai referensi elemen dan memasang handler secara langsung di dalam effectJika React mengembalikan HTML dari server, membungkus
imgsebagai komponen React memang berarti memperkuat elemen yang sudah adaNamun jika semuanya dirender di sisi klien,
imgitu pada akhirnya tidak bisa dipisahkan dari komponen ReactBerdasarkan pengalaman, React sangat bagus ketika diberi tanggung jawab atas seluruh struktur halaman dari atas ke bawah, tetapi bisa menjadi sulit ketika disisipkan ke dalam struktur yang sudah ada sambil melakukan hal seperti server-side rendering
Jika mencari pendekatan yang tahan lama, kesimpulan bahwa kita sebaiknya memilih penguatan dan peningkatan daripada penggantian juga sesuai dengan pengalaman saya
Berkat filosofi ini, proyek-proyek web saya bisa bertahan lama dengan pemeliharaan dan dependensi yang minimal
Web component seharusnya melakukan satu hal, sedangkan framework JavaScript lebih mendekati sebuah ekosistem utuh
Saya pernah membuat web component pemutar video yang bisa menerima beberapa jenis input, dan input paling kompleksnya adalah file torrent
Dengan StencilJS [0], komponen itu juga bisa di-port ke Vue/React, tetapi tanpa itu pun sudah cukup dapat digunakan
Cukup masukkan tag tersebut bersama class yang diekspor dari
awesomePlayer.js, dan Anda mendapatkan pemutar video HTML5 siap salin-tempel yang dapat memutar torrentJika memungkinkan, saya juga sangat menyarankan meniru elemen HTML yang sudah ada
Misalnya, penggunaan
srcdilakukan karenavideojuga begitu, sehingga pihak yang memakai dapat berinteraksi tanpa harus membongkar dokumentasi[0] https://stenciljs.com/
Saya sulit setuju bahwa komponen framework frontend sepenuhnya bersifat pengganti dan tidak dapat dikomposisikan
Dari luar mungkin terlihat begitu, tetapi di komponen saya, saya banyak memakai slot, dan implementasinya juga mudah serta bekerja secara alami
Sebaliknya, Web Components biasanya didemonstrasikan dengan cara menyisipkan kode dalam jumlah sangat besar untuk membuat sesuatu seperti editor
Menggunakan slot di Web Components terasa menyakitkan, harus banyak menempelkan node secara manual, memperlakukan template sebagai string, dan untuk melakukan hal yang sedikit rumit bahkan harus mendengarkan event
slotchangePada dasarnya itu berarti memakai DOM API, dan kalau API itu tidak buruk, kita mungkin tidak akan pernah beralih ke framework frontend seperti React
Saya juga tidak setuju dengan klaim sampingan bahwa XHTML gagal karena tidak memperkuat HTML
Menurut saya, XHTML gagal karena aplikasi harus sepenuhnya valid dan validasi itu diserahkan kepada klien/browser
Jika memakai XHTML sungguhan, satu kesalahan kecil dalam markup saja bisa merusak halaman; karena itu semua orang memang memvalidasi XHTML demi kesiapan masa depan, tetapi tidak ada perusahaan yang mau mengambil risiko bisnisnya ikut rusak hanya karena satu tag
ptidak ditutup dengan benar