htmx 4.0: Neler Bozuluyor ve Sürüm Sizi Bozmamak İçin Ne Yapıyor?
htmx 4.0 kalıtımı açık hale getiriyor ve hata yanıtlarını da swap ediyor. Asıl ders ise yayın süreci: latest etiketi 2.x'te kalıyor, sürümle birlikte bir kontrol aracı geliyor ve kritik davranışların her biri için geri alma ayarı sunuluyor.
Umut Korkmaz
Yayın tarihi: 4 dk okuma
Bu sayfada6
htmx 4.0.0, ekibin sekiz aylık çalışma olarak tanımladığı sürecin ardından 28 Ağustos'ta yayınlandı. Öne çıkan değişiklikler gerçekten önemli: attribute kalıtımı artık isteğe bağlı (opt-in), event isimleri yeni bir şemaya geçti, history artık sayfaları localStorage içinde önbelleğe almıyor ve iç yapı XMLHttpRequest'ten fetch()'e taşındı. Yine de benim dikkatimi asıl çeken, sürümün ne kadar özenle aşamalandırıldığı oldu.
Neler değişti
Duyuruya göre kullanıcı açısından htmx 4, htmx 2 ile neredeyse aynı. Üç büyük değişiklik var:
- Kalıtım artık açık. htmx 2'de üst elemandaki
hx-confirmgibi bir attribute alt elemanlara da uygulanıyordu. htmx 4'te bunu bir sonekle açıkça belirtmeniz gerekiyor:hx-confirm:inherited="Are you sure?". Artık gerek kalmadığı içinhx-disinheritkaldırıldı. Ekip, yükseltmedeki en büyük yükün bu olduğunu söylüyor. - Event'ler
htmx:phase:actiondüzenini izliyor.htmx:beforeRequest,htmx:before:requestoluyor;htmx:afterSwap,htmx:after:swapoluyor. Hata event'lerinin çoğu tek birhtmx:erroraltında toplanıyor, HTTP hataları isehtmx:response:errortetikliyor.htmx:xhr:*vehtmx:validation:*event'leri kaldırıldı. - History sayfayı yeniden çekiyor. Geri gidildiğinde htmx sayfayı yeniden fetch ediyor ve
<body>içine swap ediyor. EskilocalStoragesnapshot'ı, üçüncü parti script'lerin yaptığı DOM değişikliklerini de saklayabiliyordu; oysa geri yüklemeden sonra bu script'lerin mantığı ortada olmuyordu. Önbelleklemeyi hâlâ istiyorsanızhx-history-cacheextension'ısessionStorageüzerinden geri yükleme yapıyor.
Yenilikler tarafında ise yerleşik morph swap'lar (idiomorph tabanlı innerMorph ve outerMorph) ve tek bir yanıttan birden fazla elemanı hedefleyen <hx-partial> etiketi var. Bu etiket, out-of-band swap'lara göre daha anlaşılır bir alternatif olarak sunuluyor.
Sessizce bozulan değişiklikler
What's New in htmx 4 rehberi, duyurudakinden daha fazla breaking change listeliyor. Bunlarda gözle görülür bir şey kırılmıyor; uygulama sadece farklı davranmaya başlıyor:
- htmx 4,
204ve304dışındaki tüm HTTP yanıtlarını swap ediyor. Sunucunuz 422 veya 500 ile bir HTML hata sayfası dönüyorsa, bu sayfa artık hedef elemanın içine düşüyor. htmx 2, 4xx ve 5xx yanıtlarını swap etmiyordu. - Varsayılan timeout artık 60 saniye. htmx 2'de hiç timeout yoktu.
hx-deleteartık kapsayan formun input'larını dahil etmiyor. Rehberin önerdiği çözümhx-include="closest form".- Out-of-band elemanlar artık ana içerikten önce değil, sonra swap ediliyor.
hx-disable,hx-ignoreoluyor;hx-disableise artık eskidenhx-disabled-elt'nin yaptığı işi yapıyor. Rehber,hx-disableyeniden adlandırmasını yükseltmeden önce vehx-disabled-elt'yi yeniden adlandırmadan önce yapmanızı söylüyor.
Duyuru sayfasındaki örnek upgrade checker çıktısı en sinsi durumu gösteriyor. Üst elemanda CSRF token taşıyan bir hx-headers attribute'u, :inherited olmadan artık alt elemanlara ulaşmıyor ve sunucu isteği reddediyor. Log'larınızda bu büyük ihtimalle bir htmx sorunu gibi değil, bir CSRF ya da yetkilendirme sorunu gibi görünecek.
Yayın mekaniği örnek alınmaya değer
latest2.x'te kalıyor. 4.0 serisi, 2027'nin başlarındaki bir tarihe kadar npm'denextolarak etiketleniyor; çünkü ekip, htmx'i versiyonsuz CDN URL'lerinden yükleyenleri zorla yükseltmek istemiyor.- Sürümle birlikte bir kontrol aracı geliyor.
npx [email protected] upgrade-check -- ./templateseksik:inheritedsoneklerini, yeniden adlandırılmış ve kaldırılmış attribute'ları, eski event isimlerini ve kaldırılmış API çağrılarını dosya ve satır numarasıyla raporluyor. - En riskli davranış değişiklikleri geri alma ayarlarıyla geliyor.
htmx.config.implicitInheritance = true,htmx.config.noSwap = [204, 304, '4xx', '5xx']vehtmx.config.defaultTimeout = 0; bunlara ek olarak htmx 2 varsayılanlarını ve event isimlerini geri getiren birhtmx-2-compatextension'ı var.fetch()geçişinin geri alınamayacağı açıkça belirtilmiş. Rehberde out-of-band sıralama değişikliği için bir ayar listelenmiyor. - htmx 2 süresiz olarak destekleniyor, dolayısıyla bir son tarih baskısı yok.
- LLM'ler için bir upgrade skill'i var: rehberlik ve debugging skill'lerinin yanında
htmx-upgrade-from-htmx2.
Hepsini bir araya koyunca bir ekip, breaking change'lerin tam listesini bilen bir araçla, davranışları tek tek taşıyabiliyor. Kendi paketlerimde, örneğin NuGet'teki Meridian'da, ileride breaking bir sürüm çıkarmayı düşündüğümde ilk kopyalayacağım iki fikir bu kontrol aracı ve davranış bazlı ayarlar olur. Changelog insanlara neyin değiştiğini söyler. Kontrol aracı ise bunun kodlarında nereye dokunduğunu gösterir.
Pazartesi neyi kontrol ederdim
Bir ekip htmx 2 kullanıyorsa listem şu:
- Versiyonsuz htmx script URL'lerini bulun ve tam bir sürüme sabitleyin.
latestşimdilik güvenli, ama yalnızca 2027'nin başlarına kadar. - Kontrol aracını bir branch üzerinde çalıştırın. Varsayılan tarama
.html,.php,.js,.ts, Jinja, ERB ve Handlebars dosyalarını kapsıyor. Razor view'ları veya diğer template türleri için--extgerekiyor, örneğin--ext .cshtml. - 4xx veya 5xx durumunda HTML dönen her endpoint'i listeleyin ve ne olması gerektiğine karar verin: bunu swap edilecek içerik olarak tasarlayın,
hx-status:422="swap:innerHTML target:#errors"ile status bazında yönlendirin ya danoSwapile eski davranışı koruyun. - JavaScript kodunuzda eski event isimlerini grep'leyin. Kontrol aracı
hx-onattribute'larına ve yapabildiği ölçüde script'lere bakıyor, ama özel event bağlantıları için elle bir tur geçmek gerekiyor. - Export ve raporlar gibi, yeni 60 saniyelik varsayılan timeout'tan uzun sürebilecek yavaş istekleri tespit edin.
Benim yorumum
htmx 4 makul bir major sürüm, ama asıl ders yayın mühendisliğinde. latest'i eski seride tutmak, bir kontrol aracı sunmak ve en riskli davranış değişikliklerine kendi geri alma ayarlarını vermek, tek bir riskli migrasyonu birkaç küçük adıma bölüyor. Üstelik htmx 2 süresiz desteklendiği için çoğu ekip için doğru ilk adım yükseltme değil. İlk adım sürümü sabitlemek ve kontrol aracını çalıştırmak, ardından yükseltmeyi planlamak.
Kaynaklar
Bu yazıda yararlanılan birincil kaynaklar.