HTMX इतना शानदार लगा कि मैंने खुद ही बना लिया (2024)
(dbushell.com)- HTMX सर्वर-रेंडर्ड HTML को केंद्र में रखकर फ्रंटएंड को क्रमिक रूप से बेहतर बनाता है, और यह उस तरीके का विकसित रूप है जो React-शैली के आधुनिक JavaScript UI के भारी होने से पहले प्रचलित था
- अपनी self-hosted podcast web app के server refactoring में SvelteKit को DinoSsr से बदलने पर page navigation से audio playback रुकने की समस्या आई, और HTMX से `` क्षेत्र ही अपडेट करके audio component को बनाए रखा जा सका
- HTMX फ्रंटएंड library के रूप में वितरित होता है, लेकिन इसके implementation का बड़ा हिस्सा backend templates और server configuration में रहता है, और HTML लौटाने वाले HTTP requests व्यवहारतः HTMX API की भूमिका निभाते हैं
hx-*attributes, clickable `` examples, और inline JavaScript वाले कई advanced examples, declarative attribute templates की सीमाएँ और documentation से जुड़ी असंतुष्टि दिखाते हैं- खुद बनाए गए छोटे implementation में
304caching, History API, `` replacement, और pointer event आधारित preload मुख्य तत्व थे, और नतीजे में browser JavaScript घटा कर codebase को छोटा और सरल बनाया गया
HTMX की जगह
- HTMX आधुनिक JavaScript UI को अस्वीकार कर server-rendered HTML को प्राथमिकता देता है, और यह उस तरीके का विकसित रूप है जो React के कारण फ्रंटएंड के भारी हो जाने से पहले प्रचलित था
- infinite scroll और real-time search results HTMX के लोकप्रिय उदाहरण हैं, और HTMX React आदि जिन सभी समस्याओं को हल करना चाहते हैं उन्हें हल नहीं करता और सीमित दिख सकता है, लेकिन उन सीमाओं के भीतर यह बहुत मूल्यवान tool है
- HTMX कोई “magic bullet” नहीं है, और HTMX के पीछे के कुछ विचार HTMX स्वयं से भी अधिक महत्वपूर्ण हैं — यही मुख्य दृष्टिकोण है
प्रयोग
- सिर्फ documentation पढ़ना पर्याप्त नहीं था, इसलिए वास्तविक उपयोग का परीक्षण किया गया, और self-hosted podcast web app का server refactoring HTMX लागू करने का लक्ष्य बना
- पिछला implementation SvelteKit पर आधारित था, और SvelteKit पसंदीदा tool है, लेकिन छोटे websites के लिए यह कुछ भारी framework हो सकता है
- जिस चीज़ से प्रतिस्थापन किया गया वह स्वयं बनाया जा रहा DinoSsr था, और वही project static site builds और bookmark blog उपलब्ध कराने में भी इस्तेमाल होता है
- DinoSsr मुख्यतः server-side आधारित है, और frontend “islands” के रूप में components दे सकता है, लेकिन पूरी page interaction उपलब्ध नहीं कराता
- audio player component को page navigation के दौरान भी बना रहना चाहिए, और यदि navigation पर पूरी page reload हो जाए तो playback experience बहुत जल्दी टूट जाता है
- SvelteKit UI updates और frontend routing संभालता था, लेकिन नए build में केवल audio player component frontend JavaScript का उपयोग करता है और DinoSsr जानबूझकर client-side routing की कोशिश नहीं करता
- कुछ pages में केवल `` section अलग होता है, इसलिए HTMX से links को क्रमिक रूप से बेहतर बनाकर और सिर्फ यही क्षेत्र अपडेट करके पूरी page reload किए बिना audio component को बनाए रखा जा सकता था
- HTMX का उपयोग अच्छी तरह चला, लेकिन जल्द ही HTMX हटा दिया गया और उसी विचार पर आधारित अपने छोटे version में बदला गया
HTMX पर कुछ विचार
- इस प्रयोग में HTMX frontend Svelte का विकल्प था, लेकिन React की तरह तुरंत जोड़ देने वाला विकल्प नहीं बल्कि सोचने के तरीके में बड़ा बदलाव था
- HTMX frontend को क्रमिक रूप से बेहतर बनाने वाली JavaScript library के रूप में वितरित होता है, लेकिन इसका अधिकांश implementation backend में होता है, और server templates तथा configuration स्वयं तैयार करने पड़ते हैं
- HTML देने वाले HTTP requests व्यवहारतः HTMX API की भूमिका निभाते हैं, और सही caching के लिए HTTP headers सेट करने जैसी बारीकियाँ महत्वपूर्ण हैं
- standard
data-*attributes औरdatasetमौजूद होने के बावजूद non-standardhx-*prefixed attributes का उपयोग करना एक छोटी शिकायत है - HTMX documentation में `` examples बहुत हैं, और नीचे दिया गया example ऐसा ढाँचा दिखाता है जिसमें user
divपर click करने पर/messagesपरPUTrequest भेजता है और response उसीdivमें load हो जाता है
Put To Messages
- ऐसे examples जिनमें user को `` element पर click करना पड़े, उन्हें वांछनीय नहीं माना जा सकता — यह एक आलोचना है
- inline JavaScript इस्तेमाल करने वाले कुछ advanced HTMX examples कुछ गंदे लगते हैं, और declarative attribute templates की सीमाएँ दिखाते हैं
- आलोचनाओं के बावजूद HTMX सीमित लेकिन उपयोगी feature set देता है, और कई सामान्य web design patterns को बेहतर बनाने वाला tool है
खुद बनाना
- HTMX को सफलतापूर्वक जोड़ने के तुरंत बाद हटा दिया गया, और उसी विचार का उपयोग करके खुद एक छोटा version implement किया गया
- cached fetch requests की अनुमति देने के लिए
last-modified,if-modified-sinceHTTP headers और304responses का उपयोग किया गया - बुनियादी history integration के लिए
pushStateऔरpopstateका उपयोग किया गया - `` element को extract और replace करने वाला code जोड़ा गया, और HTMX preload extension से प्रेरित होकर pointer event आधारित preload को built-in किया गया
- pointer event आधारित preload,
clickevent होने से पहले fetch request शुरू कर देता है, जिससे हल्का performance improvement मिलता है - प्रयोगात्मक source code बहुत बुनियादी है, लेकिन यह दिखाता है कि browser में वास्तव में बहुत कम JavaScript की ज़रूरत होती है
- HTMX या “we have HTMX at home” तरीके से codebase काफ़ी छोटा और सरल हो गया
फ्रंटएंड JavaScript
- templates और components बहुत छोटे website से आगे बढ़ते ही code organization और reuse के लिए लगभग आवश्यक हो जाते हैं, और इन्हें PHP, Ruby, Go, JavaScript आदि के साथ server-side पर भी लागू किया जा सकता है
- इस संरचना को browser में दोहराने या केवल browser में ही लागू करने की ज़रूरत नहीं है, लेकिन React आदि की लोकप्रियता के कारण कई developers ने यह सवाल पूछना ही बंद कर दिया है
- frontend JavaScript fatigue वास्तविक है, और यह पुराने server templates को पसंद करने के साथ-साथ JS UI को ज़रूरत से ज़्यादा design करने के अनुभव से जुड़ी समस्या है
- भले ही HTMX स्वयं बहुत महान न लगे, इसकी philosophy इतनी मजबूत है कि वह आधुनिक JavaScript developers को शर्मिंदा कर देने लायक मूल्य रखती है
1 टिप्पणियां
Lobste.rs की राय
छोटी-सी आपत्ति है, लेकिन जहाँ
data-*इस्तेमाल होना चाहिए वहाँhx-*prefixed HTML attributes का इस्तेमाल मुझे खास पसंद नहीं है Htmx काफी समय सेdata-prefix को support करता है इस बात से सहमत हूँ कि यूज़र से `` element क्लिक नहीं करवाना चाहिए; इस मामले में anchors और form tags पर htmx काhx-boostइस्तेमाल करना सबसे अच्छा है। यह इन tags को सही तरीके से अपने-आप enhance कर देता है, इसलिए clickable divs से बचा जा सकता है यह ऐसा प्रोजेक्ट है जो दिखाता है कि browser को वास्तव में कितनी कम JavaScript चाहिए, और आगे चलकर इसका maintenance शायद बहुत कम होगा तथा security patches की भी लगभग ज़रूरत नहीं पड़ेगी। बधाई बनती हैHTMX सब कुछ render करता है, तो क्या यह server पर बहुत ज़्यादा load नहीं डालता? यह कुछ वैसा लगता है जैसा पहले CGI समस्या हुआ करती थी
इसी तरह की वजहों से मैं htmx से बहुत मिलता-जुलता alpine-ajax इस्तेमाल कर रहा हूँ
alpine-ajaxभी मुझे सच में बहुत पसंद है। अगर मैं “SSR से SPA के फायदे लेना” फिर से शुरू करता, तो शायद उसी दिशा में जाता क्योंकि client-side reactivity के लिए मैं वैसे भी alpine इस्तेमाल कर रहा हूँ। हाँ, अभी repository में htmx पहले से काफी जगह पर है, और htmx से कोई शिकायत भी नहीं है