10 puan yazan xguru 2024-10-10 | Henüz yorum yok. | WhatsApp'ta paylaş
  • İnsanlar sanki htmx, SPA çağında web’i kurtarıyormuş gibi konuşuyor
  • htmx’in yaratıcısı Carson Gross bu dinamiği esprili şekilde "Hegelci diyalektik" olarak açıklıyor:
    • tez (thesis): geleneksel MPA
    • antitez (antithesis): SPA
    • sentez (synthesis): hipermedya tabanlı etkileşimli adacıklardan oluşan bir uygulama
  • Ama ben bunu görmedim ve bir süre önce "htmx ile bir SPA yaptım"
  • Bu, basit bir ToDo liste uygulamasının PoC’si
    • Sayfa yüklendikten sonra artık sunucuyla iletişim kurmuyor
    • Her şey istemcide yerel olarak işleniyor
    • htmx ağ üzerinden hipermedya alışverişini yönetmeye odaklanıyorsa bu nasıl çalışıyor?
    • Basit bir numara var: "Sunucu tarafı" kodu bir Service Worker içinde çalışıyor

Service Worker

  • Web sayfası ile internet arasında bir proxy gibi çalışır
  • Ağ isteklerini yakalayıp değiştirebilir
  • İstekleri değiştirebilir, çevrimdışı kullanım için yanıtları önbelleğe alabilir ve isteği tarayıcı dışına göndermeden yeni yanıtlar üretebilir
  • Bu son özellik, bu tek sayfalı uygulamanın merkezinde yer alıyor
  • htmx ile bir ağ isteği yapıldığında Service Worker bunu yakalar
  • Ardından Service Worker iş mantığını çalıştırır ve yeni HTML üretir
  • htmx yeni HTML’yi DOM içinde değiştirir

Geleneksel SPA’lere göre avantajları

  • Service Worker depolama için IndexedDB kullanmak zorunda
  • Bu da sayfa yüklemeleri arasında durumu koruyor
  • Sayfayı kapatıp geri gelseniz bile uygulama verileri hatırlıyor
  • Bu, bu mimariyi seçtiğinizde "bedava" gelen yan faydalardan biri
  • Çevrimdışı çalışacak hale getirmek de kolay

Dezavantajlar

  • Geliştirici araçları desteği zayıf
    • console.log çıktıları zaman zaman kayboluyor
    • Service Worker’ın kurulup kurulmadığını gösterme konusunda güvenilir değil
  • Firefox’ta ES modül desteği yok
    • Tüm kodu tek bir dosyaya koymak gerekiyor
  • Genel geliştirme deneyimi "pek eğlenceli değil"

Buna rağmen htmx SPA iyi çalışıyor


Uygulama ayrıntıları

  • Temel HTML, tek sayfalı uygulamanın boş iskeleti
  • <body> etiketi htmx kullanarak uygulamanın gövdesini kuruyor
    • hx-boost="true": htmx’e, tam sayfa gezinmesi olmadan bağlantı tıklamalarını ve form gönderim yanıtlarını Ajax ile değiştirmesini söyler
    • hx-push-url="false": htmx’in bağlantı tıklamaları ve form gönderimleriyle URL’yi değiştirmemesini sağlar
    • hx-get="./ui": sayfa yüklendiğinde /ui adresinden içeriği alıp değiştirmesini söyler
    • hx-target="body": sonucu <body> öğesiyle değiştirmesini söyler
    • hx-trigger="load": sayfa yüklenince tüm bunları yapmasını söyler

/ui uç noktası

  • Uygulamanın gerçek işaretlemesini döndürür
  • Sonrasında htmx bağlantıları ve formları kontrol ederek bunu etkileşimli hale getirir
  • Service Worker, istek yönlendirmesini Express tarzı bir kütüphane ile ele alır
    • setFilter ve listTodos, IDB Keyval’i saran basit fonksiyonlardır
    • App bileşeni filtre formu, yapılacaklar listesi ve ekleme formundan oluşur

/todos/add uç noktası

  • Yapılacak öğeyi kaydettikten sonra arayüzü yeniden render eden bir yanıt döndürür
  • htmx bu yanıtı DOM içinde değiştirir

Todo bileşeni

  • Bir onay kutusu, silme düğmesi ve yapılacak metninden oluşur
  • Onay kutusu /todos/${id}/update isteğini tetikler
  • Silme düğmesi /todos/${id} silme isteğini tetikler
  • Yapılacak metninin iki durumu vardır: "normal" ve "editing"
    • htmx çift tıklama olayını dinler
    • /ui/todos/${id}?editable=true isteğini yapar
    • Service Worker, içinde <input> bulunan Todo HTML’sini döndürür
    • htmx yanıtın HTML’siyle mevcut yapılacak öğeyi değiştirir

Özet

  • Teknik olarak çalışıyor
  • İyi bir fikir mi? Gerçekten hipermedya tabanlı uygulamaların zirvesi mi? React’i bırakıp bunu mu yapmalıyız?
  • Tamamen yerel bir uygulamada, htmx’in dolaylı yapısı özgürleştirici olmaktan çok yük gibi hissettiriyor
  • Çoğu uygulama zaten tamamen yerel değil
  • "Etkileşimli adacıklar (islands of interactivity)" deseninin, "sunucu tarafı" kodunu Service Worker ile gerçek sunucu arasında bölmekten daha iyi olduğunu düşünüyorum
  • Bu, hipermedya ile tamamen yerel bir tek sayfalı uygulama kurmanın nasıl göründüğünü göstermek için yapılan deneysel bir denemeydi

Henüz yorum yok.

Henüz yorum yok.