SEO pro single page aplikace: proč SPA nejsou vidět ve vyhledávání, jak je opraví SSR, statické generování a prerendering a jak zpřístupnit aplikaci AI crawlerům.

Na této stránce
Stručně
single page aplikace (SPA) načte jeden prázdný HTML základ a každé zobrazení sestaví JavaScriptem v prohlížeči. Google umí JavaScript vykreslit, ale vykreslování je opožděné a křehké, a crawlery za ChatGPT, Claude a Perplexity JavaScript vůbec nespouštějí. Aby se SPA dostala do vyhledávání a byla citována, každé její zobrazení potřebuje vlastní URL, skutečný odkaz s href, jedinečný titulek a popis, správný stavový kód a hlavně to, aby byl hlavní obsah přítomen v HTML, které server odesílá: prostřednictvím vykreslování na serveru, statického generování nebo prerenderingu.
Chcete jít dál? Zeptejte se
Rychlý kvíz
Kdo má opravit technickou stránku vašeho webu?
Naše doporučení pro vás
Dejte každému zobrazení čistou, procházitelnou URL je pro vás správné řešení
Číslo 1 v tomto žebříčku, nejlepší shoda s vašimi odpověďmi.
Naše doporučení pro vás
Používejte skutečné odkazy je pro vás správné řešení
Číslo 2 v tomto žebříčku, nejlepší shoda s vašimi odpověďmi.
Naše doporučení pro vás
Aktualizujte titulek, popis a kanonickou URL pro každou trasu je pro vás správné řešení
Číslo 3 v tomto žebříčku, nejlepší shoda s vašimi odpověďmi.
Naše doporučení pro vás
Vracejte poctivé stavové kódy je pro vás správné řešení
Číslo 4 v tomto žebříčku, nejlepší shoda s vašimi odpověďmi.
SEO pro single page aplikace je soubor technik, které dělají aplikaci v JavaScriptu postavenou na React, Vue, Angular nebo Svelte stejně snadno procházitelnou jako klasický web. Problém je dobře zdokumentovaný: Google ve svých základech SEO pro JavaScript vysvětluje, že stránky s JavaScriptem zpracovává ve třech fázích (procházení, vykreslení, indexace), a každá slabina SPA leží někde v tomto řetězci. Tento návod se zaměřuje na SPA; pro weby s JavaScriptem obecně si přečtěte náš návod k SEO pro JavaScript.
Tradiční web vrací pro každou URL úplný HTML dokument. SPA vrací pro každou URL téměř stejný dokument: prázdný <div id="root">, několik meta značek a velký balík JavaScriptu. Prohlížeč stáhne balík, zavolá API a pak stránku vykreslí. Když návštěvník klikne na odkaz, JavaScript obsah vymění bez znovunačtení.
Pro člověka s rychlým telefonem je výsledek okamžitý. Pro crawler je první odpovědí prázdný základ: žádný nadpis, žádný text, žádné odkazy. Vše závisí na tom, zda robot JavaScript spustí, a kdy. Tento jediný fakt vysvětluje většinu problémů SEO u SPA:
/#/pricing) a část za # se na server nikdy neodešle, takže se všechna zobrazení sloučí do jedné URL.<title>, a pokud ho router neaktualizuje, každá stránka ho sdílí.href: tlačítka a obslužné rutiny onClick pro uživatele navigují, ale crawlerům nedají nic, co by mohly sledovat.Googlebot nejprve stáhne surové HTML a přečte v něm odkazy a direktivy. Stránky se stavem 200 pak zařadí do fronty pro Web Rendering Service, bezhlavý Chromium. Google uvádí, že stránka „může v této frontě zůstat několik sekund, ale může to trvat i déle“. Po vykreslení se výsledné HTML znovu zpracuje kvůli obsahu a odkazům a poté se indexuje.
Čtyři detaily z dokumentace Google mají pro SPA význam:
<a> s href. Odkazy vložené JavaScriptem jsou v pořádku, pokud tento formát dodržují.pushState) místo cest s #. Svůj starý systém procházení AJAX (URL s #!) označil za zastaralý v říjnu 2015.noindex v původním HTML má přednost. Google může vykreslování přeskočit, když vidí noindex, takže jeho odstranění později pomocí JavaScriptu nefunguje.Praktický důsledek: Google může indexovat SPA vykreslenou v prohlížeči, ale ke každé stránce přidáváte druhý krok, zpoždění a místo, kde může selhat. Časový limit, zablokované volání API nebo chyba JavaScriptu během vykreslování nechá indexovanou verzi prázdnou. Co Google vidí, zkontrolujte nástrojem Kontrola URL v Search Console a pokud stránky zůstávají mimo index, přečtěte si náš návod ke způsobu, jakým Google indexuje.
Většinou ne. Ve studii zveřejněné v prosinci 2024 o provozu své sítě zjistily Vercel a MERJ, že „žádný z hlavních AI crawlerů v současnosti nevykresluje JavaScript“: GPTBot, OAI-SearchBot a ChatGPT-User (OpenAI), ClaudeBot (Anthropic), PerplexityBot, Meta-ExternalAgent a Bytespider čtou jen surové HTML. JavaScriptové soubory stahují (asi 11.5% požadavků ChatGPT a 23.8% požadavků Claude), ale nespouštějí je. Výjimkou je Gemini, který se opírá o vykreslovací infrastrukturu Google, a AppleBot, který používá crawler založený na prohlížeči.
U SPA vykreslované v prohlížeči to znamená, že AI crawlery, které napájejí ChatGPT, Claude a Perplexity, vidí prázdnou stránku. Váš produkt se může umisťovat na Google a přesto být v odpovědích AI neviditelný, protože asistent nepřečetl ani slovo. Totéž platí pro většinu botů pro náhledy odkazů na sociálních sítích a v aplikacích pro zprávy, kteří čtou značky Open Graph v surovém HTML. Jakmile je obsah v HTML, zkontrolujte také, že váš robots.txt povoluje AI crawlery, které chcete.
Oprava spočívá v tom, odeslat skutečné HTML už v první odpovědi. Google označuje dynamické vykreslování (bótům se posílá předvykreslená verze) za „řešení obcházející problém, nikoli doporučené řešení“ ve své dokumentaci k dynamickému vykreslování a místo něj odkazuje na vykreslování na serveru, statické vykreslování nebo hydrataci. Níže uvedené definice vycházejí z referenční příručky Rendering on the Web na web.dev.
| Strategie | Jak funguje | Obsah v prvním HTML | Nejvhodnější pro | Limity |
|---|---|---|---|---|
| Vykreslování na straně klienta (CSR) | Prohlížeč sestaví stránku z JavaScriptu a API | Ne | Přehledy a stránky za přihlášením | Opožděné indexování na Google, neviditelné pro většinu AI crawlerů |
| Vykreslování na serveru (SSR) | Server vykreslí HTML při každém požadavku, poté JavaScript provede hydrataci | Ano | Katalogy, výpisy, obsah, který se často mění nebo je personalizovaný | Náklady na server, pomalejší odezva, pokud se nekešuje |
| Statické generování (SSG) | HTML se vygeneruje při sestavení pro každou URL a podává se z CDN | Ano | Marketingové stránky, blog, dokumentace, landing pages | Při změně obsahu je potřeba nové sestavení (existují inkrementální možnosti) |
| Prerendering při sestavení | Bezhlavý prohlížeč zachytí počáteční stav každé trasy jako statické HTML | Ano | Stávající SPA s omezeným počtem veřejných tras | Data zmrazená v době sestavení, trasy se musí vypsat |
| Dynamické vykreslování | Boti dostanou předvykreslený snímek, uživatelé SPA | Ano, jen pro uvedené boty | Dočasné řešení pro starou aplikaci | Oficiálně obcházení problému, náklady na údržbu, riziko, že boti dostanou jiný obsah |
Většina moderních frameworků umožňuje kombinovat strategie podle trasy: statické pro marketingové stránky, vykreslované na serveru pro katalog, vykreslované v klientovi pro přihlášenou aplikaci. Tento hybridní přístup dává crawlerům plné HTML tam, kde probíhá vyhledávací provoz, a zachovává zážitek SPA tam, kde přidává hodnotu.
| Knihovna | Framework nebo funkce pro HTML při prvním načtení |
|---|---|
| React | Next.js (serverové komponenty, SSR a statické generování), React Router v režimu frameworku, Gatsby |
| Vue | Nuxt (univerzální vykreslování jako výchozí, statické generování k dispozici) |
| Angular | Angular SSR (vykreslování na serveru a prerendering při sestavení) |
| Svelte | SvelteKit (vykreslování na serveru jako výchozí, prerendering po trasách) |
| Kterákoli z nich | Astro (statické HTML jako výchozí, interaktivní ostrovy načítané jen tam, kde je potřeba) |
Zvláštní zmínku zaslouží weby generované AI tvůrci webů: mnohé exportují aplikaci React vykreslovanou v klientovi. Pokud jste svůj web postavili jedním z nich, podívejte se na naše poznámky k SEO a GEO pro Lovable, než předpokládáte, že Google a ChatGPT ho umějí přečíst.
Používejte History API (/pricing, nikdy /#/pricing), jednu URL na každý kus obsahu a stejnou URL, ať návštěvník přijde přímo nebo navigací v aplikaci. Každá URL musí po otevření v nové záložce načíst správný obsah, což je test, který crawler provádí.
Každý navigační prvek, který vede na indexovatelnou stránku, by měl být <a href="/path">. Komponenty odkazů frameworku (Link, NuxtLink, routerLink) tento značkovací kód vypisují; vlastní obslužné rutiny kliknutí na prvcích div nebo button ne. Dobré odkazy také nesou vaši architekturu webu: pokud stránka není propojena, crawlery ji jen zřídka najdou.
Každá trasa potřebuje vlastní titulek, meta popis, kanonickou URL a značky Open Graph, pokud možno generované na serveru. Naše stránka o meta značkách uvádí, co nastavit. Udržujte jedinou kanonickou značku: Google doporučuje nastavit ji v HTML a pokud ji změní JavaScript, výsledek nesmí být v rozporu s původní.
Chybějící produkty a smazané články nesmí odpovídat 200 s chybovou zprávou. U SSR vraťte ze serveru skutečný kód 404 nebo 410. V čisté SPA přijímá Google dvě náhradní řešení: přesměrovat JavaScriptem na URL, která vrací 404, nebo do chybového zobrazení přidat meta značku robots noindex.
Nadpisy, text, ceny, FAQ a strukturovaná data JSON-LD by měly být v odpovědi serveru, ne načítány až po kliknutí nebo posunutí. Obsah za záložkami, které se vykreslují na vyžádání, nebo za tlačítky „načíst další“, je často přehlédnut.
Rozdělte balík podle trasy, odložte to, co není potřeba pro první zobrazení, a vyhněte se opětovnému vykreslování celé stránky při hydrataci. Mějte na paměti, že terénní data Chrome (CrUX) přiřazují metriky navigací v aplikaci URL, kterou návštěvník původně načetl, takže otestujte klíčové šablony jednotlivě.
Porovnejte tři verze každé klíčové šablony: surové HTML (zobrazení zdroje nebo načtení stránky nástrojem příkazové řádky), HTML, které vykreslil Google (Kontrola URL, pak „Zobrazit prohledanou stránku“), a stránku s vypnutým JavaScriptem. Pokud se hlavní text objeví jen ve druhé verzi, AI crawlery ho nevidí. Náš bezplatný audit procházitelnosti pro AI a kontrola indexovatelnosti provedou tyto kontroly na libovolné URL.
| Příznak | Pravděpodobná příčina | Náprava |
|---|---|---|
| Search Console ukazuje mnoho stránek ve stavu „Prozkoumáno, zatím neindexováno“ | Prázdné nebo téměř shodné HTML před vykreslením | SSR, SSG nebo prerendering pro veřejné trasy |
Každý výsledek při hledání site: ukazuje stejný titulek | Titulek se neaktualizuje podle trasy | Správa hlaviček po trasách na serveru |
| Indexovaná je jen domovská stránka | Směrování pomocí fragmentů nebo odkazy bez href | History API a skutečné odkazy <a> |
| Chybové stránky se objevují v indexu | Měkké chyby 404 (všude stav 200) | Chyba 404 ze serveru, nebo přesměrování JavaScriptem na URL 404, nebo noindex |
| Umisťuje se na Google, ale ChatGPT ani Perplexity ho nikdy necitují | Obsah viditelný až po spuštění JavaScriptu | Obsah v prvním HTML odpovědi |
| Ve vykresleném zobrazení Google se ukazuje starý obsah | Uložené soubory JavaScriptu nebo CSS | Soubory s otiskem obsahu v názvu |
Po léta bylo vykreslování na straně klienta zvladatelným rizikem, protože Google JavaScript nakonec vykreslil. Jak se část objevování přesouvá do ChatGPT, Claude, Gemini a Perplexity, náklady se změnily: stránka, která existuje až po spuštění JavaScriptu, chybí ve zdrojích, které většina asistentů umí přečíst. Procházitelnost v surovém HTML se stala první podmínkou optimalizace pro generativní vyhledávače.
Jakmile je HTML úplné, zbytek se řídí obvyklými pravidly: stránky, které jasně odpovídají na jednu otázku, s doloženými fakty a strukturovanými daty, jsou ty, které asistenti citují. Funkce optimalizace GEO od Sorank vám pomohou takový obsah napsat a publikovat a sledování zmínek v AI ukáže, zda ChatGPT, Claude a Gemini citují vaši značku po opravě vykreslování.
Klíčové pravidlo SEO pro single page aplikace se vejde do jedné věty: cokoli chcete, aby Google zařadil a AI citovalo, musí být v HTML, které server odesílá. Ponechte SPA pro přihlášený zážitek, veřejné stránky vykreslujte na serveru nebo při sestavení a před každým vydáním i po něm otestujte, co dostávají boti.
Google single page aplikaci nepenalizuje, ale její výchozí nastavení, vykreslování na straně klienta s jedním HTML základem, zpomaluje indexování a dělá ho méně spolehlivým. Většina AI crawlerů JavaScript nespouští, takže vidí prázdnou stránku. Se vykreslováním na serveru, statickým generováním nebo prerenderingem na veřejných trasách se SPA může umisťovat stejně dobře jako klasický web.
Samotný React je neutrální: rozhodující je, kde se HTML vytváří. React aplikace vykreslovaná jen v prohlížeči má obvyklé problémy SPA, zatímco stejné komponenty vykreslené na serveru pomocí Next.js nebo React Routeru v režimu frameworku doručí crawlerům úplné HTML. Vyberte framework, který podporuje vykreslování na serveru nebo statické vykreslování pro stránky, které chcete indexovat.
Jen jako dočasné opatření. Google označuje dynamické vykreslování za obcházení problému, nikoli za doporučené řešení, protože udržování zvláštní verze pro boty přidává náklady a riziko. Vykreslování na serveru, statické generování nebo prerendering při sestavení dávají každému návštěvníkovi stejné HTML a jsou dlouhodobými řešeními.
VYZKOUŠELI SORANK PŘED VÁMI
