ACC-03

Hlavní obsah vyžaduje JavaScript

KritickéPřístup pro crawlery

Co kontrola měří

Každou vzorkovanou stránku stahujeme dvakrát. Poprvé jako obyčejný HTTP požadavek, ze kterého se text vytáhne přímo z doručeného HTML, přesně tak, jak ho vidí robot, který nespouští JavaScript. Podruhé ve skutečném prohlížeči (Playwright), který skripty vykoná a nechá stránku doběhnout. Pak se porovná počet slov obou verzí.

Nález vznikne, když je rozdíl větší než 40 % slov vykreslené verze. Práh není naše odhadnutá hodnota schovaná v kódu: je v config/thresholds.json pod rule_engine.ACC-03 jako cheerio_vs_playwright_word_diff_ratio: 0.4 a pochází ze zadání produktu. Vzorec je |slova po JS − slova bez JS| / slova po JS.

Co kontrola nedělá:

  • Neběží na všech stránkách. Prohlížečem se vzorkuje jen část webu. Je to nejdražší krok celého auditu. Stránky mimo vzorek se neposuzují vůbec, takže absence nálezu neznamená, že je web v pořádku celý.
  • Neříká, co přesně chybí. Měří jen objem textu, ne jeho obsah. Stránka, které chybí 39 % textu, nález nedostane, i když v těch 39 % byla celá cena produktu.
  • Nepozná opačný případ. Když JavaScript naopak text odebírá (cookie lišta ve statickém HTML, kterou skript nahradí obsahem), rozdíl vyjde stejně velký; kontrola počítá absolutní hodnotu, ne směr.
  • Neměří rychlost ani chyby skriptů. Stránka, která se v prohlížeči vykreslí správně, ale za osm vteřin, je pro ACC-03 v pořádku.
  • Nehodnotí, jestli je stránka „důležitá“. Nález na stránce se zásadami ochrany osobních údajů má stejnou váhu jako na produktu.

Nález je na úrovni stránky, takže se v reportu objeví jednou za každou zasaženou stránku, seskupený pod jedním kódem. Závažnost je kritická.

Jak silný důkaz za tím stojí

Doložený efekt

Existuje měření s popsanou metodikou, které efekt skutečně naměřilo. Není to záruka výsledku, ale je to víc než odborný odhad.

Za touhle kontrolou stojí měření, ne domněnka. Vercel analyzoval logy na okraji sítě pro tři weby s odlišnými frameworky (mimo jiné nextjs.org) a sledoval, co skutečně dělají AI crawleři, když stránku stáhnou.

Výsledek: GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, PerplexityBot, Bytespider ani Meta-ExternalAgent JavaScript nespouštějí. Soubory .js si stáhnou, ale nevyhodnotí je. Co není v doručeném HTML, pro ně neexistuje.

Dvě výjimky, které je fér uvést: Gemini a Applebot renderují. Kdo cílí výhradně na ně, má situaci jinou. Většina ostatních ne.

A jedno přiznání k síle důkazu: je to jediný nezávislý zdroj s popsanou metodikou, který se nám podařilo dohledat. Druhý jsme nenašli. Data jsou z prosince 2024, takže od té doby se chování mohlo změnit. Nikdo z provozovatelů to ale nedeklaruje ani jedním směrem. Proto třída „doložený efekt“, ne „nutná podmínka“: měření existuje a je věrohodné, ale nestojí za ním vlastní dokumentace provozovatele tak jako u ACC-01 nebo ACC-07.

Praktický důsledek je přitom tvrdý: pokud se váš hlavní obsah generuje až v prohlížeči, není to otázka horšího pořadí. Ten obsah prostě není k dispozici modelu, který na váš web přišel.

Jak to opravit

Nejdřív si ověřte, co robot doopravdy dostane. Nepotřebujete k tomu nástroj, stačí příkazová řádka a porovnání s tím, co vidíte v prohlížeči:

curl -s https://vase-domena/stranka | wc -w

Když vyjde pár desítek slov a stránka jich přitom v prohlížeči má tisíce, máte odpověď. Ve zdrojovém kódu stránky (Ctrl+U, ne inspektor; ten ukazuje stav PO vykonání skriptů) pak uvidíte, jestli tam text je, nebo jen prázdný <div id="root">.

Oprava má tři úrovně podle toho, kolik práce si můžete dovolit:

  1. Statické generování (SSG): obsah, který se nemění při každém načtení (články, dokumentace, popisy produktů), vygenerujte při buildu do HTML. Nejlevnější na provoz a robot dostane všechno.
  2. Renderování na serveru (SSR): stránky, které závisí na požadavku, vykreslete na serveru a pošlete hotové HTML. V Next.js, Nuxtu i SvelteKitu je to výchozí režim; problém obvykle vzniká až tím, že se komponenta označí jako klientská.
  3. Částečné řešení: když plošná změna nepřipadá v úvahu, aplikujte SSR alespoň na stránky s obsahovou hodnotou. Landing page bez SSR vás nestojí nic, prázdná stránka produktu ano.

Tři chyby, na které se v praxi naráží:

  • „Máme SSR“ ještě neznamená, že SSR má i tahle stránka. V moderních frameworcích se režim volí per komponenta a jedna klientská komponenta obalující obsah stačí, aby z HTML zmizel.
  • Obsah načítaný až po interakci (rozbalovací sekce, „načíst více“, karty s taby) v HTML být musí, i když je vizuálně skrytý. Skrýt ho CSS je v pořádku, dogenerovat ho skriptem ne.
  • Prerendering pro roboty podle User-Agenta je slepá ulička. Servírovat robotům jinou verzi než lidem je riskantní a řeší to jen ty roboty, které pojmenujete. Vyřešte rendering pro všechny, ne pro seznam.

Co o tom říká report

Popis nálezu

Text získaný staticky (Cheerio render) se od textu po vykonání JavaScriptu (Playwright render) liší o více než 40 % slov. Hlavní obsah stránky se tedy generuje až v prohlížeči a AI crawleři, kteří JavaScript nevykonávají (většina z nich ne), ho nevidí.

Doporučení

Zajistěte server-side rendering (SSR) nebo statické generování hlavního obsahu (např. Next.js SSR/SSG místo čistě klientského renderu), aby byl text přítomný přímo v HTML odpovědi. Pokud SSR není možné plošně, aplikujte ho alespoň na stránky s obsahovou hodnotou (články, produkty), ne jen na landing page.

Zdroje

Text ověřen 2026-09-12