HTMX begitu keren sampai saya membuatnya sendiri (2024)
(dbushell.com)- HTMX adalah pendekatan yang berfokus pada HTML hasil render server untuk meningkatkan frontend secara progresif, berkembang dari cara sebelum UI JavaScript modern ala React membesar berlebihan
- Saat refaktor server untuk podcast web app self-hosted mengganti SvelteKit dengan DinoSsr, muncul masalah perpindahan halaman memutus pemutaran audio, dan dengan HTMX hanya area `` yang diperbarui sehingga komponen audio bisa dipertahankan
- HTMX didistribusikan sebagai library frontend, tetapi sebagian besar implementasinya berada di template backend dan konfigurasi server, dan request HTTP yang mengembalikan HTML pada dasarnya berperan sebagai API HTMX
- Atribut
hx-*, contoh `` yang bisa diklik, dan contoh lanjutan dengan banyak JavaScript inline menunjukkan keterbatasan template atribut deklaratif serta beberapa keluhan pada dokumentasinya - Implementasi mini buatan sendiri menggunakan caching
304, History API, penggantian ``, dan preload berbasis pointer event sebagai elemen utama, dengan hasil akhir mengurangi JavaScript di browser sehingga codebase menjadi lebih kecil dan sederhana
Posisi HTMX
- HTMX menolak UI JavaScript modern dan lebih menyukai HTML hasil render server, sebuah pendekatan yang berkembang dari cara sebelum frontend membesar berlebihan dengan React
- Infinite scroll dan hasil pencarian real-time adalah contoh HTMX yang populer; HTMX memang terlihat terbatas dan tidak menyelesaikan semua masalah yang ingin diselesaikan React dan sejenisnya, tetapi dalam batasan itu ia adalah alat yang sangat bernilai
- HTMX bukan “magic bullet”, dan inti pandangannya adalah bahwa sebagian ide di balik HTMX lebih penting daripada HTMX itu sendiri
Eksperimen
- Membaca dokumentasi saja tidak cukup, jadi penulis menguji pemakaian nyata, dan sasaran penerapan HTMX adalah refaktor server untuk podcast web app self-hosted
- Implementasi sebelumnya menggunakan SvelteKit, dan walau SvelteKit adalah alat favorit, framework itu bisa terasa berat untuk situs web kecil
- Penggantinya adalah DinoSsr yang dibuat sendiri; proyek yang sama juga dipakai untuk build situs statis dan menyajikan blog bookmark
- DinoSsr terutama berbasis server-side dan dapat menyediakan komponen sebagai frontend “islands”, tetapi strukturnya tidak menyediakan interaksi seluruh halaman
- Komponen audio player harus tetap bertahan saat berpindah halaman, dan jika perpindahan halaman memuat ulang seluruh halaman maka pengalaman pemutaran akan cepat terputus
- SvelteKit menangani pembaruan UI dan routing frontend, tetapi pada build baru hanya komponen audio player yang memakai JavaScript frontend, dan DinoSsr sengaja tidak mencoba routing sisi klien
- Beberapa halaman hanya berbeda pada bagian `` sehingga, jika tautan ditingkatkan secara progresif dengan HTMX dan hanya area ini yang diperbarui, komponen audio dapat dipertahankan tanpa memuat ulang seluruh halaman
- Penerapan HTMX bekerja dengan baik, tetapi tidak lama kemudian HTMX dihapus dan diganti dengan versi mini buatan sendiri yang memakai ide yang sama
Beberapa pemikiran tentang HTMX
- Dalam eksperimen ini HTMX menjadi pengganti Svelte di frontend, tetapi bukan pengganti yang bisa langsung disisipkan seperti React, melainkan perubahan cara berpikir yang besar
- HTMX didistribusikan sebagai library JavaScript untuk meningkatkan frontend secara progresif, tetapi sebagian besar implementasinya dilakukan di backend, dengan template server dan konfigurasinya harus disiapkan sendiri
- Request HTTP yang menyajikan HTML pada dasarnya berperan sebagai API HTMX, dan detail penetapan header HTTP penting untuk caching yang benar
- Sudah ada atribut standar
data-*dandataset, jadi penggunaan atribut berprafiks nonstandarhx-*menjadi keluhan kecil - Dokumentasi HTMX banyak memuat contoh ``; contoh di bawah ini menunjukkan struktur saat pengguna mengklik
div, mengirim requestPUTke/messages, lalu memuat respons kedivtersebut
Put To Messages
- Contoh yang mengharuskan pengguna mengklik elemen `` dikritik sebagai sesuatu yang tidak diinginkan
- Beberapa contoh HTMX lanjutan yang menggunakan JavaScript inline menjadi agak berantakan dan menunjukkan batasan template atribut deklaratif
- Terlepas dari kritik itu, HTMX tetap menyediakan kumpulan fitur yang terbatas tetapi berguna, dan merupakan alat yang dapat meningkatkan banyak pola desain web umum
Membuat sendiri
- Tepat setelah berhasil menambahkan HTMX, penulis malah menghapusnya dan membuat implementasi versi mini sendiri dengan ide yang sama
- Untuk memungkinkan request fetch yang di-cache, digunakan header HTTP
last-modified,if-modified-since, dan respons304 - Untuk integrasi riwayat dasar digunakan
pushStatedanpopstate - Ditambahkan kode untuk mengekstrak dan mengganti elemen ``, serta preload bawaan berbasis pointer event yang terinspirasi dari HTMX preload extension
- Preload berbasis pointer event memulai request fetch sebelum event
clickterjadi, memberi peningkatan performa kecil - Kode sumber eksperimen ini sangat dasar, tetapi menunjukkan bahwa JavaScript yang benar-benar dibutuhkan browser sebenarnya sedikit
- Dengan HTMX atau pendekatan “we have HTMX at home”, hasilnya codebase menjadi jauh lebih kecil dan sederhana
JavaScript frontend
- Template dan komponen pada praktiknya diperlukan untuk organisasi kode dan reuse, kecuali mungkin pada situs web yang sangat kecil, dan bisa diimplementasikan di server-side dengan PHP, Ruby, Go, JavaScript, dan lainnya
- Struktur seperti ini tidak perlu diduplikasi ke browser atau diimplementasikan hanya di browser, tetapi popularitas React dan sejenisnya membuat banyak developer berhenti mempertanyakan hal itu
- Kelelahan terhadap JavaScript frontend itu nyata, dan berkaitan dengan pengalaman lebih menyukai template server lama sambil tetap terlalu merekayasa UI JS
- Bahkan jika HTMX sendiri tidak dianggap sangat hebat, filosofinya tetap merupakan pendekatan yang cukup kuat hingga bisa membuat developer JavaScript modern merasa malu
1 komentar
Opini Lobste.rs
Sedikit mengada-ada sih, tapi saya kurang suka penggunaan atribut HTML berawalan
hx-*di tempat yang seharusnya memakaidata-*Htmx sudah lama mendukung prefiksdata-Soal jangan membuat pengguna mengklik elemen `` , cara terbaik adalah memakaihx-boostmilik htmx pada tag anchor dan form. Karena tag-tag ini akan ditingkatkan secara otomatis dengan cara yang benar, jadi bisa menghindari div yang bisa diklik Ini proyek yang menunjukkan betapa sedikit JavaScript yang sebenarnya dibutuhkan browser, dan ke depannya perawatannya kemungkinan minim serta hampir tidak butuh patch keamanan. Patut diberi selamatKarena HTMX merender semuanya, bukankah itu membebani server? Rasanya mirip dengan masalah CGI yang dulu pernah kita alami
Karena alasan serupa, saya memakai alpine-ajax yang sangat mirip dengan htmx
alpine-ajax. Kalau saya memulai lagi dengan tujuan “mendapatkan kelebihan SPA dari SSR”, mungkin saya akan memilih itu Soalnya untuk fitur reaktif di klien, saya memang sudah memakai alpine. Hanya saja sekarang sudah banyak htmx di repositori, dan saya juga tidak punya keluhan terhadap htmx