सिंगल पेज ऐप्लिकेशन SEO: SPA रैंक क्यों नहीं कर पाते, SSR, स्टैटिक जनरेशन और प्रीरेंडरिंग इसे कैसे ठीक करते हैं, और अपने ऐप को AI क्रॉलर के लिए पठनीय कैसे बनाएँ।

इस पेज पर
AI से इस लेख का सार देखें
त्वरित क्विज़
आपकी साइट के तकनीकी पहलू कौन ठीक करे?
आपके लिए हमारी सलाह
हर व्यू को साफ़, क्रॉल योग्य URL दें आपके लिए सही समाधान है
इस रैंकिंग में नंबर 1, आपके जवाबों से सबसे मेल खाने वाला विकल्प।
आपके लिए हमारी सलाह
असली लिंक इस्तेमाल करें आपके लिए सही समाधान है
इस रैंकिंग में नंबर 2, आपके जवाबों से सबसे मेल खाने वाला विकल्प।
आपके लिए हमारी सलाह
हर रूट के लिए टाइटल, विवरण और कैनोनिकल अपडेट करें आपके लिए सही समाधान है
इस रैंकिंग में नंबर 3, आपके जवाबों से सबसे मेल खाने वाला विकल्प।
आपके लिए हमारी सलाह
ईमानदार स्टेटस कोड लौटाएँ आपके लिए सही समाधान है
इस रैंकिंग में नंबर 4, आपके जवाबों से सबसे मेल खाने वाला विकल्प।
संक्षेप में: सिंगल पेज ऐप्लिकेशन (SPA) एक ही HTML ढाँचा लोड करता है और हर व्यू ब्राउज़र में JavaScript से बनाता है। Google JavaScript को रेंडर कर सकता है, पर रेंडरिंग में देरी होती है और वह नाज़ुक होती है, और ChatGPT, Claude और Perplexity के पीछे चलने वाले क्रॉलर उसे बिल्कुल नहीं चलाते। रैंक करने और उद्धृत होने के लिए SPA के हर व्यू का अपना URL होना चाहिए, एक असली लिंक जिसमें href हो, एक अनोखा टाइटल और विवरण, सही स्टेटस कोड, और सबसे ज़रूरी, उसकी मुख्य सामग्री सर्वर के भेजे HTML में मौजूद हो, सर्वर-साइड रेंडरिंग, स्टैटिक जनरेशन या प्रीरेंडरिंग के ज़रिए।
सिंगल पेज ऐप्लिकेशन SEO उन तकनीकों का समूह है जो React, Vue, Angular या Svelte से बने JavaScript ऐप को एक पारंपरिक वेबसाइट जितना ही क्रॉल करने योग्य बनाती हैं। समस्या अच्छी तरह दर्ज है: Google अपनी JavaScript SEO की बुनियादी बातों में समझाता है कि वह JavaScript पेजों को तीन चरणों (क्रॉलिंग, रेंडरिंग, इंडेक्सिंग) में प्रोसेस करता है, और हर SPA की कमज़ोरी इसी पाइपलाइन में कहीं न कहीं होती है। यह गाइड SPA पर केंद्रित है; JavaScript साइटों की सामान्य जानकारी के लिए हमारी JavaScript SEO गाइड पढ़ें।
एक पारंपरिक वेबसाइट हर URL के लिए पूरा HTML दस्तावेज़ लौटाती है। SPA हर URL के लिए लगभग एक ही दस्तावेज़ लौटाता है: एक खाली <div id="root">, कुछ मेटा टैग और एक बड़ा JavaScript बंडल। ब्राउज़र बंडल डाउनलोड करता है, एक API बुलाता है, फिर पेज बनाता है। जब विज़िटर किसी लिंक पर क्लिक करता है, तो JavaScript बिना रीलोड के सामग्री बदल देता है।
तेज़ फ़ोन वाले इंसान के लिए नतीजा तुरंत लगता है। क्रॉलर के लिए पहला जवाब एक खाली ढाँचा होता है: कोई शीर्षक नहीं, कोई टेक्स्ट नहीं, कोई लिंक नहीं। सब कुछ इस पर टिका है कि बॉट JavaScript चलाता है या नहीं, और कब। यही एक तथ्य SPA SEO की ज़्यादातर समस्याएँ समझा देता है:
/#/pricing) से रूट करते हैं, और # के बाद का हिस्सा कभी सर्वर को नहीं भेजा जाता, इसलिए सारे व्यू एक URL में सिमट जाते हैं।<title> होता है, और अगर राउटर उसे अपडेट नहीं करता, तो हर पेज वही साझा करता है।href के लिंक: बटन और onClick हैंडलर उपयोगकर्ताओं के लिए नेविगेट करते हैं, पर क्रॉलर के लिए फ़ॉलो करने को कुछ नहीं देते।Googlebot पहले कच्चा HTML लाता है और उसमें मिले लिंक और निर्देश पढ़ता है। 200 स्टेटस लौटाने वाले पेज फिर Web Rendering Service की कतार में जाते हैं, जो एक हेडलेस Chromium है। Google कहता है कि पेज "इस कतार में कुछ सेकंड रह सकता है, पर उससे ज़्यादा समय भी लग सकता है"। रेंडर होने के बाद परिणामी HTML को फिर से सामग्री और लिंक के लिए पार्स किया जाता है, फिर इंडेक्स किया जाता है।
Google के दस्तावेज़ की चार बातें SPA के लिए मायने रखती हैं:
href वाले <a> तत्व भरोसेमंद लिंक हैं। JavaScript से डाले गए लिंक ठीक हैं, बशर्ते वे इसी फ़ॉर्मैट में हों।# रूट की जगह History API (pushState) इस्तेमाल करने को कहता है। उसने अपनी पुरानी AJAX क्रॉलिंग योजना (#! वाले URL) अक्टूबर 2015 में बंद कर दी थी।noindex जीतता है। noindex देखकर Google रेंडरिंग छोड़ सकता है, इसलिए बाद में JavaScript से उसे हटाने से कुछ नहीं होता।व्यावहारिक नतीजा: Google क्लाइंट-रेंडर्ड SPA को इंडेक्स कर सकता है, पर हर पेज में एक दूसरा चरण, देरी और विफलता का बिंदु जुड़ जाता है। रेंडरिंग के दौरान टाइमआउट, ब्लॉक हुई API कॉल या JavaScript त्रुटि इंडेक्स हुए संस्करण को खाली छोड़ देती है। Search Console के URL इंस्पेक्शन टूल से जाँचें कि Google क्या देखता है, और अगर पेज इंडेक्स से बाहर रहते हैं तो Google इंडेक्सिंग कैसे काम करती है पर हमारी गाइड पढ़ें।
ज़्यादातर नहीं। दिसंबर 2024 में प्रकाशित, अपने नेटवर्क के ट्रैफ़िक पर एक अध्ययन में Vercel और MERJ ने पाया कि "वर्तमान में कोई बड़ा AI क्रॉलर JavaScript रेंडर नहीं करता": GPTBot, OAI-SearchBot और ChatGPT-User (OpenAI), ClaudeBot (Anthropic), PerplexityBot, Meta-ExternalAgent और Bytespider, सब केवल कच्चा HTML पढ़ते हैं। वे JavaScript फ़ाइलें डाउनलोड करते हैं (ChatGPT के अनुरोधों का लगभग 11.5% और Claude के 23.8%), पर उन्हें चलाते नहीं। अपवाद हैं Gemini, जो Google के रेंडरिंग इन्फ़्रास्ट्रक्चर पर निर्भर है, और AppleBot, जो ब्राउज़र-आधारित क्रॉलर इस्तेमाल करता है।
क्लाइंट-रेंडर्ड SPA के लिए इसका मतलब है कि ChatGPT, Claude और Perplexity को चलाने वाले AI क्रॉलर एक खाली पेज देखते हैं। आपका प्रोडक्ट Google पर रैंक कर सकता है और फिर भी AI जवाबों में अदृश्य रह सकता है, क्योंकि सहायक ने उसका एक शब्द नहीं पढ़ा। यही बात सोशल नेटवर्क और मैसेजिंग ऐप के ज़्यादातर लिंक प्रीव्यू बॉट पर लागू होती है, जो कच्चे HTML के Open Graph टैग पढ़ते हैं। एक बार सामग्री HTML में आ जाए, तो यह भी जाँचें कि आपकी robots.txt चाहे गए AI क्रॉलर को अनुमति देती है।
समाधान है पहले ही जवाब में असली HTML भेजना। Google अपने डायनामिक रेंडरिंग दस्तावेज़ में डायनामिक रेंडरिंग (केवल बॉट को प्रीरेंडर्ड संस्करण देना) को "एक वर्कअराउंड, न कि अनुशंसित समाधान" कहता है, और इसके बजाय सर्वर-साइड रेंडरिंग, स्टैटिक रेंडरिंग या हाइड्रेशन की ओर इशारा करता है। नीचे की परिभाषाएँ web.dev पर Rendering on the Web संदर्भ का पालन करती हैं।
| रणनीति | यह कैसे काम करती है | पहले HTML में सामग्री | सबसे उपयुक्त | सीमाएँ |
|---|---|---|---|---|
| क्लाइंट-साइड रेंडरिंग (CSR) | ब्राउज़र JavaScript और API से पेज बनाता है | नहीं | डैशबोर्ड और लॉगिन के पीछे के पेज | Google पर देर से इंडेक्सिंग, ज़्यादातर AI क्रॉलर के लिए अदृश्य |
| सर्वर-साइड रेंडरिंग (SSR) | सर्वर हर अनुरोध पर HTML रेंडर करता है, फिर JavaScript उसे हाइड्रेट करता है | हाँ | कैटलॉग, लिस्टिंग, बार-बार बदलने वाली या निजीकृत सामग्री | सर्वर लागत, कैश न हो तो धीमा जवाब |
| स्टैटिक जनरेशन (SSG) | हर URL के लिए बिल्ड के समय HTML बनता है और CDN से परोसा जाता है | हाँ | मार्केटिंग पेज, ब्लॉग, दस्तावेज़, लैंडिंग पेज | सामग्री बदलने पर दोबारा बिल्ड चाहिए (आंशिक विकल्प मौजूद हैं) |
| बिल्ड समय पर प्रीरेंडरिंग | एक हेडलेस ब्राउज़र हर रूट की प्रारंभिक स्थिति को स्टैटिक HTML के रूप में कैप्चर करता है | हाँ | सार्वजनिक रूटों की सीमित संख्या वाले मौजूदा SPA | डेटा बिल्ड के समय जम जाता है, रूटों की सूची बनानी पड़ती है |
| डायनामिक रेंडरिंग | बॉट को प्रीरेंडर्ड स्नैपशॉट मिलता है, उपयोगकर्ता को SPA | हाँ, केवल सूचीबद्ध बॉट के लिए | पुराने ऐप के लिए अस्थायी समाधान | आधिकारिक रूप से वर्कअराउंड, रखरखाव लागत, बॉट को अलग सामग्री देने का जोखिम |
ज़्यादातर आधुनिक फ़्रेमवर्क आपको रूट के हिसाब से रणनीतियाँ मिलाने देते हैं: मार्केटिंग पेज स्टैटिक, कैटलॉग सर्वर-रेंडर्ड, और लॉगिन वाला ऐप क्लाइंट-रेंडर्ड। यह मिश्रित सेटअप वहाँ पूरा HTML देता है जहाँ खोज ट्रैफ़िक आता है, और जहाँ SPA का अनुभव मूल्य जोड़ता है वहाँ उसे बनाए रखता है।
| लाइब्रेरी | पहले लोड पर HTML के लिए फ़्रेमवर्क या सुविधा |
|---|---|
| React | Next.js (सर्वर कंपोनेंट, SSR और स्टैटिक जनरेशन), फ़्रेमवर्क मोड में React Router, Gatsby |
| Vue | Nuxt (डिफ़ॉल्ट रूप से यूनिवर्सल रेंडरिंग, स्टैटिक जनरेशन उपलब्ध) |
| Angular | Angular SSR (सर्वर रेंडरिंग और बिल्ड-टाइम प्रीरेंडरिंग) |
| Svelte | SvelteKit (डिफ़ॉल्ट रूप से सर्वर रेंडरिंग, रूट के हिसाब से प्रीरेंडरिंग) |
| इनमें से कोई भी | Astro (डिफ़ॉल्ट रूप से स्टैटिक HTML, इंटरैक्टिव द्वीप केवल जहाँ ज़रूरी हों वहाँ लोड) |
AI वेबसाइट बिल्डर से बनी साइटों का खास ज़िक्र ज़रूरी है: कई क्लाइंट-रेंडर्ड React ऐप एक्सपोर्ट करते हैं। अगर आपने ऐसे बिल्डर से साइट बनाई है, तो यह मान लेने से पहले कि Google और ChatGPT उसे पढ़ सकते हैं, हमारे Lovable SEO और GEO नोट्स देखें।
History API इस्तेमाल करें (/pricing, कभी /#/pricing नहीं), हर सामग्री का एक URL, और वही URL चाहे विज़िटर सीधे आए या ऐप के भीतर नेविगेशन से। हर URL नए टैब में खोलने पर सही सामग्री लोड करे, यही वह जाँच है जो क्रॉलर करता है।
हर नेविगेशन तत्व जो इंडेक्स योग्य पेज की ओर ले जाता है, एक <a href="/path"> होना चाहिए। फ़्रेमवर्क के लिंक कंपोनेंट (Link, NuxtLink, routerLink) यही मार्कअप देते हैं; div या button तत्वों पर कस्टम क्लिक हैंडलर नहीं देते। अच्छे लिंक आपके साइट आर्किटेक्चर को भी सहारा देते हैं: अगर कोई पेज लिंक नहीं है, तो क्रॉलर उसे शायद ही खोजते हैं।
हर रूट का अपना टाइटल, मेटा विवरण, कैनोनिकल और Open Graph टैग हो, जहाँ संभव हो सर्वर पर बना हुआ। क्या सेट करना है, यह हमारे मेटा टैग पेज पर है। एक ही कैनोनिकल टैग रखें: Google सिफ़ारिश करता है कि उसे HTML में सेट किया जाए, और अगर JavaScript उसे बदलता है, तो नतीजा मूल से टकराना नहीं चाहिए।
गायब उत्पाद और हटाए गए लेख 200 के साथ त्रुटि संदेश न लौटाएँ। SSR में सर्वर से असली 404 या 410 लौटाएँ। शुद्ध SPA में Google दो विकल्प मानता है: JavaScript से 404 देने वाले URL पर रीडायरेक्ट, या त्रुटि व्यू पर noindex robots मेटा टैग।
शीर्षक, मुख्य टेक्स्ट, कीमतें, FAQ और JSON-LD स्ट्रक्चर्ड डेटा सर्वर के जवाब में होने चाहिए, क्लिक या स्क्रोल के बाद लोड होने वाले नहीं। टैब के पीछे की सामग्री, जो माँग पर रेंडर होती है, या "और लोड करें" बटन के पीछे की सामग्री अक्सर छूट जाती है।
बंडल को रूट के हिसाब से बाँटें, जो पहले व्यू के लिए ज़रूरी न हो उसे टालें, और हाइड्रेशन के दौरान पूरे पेज को दोबारा रेंडर करने से बचें। ध्यान दें कि Chrome फ़ील्ड डेटा (CrUX) ऐप के भीतर के नेविगेशन के मेट्रिक्स को उस URL पर गिनता है जो विज़िटर ने पहले लोड किया था, इसलिए अपने मुख्य टेम्पलेट अलग-अलग जाँचें।
हर मुख्य टेम्पलेट के तीन संस्करणों की तुलना करें: कच्चा HTML (सोर्स देखें या कमांड-लाइन टूल से पेज लाएँ), Google का रेंडर किया HTML (URL इंस्पेक्शन, फिर "क्रॉल किया गया पेज देखें") और JavaScript बंद करके दिखने वाला पेज। अगर मुख्य टेक्स्ट केवल दूसरे संस्करण में दिखता है, तो AI क्रॉलर उसे नहीं देखते। हमारा मुफ़्त AI के लिए क्रॉलेबिलिटी ऑडिट और इंडेक्सेबिलिटी चेकर किसी भी URL पर ये जाँचें चलाते हैं।
| लक्षण | संभावित कारण | समाधान |
|---|---|---|
| Search Console में कई पेज "क्रॉल किया गया, अभी इंडेक्स नहीं" दिखाते हैं | रेंडरिंग से पहले खाली या लगभग एक-सा HTML | सार्वजनिक रूटों के लिए SSR, SSG या प्रीरेंडरिंग |
site: खोज में हर नतीजे पर एक ही टाइटल | हर रूट के लिए टाइटल अपडेट नहीं होता | सर्वर पर रूट-स्तर का हेड प्रबंधन |
| केवल होम पेज इंडेक्स है | हैश रूटिंग या बिना href वाले लिंक | History API और असली <a> लिंक |
| त्रुटि पेज इंडेक्स में दिखते हैं | सॉफ़्ट 404 (हर जगह 200 स्टेटस) | सर्वर 404, या 404 URL पर JavaScript रीडायरेक्ट, या noindex |
| Google पर रैंक करता है, पर ChatGPT या Perplexity कभी उद्धृत नहीं करते | सामग्री केवल JavaScript चलने के बाद दिखती है | पहले HTML जवाब में सामग्री |
| Google के रेंडर किए दृश्य में पुरानी सामग्री | कैश्ड JavaScript या CSS फ़ाइलें | फ़िंगरप्रिंट वाले फ़ाइल नाम |
सालों तक क्लाइंट-साइड रेंडरिंग एक संभालने योग्य जोखिम थी, क्योंकि Google अंततः JavaScript रेंडर कर देता था। अब खोज का एक हिस्सा ChatGPT, Claude, Gemini और Perplexity में होता है, इसलिए लागत बदल गई है: वह पेज जो केवल JavaScript चलने के बाद मौजूद होता है, उन स्रोतों से गायब है जिन्हें ज़्यादातर सहायक पढ़ सकते हैं। कच्चे HTML में क्रॉलेबिलिटी जेनरेटिव इंजन ऑप्टिमाइज़ेशन की पहली शर्त बन गई है।
एक बार HTML पूरा हो जाए, तो बाकी वही सामान्य नियम लागू होते हैं: जो पेज एक सवाल का साफ़ जवाब देते हैं, स्रोत वाले तथ्यों और स्ट्रक्चर्ड डेटा के साथ, वही सहायकों द्वारा उद्धृत होते हैं। Sorank की GEO ऑप्टिमाइज़ेशन सुविधाएँ ऐसी सामग्री लिखने और प्रकाशित करने में मदद करती हैं, और AI मेंशन ट्रैकिंग रेंडरिंग सुधार के बाद दिखाता है कि ChatGPT, Claude और Gemini आपके ब्रांड को उद्धृत करते हैं या नहीं।
सिंगल पेज ऐप्लिकेशन SEO का मुख्य नियम एक वाक्य में आ जाता है: जो कुछ आप चाहते हैं कि Google रैंक करे और AI उद्धृत करे, वह सर्वर के भेजे HTML में होना चाहिए। लॉगिन वाले अनुभव के लिए SPA रखें, सार्वजनिक पेज सर्वर पर या बिल्ड के समय रेंडर करें, फिर हर रिलीज़ से पहले और बाद में जाँचें कि बॉट क्या पाते हैं।
सिंगल पेज ऐप्लिकेशन को Google दंड नहीं देता, पर उसका डिफ़ॉल्ट सेटअप, यानी एक HTML ढाँचे वाली क्लाइंट-साइड रेंडरिंग, इंडेक्सिंग को धीमा और कम भरोसेमंद बनाता है। ज़्यादातर AI क्रॉलर JavaScript नहीं चलाते, इसलिए वे खाली पेज देखते हैं। सार्वजनिक रूटों पर सर्वर-साइड रेंडरिंग, स्टैटिक जनरेशन या प्रीरेंडरिंग के साथ SPA किसी भी पारंपरिक वेबसाइट जितना ही रैंक कर सकता है।
React अपने आप में तटस्थ है: मायने रखता है कि HTML कहाँ बनता है। केवल ब्राउज़र में रेंडर होने वाले React ऐप में वही आम SPA समस्याएँ होती हैं, जबकि वही कंपोनेंट Next.js या फ़्रेमवर्क मोड में React Router के साथ सर्वर पर रेंडर हों, तो क्रॉलर को पूरा HTML मिलता है। जिन पेजों को इंडेक्स करवाना है, उनके लिए सर्वर या स्टैटिक रेंडरिंग सहारा देने वाला फ़्रेमवर्क चुनें।
केवल अस्थायी उपाय के रूप में। Google डायनामिक रेंडरिंग को एक वर्कअराउंड कहता है, अनुशंसित समाधान नहीं, क्योंकि बॉट के लिए अलग संस्करण रखने से लागत और जोखिम बढ़ते हैं। सर्वर-साइड रेंडरिंग, स्टैटिक जनरेशन या बिल्ड-टाइम प्रीरेंडरिंग हर विज़िटर को एक ही HTML देते हैं, और यही दीर्घकालिक समाधान हैं।
आपसे पहले लोगों ने Sorank आज़माया है
