- URL की संरचना सिर्फ एक साधारण पता नहीं, बल्कि application state को store और restore करने का माध्यम भी है
- PrismJS download page की तरह, ऐसे उदाहरण दिखाए गए हैं जहाँ एक ही URL से theme, language और plugin settings पूरी तरह reproduce की जा सकती हैं
- path, query parameter, fragment जैसे हर component से hierarchical navigation, filtering, client navigation जैसी अलग-अलग state व्यक्त की जा सकती है
- search filter, pagination, view mode, date range जैसी चीज़ें URL में शामिल करने के लिए उपयुक्त हैं, जबकि sensitive information या अस्थायी UI state इसके लिए उपयुक्त नहीं हैं
- अच्छी तरह डिज़ाइन किया गया URL shareability, predictability, caching efficiency बढ़ाता है और web application की reliability और user experience को मजबूत करता है
URL की क्षमता
- URL सिर्फ resource address नहीं है, यह user interface (UI) और state container के रूप में भी काम करता है
- sharing, bookmark, browser history, deep link आदि में state को अपने-आप preserve करता है
- 1991 से web के बुनियादी state management mechanism के रूप में काम कर रहा है
- URL का हर component अलग तरह की state व्यक्त करता है
- path: hierarchical resource navigation (
/users/123/posts)
- query: filter, option, setting (
?theme=dark&lang=en)
- fragment: document के भीतर location या SPA routing (
#features, #/dashboard)
- Text Fragments फीचर page के भीतर किसी खास text पर सीधे link करना संभव बनाता है
Query parameter patterns
- delimiter से एक key में कई values रखना (
?tags=frontend,react,hooks)
- nested data को JSON या Base64 में serialize करना (
?config=eyJyaWNrIjoicm9sbCJ9==)
- boolean flag को key की मौजूदगी से दिखाना (
?mobile)
- array notation (bracket notation) में
tags[]=frontend&tags[]=react जैसे multi-value expression
- Node के
qs या Express middleware आदि इसे अपने-आप पहचान लेते हैं, लेकिन यह standardize नहीं है
- सबसे महत्वपूर्ण बात है consistency बनाए रखना
URL के जरिए state व्यक्त करने के उदाहरण
- PrismJS: URL hash में पूरा theme, language, plugin configuration store करता है
- GitHub:
#L108-L136 से code line range को highlight करता है
- Google Maps: coordinate, zoom level, map type को URL में शामिल करता है
- Figma: canvas position, zoom, selected element जैसे work context को URL से share करता है
- e-commerce sites: filter, sorting, price range को URL में रखकर search state restore करती हैं
Frontend engineering patterns
- URL में शामिल करने के लिए उपयुक्त state
- search term, filter, page/sort, view mode, date range, active tab, UI configuration, feature flag
- URL के लिए अनुपयुक्त state
- password, token जैसी sensitive information, temporary UI state, unsaved input, large data, high-frequency state
- निर्णय का मानदंड: क्या किसी दूसरे user को यही URL खोलने पर वही state दिखनी चाहिए?
JavaScript implementation
URLSearchParams API से query parameter पढ़े और लिखे जा सकते हैं
pushState से नया history entry जोड़ना, replaceState से मौजूदा entry को update करना
popstate event से browser back action पर UI restore करना
React implementation
- React Router का
useSearchParams hook URL state को संक्षेप में manage करने देता है
- parameter पढ़ते या update करते समय URL और UI अपने-आप sync होते हैं
URL state management की best practices
- default values को URL में शामिल न करें (
?theme=dark ही रखें, default value code में handle करें)
- debouncing से typing के दौरान URL के excessive update को रोकें (
lodash.debounce का उपयोग)
- pushState vs replaceState
pushState: filter change, page navigation जैसी undo की जा सकने वाली state
replaceState: search input जैसी सूक्ष्म edits
URL को contract की तरह देखना
- अच्छी तरह डिज़ाइन किया गया URL application और user के बीच explicit contract का काम करता है
- public/private, client/server, shared/session state की सीमाएँ साफ करता है
- readable URL इरादा स्पष्ट करते हैं और इंसान व मशीन दोनों के लिए समझने योग्य होते हैं
example.com/products/laptop?color=silver&sort=price जैसी संरचना अर्थ स्पष्ट करने में बेहतर है
- caching efficiency में सुधार
- एक जैसा URL एक जैसे resource के रूप में माना जाता है, जिससे cache hit rate बढ़ता है
- query parameter से cache variation को control किया जा सकता है
- versioning और experiment
?v=2, ?beta=true, ?experiment=new-ui आदि से API version या A/B test को अलग किया जा सकता है
जिन anti-patterns से बचना चाहिए
- SPA में सिर्फ in-memory state रखना, जिससे refresh पर state खो जाती है
- sensitive information को URL में डालना (
?password=secret123)
- अस्पष्ट parameter names (
?foo=true&bar=2 की जगह ?mobile=true&page=2)
- जटिल JSON को Base64 में encode करके बहुत लंबा URL बनाना
- URL length limit पार करना (browser, server, CDN constraints मौजूद हैं)
- back button को बेअसर करना (
replaceState के अत्यधिक उपयोग से)
निष्कर्ष
- अच्छा URL सिर्फ content की ओर इशारा नहीं करता, बल्कि user और application के बीच संवाद भी व्यक्त करता है
- URL intent, context, shareability को समेटने वाला सबसे पुराना और elegant state management माध्यम है
- Redux, MobX, Zustand, Recoil जैसे complex state management tools मौजूद हैं, लेकिन
URL जैसी बुनियादी क्षमता को न भूलना ही web की असली ताकत है
- जो app refresh पर state खो देता है, वह web की मूल प्रकृति को खो रहा है
2 टिप्पणियां
Hacker News राय
कोड रिव्यू के समय मैं कोशिश करता हूँ कि जितना संभव हो उतना state URL में रखा जाए
refresh के बाद पूरी तरह किसी दूसरी जगह पहुँच जाना, या share किया हुआ URL किसी अजीब स्क्रीन को दिखाना, यूज़र के नज़रिए से अपमानजनक है
यह तरीका development की रफ़्तार धीमी करता है, लेकिन टीम के भीतर UX को लेकर समझ बढ़ाता है और यह स्पष्ट करता है कि view में कितना state भरा जा रहा है
यह चिंता भी रहती है कि URL एक तरह का public API बन जाता है और उससे constraints पैदा होते हैं, लेकिन ज़्यादातर URL थोड़े समय के लिए ही उपयोग होते हैं, इसलिए मुझे यह बहुत बड़ी समस्या नहीं लगती
ज़रूरत पड़े तो load के समय पुराने URL को नए URL में migrate करने वाले code से इसे संभाला जा सकता है
path की जगह query parameters इस्तेमाल करना थोड़ा बेहतर लगता है
यूज़र के नज़रिए से “back” शब्द browser button से जुड़ा होता है, इसलिए यह भ्रम पैदा करता है
refresh से state reset हो जाना कम परेशान करता है, क्योंकि “refresh = शुरुआत से फिर” जैसी समझ बनी हुई है
जब सब कुछ JS से संभालते हैं, तो ऐसी बुनियादी सुविधाएँ हल्के-हल्के टूट जाती हैं
लेकिन अब तक 30 से ज़्यादा UX designers के साथ काम करने पर भी मुझे URL के बारे में कभी कोई guideline नहीं मिली
खासकर mobile पर page को शुरुआती state में लौटाना मुश्किल होता है, इसलिए refresh सबसे तेज़ समाधान बन जाता है
infinite scroll या complex filter UI में URL में जितना अधिक state होगा, reset करना उतना ही झंझट वाला हो जाता है
अगर पहले से ही UX को लेकर असंतोष हो, और ऊपर से URL भी साफ़-सुथरा करना पड़े, तो यह यूज़र के लिए दोहरा stress है
मुझे लगता है कि digital literacy ऊँची रखने वाले लोगों की भी URL और DNS की समझ कमज़ोर होती है
phishing के जोखिम को कम करने, URL parameters (
?t=_,utm_) के अर्थ को समझने, और share करने से पहले निजी जानकारी हटाने की क्षमता होनी चाहिएयह भी समझना चाहिए कि HTTPS का lock icon ‘trust’ का मतलब नहीं होता
URL को state container की तरह इस्तेमाल करने से आंतरिक संरचना expose हो जाती है, और versioning की ज़रूरत पड़ती है
अलग-अलग browsers की compatibility या authentication flow में भी समस्याएँ आ सकती हैं
फिर भी मैं command-line arguments की तरह जितना संभव हो उतना state URL में expose करने की कोशिश करता हूँ
लेकिन यह एक जानबूझकर किया गया trade-off है, अज्ञान या अनुभव की कमी की वजह से नहीं
पुरानी library है, लेकिन अब भी उपयोगी Rison की सिफारिश करता हूँ
इससे JSON को URL में साफ़-सुथरे तरीके से रखा जा सकता है, और Elastic की Kibana में भी इसका उपयोग होता है
उदाहरण: http://example.com/service?query=q:'*',start:10,count:10
सिस्टम विकसित होता है तो state structure भी बदलती है, इसलिए URL में state डालने से evolution सीमित हो जाती है
क्योंकि URL मूल रूप से एक स्थायी string है
इसके बजाय URL को एक तरह का protocol मानकर state को encode और decode करना मुझे ज़्यादा उचित लगता है
अगर page simple हो, तो पूरा state URL में रखना भी संभव है
लेकिन feed जैसी चीज़ों में यह इस user expectation पर निर्भर करता है कि “refresh करने पर क्या इसे latest state पर लौटना चाहिए?”
URL length limit browser, server, CDN, और search engine settings के अनुसार अलग-अलग होती है, लेकिन आमतौर पर 2000 characters से कम मानी जाती है
सवाल यह है कि इस सीमा के भीतर कितना state रखा जा सकता है, या फिर किसी दूसरे approach की ज़रूरत पड़ेगी
- . _ ~) होते हैं, इसलिए information density काफ़ी अधिक हैdraw.io पूरा state URL में रखकर share करने देता है
diagram data Base64 में encoded होता है, इसलिए सिर्फ़ एक link से पूरा restore संभव है
हालाँकि मुझे यक़ीन नहीं कि यह ‘state container’ की परिभाषा में पूरी तरह फिट बैठता है या नहीं
मैं self-hosted apps में hash routing (#/dashboard) का उपयोग करता हूँ
इससे server-side URL rewrite (.htaccess आदि) की ज़रूरत नहीं पड़ती, इसलिए यह परफ़ेक्ट न होते हुए भी deployment environment constraints को कम कर देता है
नया Microsoft Teams हर स्क्रीन को एक ही URL से संभालता है, इसलिए bookmark करना संभव नहीं है
किसी खास team या channel को सीधे नहीं खोला जा सकता, जो बहुत असुविधाजनक है
HATEOAS का नाम अच्छा नहीं है, इसलिए शायद उसे ज़्यादा ध्यान नहीं मिला, लेकिन आख़िरकार यह web की बुनियादी अवधारणा ही है
लेकिन जहाँ server और client दोनों पर पूरा control हो, वहाँ इससे सिर्फ़ अतिरिक्त complexity पैदा होती है
खासकर अगर client को फिर भी endpoint structure जानना पड़े, तो URL को opaque बनाने के अलावा इससे कुछ हासिल नहीं होता
मैं tab sleep feature का काफ़ी इस्तेमाल करता हूँ, लेकिन जो web apps URL को फिक्स करके एक ही ब्लॉक की तरह चलते हैं, वे sleep mode में जाते ही जानकारी खो देते हैं.
लेकिन ऐसी web pages भी हर बार इतनी भारी होती हैं कि sleep को बंद करके रखना भी मुमकिन नहीं होता.