परिचय: बिना रीलोड के URL बदलना क्यों एक सुपरपावर है
\n\nकल्पना करें: आप एक आधुनिक वेब सेवा खोलते हैं - मान लीजिए, एक ईमेल क्लाइंट या ऑनलाइन दस्तावेज़ संपादक। आप फ़ोल्डर्स के बीच स्विच करते हैं, ईमेल खोलते हैं, सेटिंग्स बदलते हैं - और पेज रीलोड नहीं होता। इस बीच, ब्राउज़र का एड्रेस बार बदलता है, 'पीछे' और 'आगे' बटन काम करते हैं, और बुकमार्क सही स्थिति सहेजते हैं। यह कैसे काम करता है? पेज को रीलोड किए बिना URL संशोधन का जादू।
\n\nयह सिर्फ एक 'फीचर' नहीं है - यह उच्च-प्रदर्शन वाले सिंगल-पेज एप्लिकेशन (SPA) का आधार है। एक समय में, डेवलपर्स हैश (#) का उपयोग करते थे, लेकिन यह भद्दा और असुविधाजनक था। आज हमारे पास History API है - एक शक्तिशाली उपकरण जो आपको बिना किसी झिलमिलाहट, बिना स्थिति खोए, बिना अनावश्यक HTTP अनुरोधों के तुरंत URL बदलने की अनुमति देता है।
\n\nइस लेख में, हम देखेंगे कि pushState और replaceState कैसे काम करते हैं, वे प्रदर्शन को कैसे प्रभावित करते हैं, और अनुकूलन करते समय गलतियों से कैसे बचें। चलिए शुरू करते हैं!
मूल बातें: History API और इसकी विधियाँ
\n\nHTML5 विनिर्देश ने हमें window.history इंटरफ़ेस दिया। बिना रीलोड के URL बदलने के लिए दो मुख्य विधियाँ हैं - pushState और replaceState।
pushState - इतिहास में एक नई प्रविष्टि जोड़ें
\n\npushState ब्राउज़र के इतिहास में एक नई प्रविष्टि बनाता है। उपयोगकर्ता 'पीछे' बटन दबाकर पिछले URL पर वापस जा सकता है।
// सिंटैक्स\nhistory.pushState(state, title, url);\n\n// उदाहरण\nhistory.pushState({ page: 1 }, 'होम', '/home');\n\n\nपैरामीटर:
\n- \n
- state - इस प्रविष्टि से जुड़ा डेटा ऑब्जेक्ट। आप कोई भी सीरियलाइज़ेबल डेटा स्टोर कर सकते हैं (जैसे, फ़िल्टर की स्थिति, एलिमेंट का ID)। \n
- title - पेज का शीर्षक (अधिकांश ब्राउज़र इसे अनदेखा करते हैं, लेकिन खाली स्ट्रिंग या सार्थक टेक्स्ट देना बेहतर है)। \n
- url - नया URL। यह रिलेटिव या एब्सोल्यूट होना चाहिए, लेकिन उसी origin (प्रोटोकॉल + डोमेन + पोर्ट) के भीतर होना चाहिए। \n
replaceState - वर्तमान प्रविष्टि को बदलें
\n\nreplaceState इतिहास में वर्तमान प्रविष्टि को बदलता है, कोई नई प्रविष्टि नहीं बनाता। उपयोगकर्ता पिछले URL पर 'पीछे' नहीं जा सकेगा - इसे बदल दिया जाएगा।
// सिंटैक्स\nhistory.replaceState(state, title, url);\n\n// उदाहरण - फ़िल्टर बदलने पर URL अपडेट करें\nfunction applyFilter(filterName) {\n history.replaceState({ filter: filterName }, '', `?filter=${filterName}`);\n updateUI(filterName);\n}\n\n\npopstate - इतिहास में बदलाव सुनें
\n\nजब उपयोगकर्ता 'पीछे' या 'आगे' बटन दबाता है, तो ब्राउज़र popstate इवेंट उत्पन्न करता है। महत्वपूर्ण: pushState और replaceState इस इवेंट को ट्रिगर नहीं करते - इसे अलग से संभालना होगा।
window.addEventListener('popstate', function(event) {\n if (event.state) {\n // event.state से डेटा का उपयोग करके स्थिति पुनर्स्थापित करें\n restorePageState(event.state);\n } else {\n // यदि state खाली है - संभवतः उपयोगकर्ता हमारे एप्लिकेशन की सीमा से बाहर चला गया\n loadDefaultState();\n }\n});\n\n\nप्रदर्शन अनुकूलन: क्या जानना महत्वपूर्ण है
\n\nURL संशोधन तेज़ है। लेकिन कुछ बारीकियाँ हैं जो सुपरपावर को बग का स्रोत बना सकती हैं।
\n\n1. pushState को बहुत बार कॉल न करें
\n\nप्रत्येक pushState कॉल इतिहास में एक प्रविष्टि जोड़ता है। यदि आप इसे हर माउस मूवमेंट या खोज में हर अक्षर पर कॉल करते हैं - तो इतिहास फूल जाएगा, और उपयोगकर्ता को फ़िल्टर से बाहर निकलने के लिए 100 बार 'पीछे' दबाना होगा। मध्यवर्ती स्थितियों के लिए replaceState का उपयोग करें, और तार्किक रूप से पूर्ण क्रियाओं (जैसे, नया पेज खोलना) के लिए pushState का उपयोग करें।