- लोग htmx के बारे में ऐसे बात करते हैं मानो वह SPA की दुनिया में वेब को बचा लेगा
- htmx के निर्माता Carson Gross इस गतिशीलता को मज़ाकिया ढंग से "हेगेलियन द्वंद्ववाद" के रूप में समझाते हैं:
- प्रतिज्ञान (thesis): पारंपरिक MPA
- प्रतिपक्ष (antithesis): SPA
- संश्लेषण (synthesis): hypermedia-आधारित interactive islands से बना application
- लेकिन मुझे इसमें वह बात नहीं दिखी, और मैंने पहले ही "htmx से SPA बनाया" था
- यह एक साधारण ToDo list app का PoC है
- पेज लोड होने के बाद सर्वर से आगे कोई संचार नहीं होता
- सब कुछ लोकल रूप से client पर ही प्रोसेस होता है
- अगर htmx नेटवर्क के ज़रिये hypermedia exchange को मैनेज करने पर केंद्रित है, तो यह कैसे काम करता है?
- एक सरल ट्रिक: "Server-Side" कोड Service Worker में चलता है
Service Worker
- यह web page और internet के बीच proxy की तरह काम करता है
- यह network requests को intercept और modify कर सकता है
- request बदल सकता है, offline के लिए response cache कर सकता है, और request को browser के बाहर भेजे बिना नया response generate कर सकता है
- यही आख़िरी क्षमता इस single-page app का मूल है
- जब htmx network request करता है, Service Worker उसे intercept कर लेता है
- फिर Service Worker business logic चलाता है और नया HTML generate करता है
- htmx उस नए HTML को DOM में swap कर देता है
मौजूदा SPA की तुलना में फायदे
- Service Worker को storage के लिए IndexedDB इस्तेमाल करना पड़ता है
- इससे पेज लोड्स के बीच state बनी रहती है
- आप पेज बंद करके वापस आएँ, तब भी app डेटा याद रखता है
- इस architecture को चुनने पर यह एक तरह का "मुफ़्त" side benefit है
- इसे offline पर भी चलाना आसान है
नुकसान
- developer tools का support कमज़ोर है
console.log कभी-कभी छूट जाता है
- Service Worker install हुआ या नहीं, इसकी रिपोर्ट भरोसेमंद नहीं होती
- Firefox में ES modules का support नहीं है
- सारा कोड एक ही फ़ाइल में रखना पड़ता है
- कुल मिलाकर development experience "मज़ेदार" नहीं है
इसके बावजूद htmx SPA ठीक से काम करता है
implementation details
- बेसिक HTML single-page app का एक खाली shell है
<body> टैग htmx का इस्तेमाल करके app के मुख्य हिस्से को सेट करता है
hx-boost="true": htmx को निर्देश देता है कि full-page navigation के बिना link clicks और form submissions के response को Ajax से replace करे
hx-push-url="false": htmx को link clicks और form submissions के साथ URL बदलने से रोकता है
hx-get="./ui": पेज लोड होने पर /ui से पेज fetch करके replace करने का निर्देश देता है
hx-target="body": result को <body> element में replace करने का निर्देश देता है
hx-trigger="load": पेज लोड पर यह सब करने का निर्देश देता है
/ui endpoint
- यह app का वास्तविक markup लौटाता है
- इसके बाद htmx links और forms को control करके इसे interactive बनाता है
- Service Worker request routing को Express-style library से संभालता है
setFilter और listTodos IDB Keyval को wrap करने वाले सरल functions हैं
App component filter form, todo list, और add form से बना है
/todos/add endpoint
- todo सेव करने के बाद UI को दोबारा render किया हुआ response लौटाता है
- htmx उस response को DOM में replace कर देता है
Todo component
- यह checkbox, delete button, और todo text से बना है
- checkbox
/todos/${id}/update request trigger करता है
- delete button
/todos/${id} delete request trigger करता है
- todo text की दो states हैं: "normal" और "editing"
- htmx double-click event सुनता है
/ui/todos/${id}?editable=true request करता है
- Service Worker
<input> के साथ Todo HTML लौटाता है
- htmx response के HTML से मौजूदा todo item को replace कर देता है
सारांश
- तकनीकी रूप से यह काम करता है
- लेकिन क्या यह अच्छा विचार है? क्या यह सचमुच hypermedia-आधारित app का शिखर है? क्या React छोड़कर हमें इसे इसी तरह बनाना चाहिए?
- पूरी तरह local app में htmx की यह indirection आज़ादी से ज़्यादा बोझ लगती है
- ज़्यादातर apps पूरी तरह local नहीं होते
- मेरे हिसाब से "islands of interactivity" पैटर्न, "server-side" code को Service Worker और असली server में बाँटने से बेहतर है
- यह एक प्रयोगात्मक कोशिश थी, ताकि दिखाया जा सके कि hypermedia से पूरी तरह local single-page app बनाया जा सकता है
अभी कोई टिप्पणी नहीं है.