Czy AI widzi treść Twojej strony? JavaScript a renderowanie na serwerze
Google uruchamia JavaScript w przeglądarce Chromium i indeksuje stronę po jej wyrenderowaniu, ale sam pisze, że nie wszystkie roboty to potrafią, a OpenAI, Anthropic i Perplexity nie opisują w dokumentacji swoich robotów wykonywania JavaScriptu. Bezpiecznie jest więc mieć całą ważną treść w HTML, który wysyła serwer: dają to renderowanie na serwerze (SSR), strony statyczne (SSG) albo prerendering.
- Google przetwarza strony z JavaScriptem w trzech fazach: skanowanie, renderowanie i indeksowanie; strona może czekać w kolejce do renderowania kilka sekund albo dłużej.
- Google pisze, że renderowanie na serwerze albo prerendering to nadal dobry pomysł, bo strona działa szybciej dla ludzi i robotów, a nie wszystkie roboty uruchamiają JavaScript.
- Renderowanie dynamiczne, czyli osobną wersję HTML tylko dla robotów, Google nazywa obejściem, a nie zalecanym rozwiązaniem, i zaleca renderowanie na serwerze, renderowanie statyczne albo hydratację.
- Google znajduje linki tylko w elementach
<a>z atrybutem href; treści ładowanej po zmianie fragmentu adresu (np. #/oferta) Googlebot nie odczyta niezawodnie.
HTML z serwera a strona po uruchomieniu skryptów
Gdy otwierasz stronę, serwer wysyła kod HTML. Potem przeglądarka uruchamia skrypty JavaScript, które mogą dopisać tekst, zdjęcia i menu. To drugie nazywa się renderowaniem w przeglądarce (CSR, client-side rendering).
Strona zbudowana tylko w ten sposób wysyła prawie pusty HTML, czasem samo <div id="root"></div>. Człowiek widzi pełną stronę, bo jego przeglądarka wykonała skrypty. Robot, który skryptów nie uruchamia, widzi pustkę. Tak bywa w aplikacjach React, Vue albo Angular bez renderowania na serwerze i w kreatorach, które ładują sekcje skryptem.
Co robi Google, a co roboty AI
Googlebot uruchamia JavaScript w aktualnej wersji przeglądarki Chromium. Najpierw pobiera stronę, potem odkłada ją do kolejki renderowania, a indeksuje HTML po wykonaniu skryptów. Strony z kodem innym niż 200, np. 404, mogą zostać pominięte przy renderowaniu.
Ważna pułapka: gdy w HTML z serwera jest noindex, Google może w ogóle nie uruchomić JavaScriptu. Skrypt, który miał usunąć noindex, się nie wykona.
OpenAI, Anthropic i Perplexity w dokumentacji robotów opisują, do czego służą ich roboty, ale nie piszą, że wykonują JavaScript. Google dodaje, że nie wszystkie roboty to potrafią. Przyjmij więc, że roboty wyszukiwania AI widzą tylko HTML z serwera.
Test w dwie minuty
- Wybierz zdanie z oferty, np. z pierwszego akapitu strony głównej.
- Otwórz źródło strony: Ctrl+U w Windows albo Cmd+Option+U na Macu. To jest HTML z serwera.
- Wyszukaj to zdanie (Ctrl+F albo Cmd+F). Jest? Dobrze. Nie ma? Tekst dopisuje JavaScript.
- Powtórz dla nagłówka H1, cennika i danych kontaktowych.
- W Search Console wklej adres w Narzędzie do sprawdzania adresów URL i uruchom test wersji opublikowanej. Zobaczysz zrzut ekranu i HTML, który widzi Google.
Rozwiązania od najprostszego
W WordPressie z klasycznym motywem treść zwykle jest w HTML z serwera, więc problem dotyczy głównie aplikacji i kreatorów stron. Rozwiązań jest kilka:
| Rozwiązanie | Na czym polega | Kiedy pasuje |
|---|---|---|
| Strony statyczne (SSG) | HTML powstaje raz, przy publikacji | strona firmowa, blog, cennik zmieniany co jakiś czas |
| Renderowanie na serwerze (SSR) | serwer składa HTML przy każdym wejściu | treści zmieniające się często |
| Hydratacja | HTML przychodzi z serwera, a JavaScript dokłada tylko interakcje | tak działają m.in. Next.js, Nuxt i Angular z SSR |
| Prerendering | narzędzie zapisuje gotowy HTML wybranych podstron | starsza aplikacja, której nie da się szybko przebudować |
| Renderowanie dynamiczne | osobny HTML tylko dla robotów | Google odradza je jako rozwiązanie na stałe |
Co musi być w HTML z serwera
- Tytuł strony (
<title>), opis (meta description), adres kanoniczny i znacznik robots. - Nagłówek H1 i akapit pod nim z odpowiedzią: co robisz, dla kogo, gdzie i za ile.
- Cennik, zakres usług i dane kontaktowe jako zwykły tekst.
- Linki menu jako
<a href="/oferta/">, a nie przyciski bez adresu. - Dane strukturalne JSON-LD.
Jak sprawdzić to samemu
- Wciśnij Ctrl+U (Cmd+Option+U na Macu) i wyszukaj w źródle zdanie z oferty.
- W źródle sprawdź, czy są
<title>,<meta name="description">,<link rel="canonical">i blok application/ld+json. - Sprawdź, czy linki w menu mają postać
<a href="...">. - W Chrome otwórz narzędzia dla programistów (F12), wciśnij Ctrl+Shift+P (Cmd+Shift+P na Macu), wpisz Disable JavaScript, odśwież stronę i zobacz, co zostało.
- W Search Console uruchom test wersji opublikowanej dla strony głównej i jednej podstrony usługi.
Co sprawdza bezpłatny skan
- Pobiera HTML strony głównej tak, jak wysyła go serwer, bez uruchamiania JavaScriptu, czyli tak, jak widzi go robot, który skryptów nie wykonuje.
- Liczy słowa, które robot widzi w treści strony: cały tekst poza menu (
<nav>), nagłówkiem strony (<header>) i stopką, razem z regionem<main>i sekcjami obok niego. Mniej niż 45 słów to uwaga pilna. Gdy kod wygląda jak aplikacja JavaScript, np. ma pusty<div id="root">albo pliki Next.js, uwaga mówi o tekście dokładanym przez skrypty. Bez takich śladów wskazuje też tekst na obrazkach albo za mało treści. - Sprawdza w tym HTML nagłówek H1 i akapit pod nim, tytuł, opis, adres kanoniczny i dane JSON-LD.
- Mierzy wagę HTML (do poprawy powyżej 220 KB, pilne powyżej 380 KB) i udział tekstu w kodzie (do poprawy poniżej 3,5% przy HTML większym niż 50 KB).
- Wylicza skrypty w sekcji
<head>bez atrybutów defer i async, które wstrzymują rysowanie strony, i rozpoznaje technologię, np. Next.js, WordPress albo Webflow, po ścieżkach plików.
Skan sprawdza stronę główną i do 3 podstron. Wynik dostajesz w około minutę.
Kiedy zlecić to komuś: Przejście z renderowania w przeglądarce na SSR albo strony statyczne to praca programisty, od kilku godzin do kilku dni zależnie od wielkości aplikacji. Jeśli test pokazał pustą stronę, w pełnym audycie wskażę, które podstrony naprawić najpierw, a przebudowę mogę zrobić po mojej stronie. Zobacz pełny audyt.
Pytania i odpowiedzi
Czy Google indeksuje strony w React?
Tak. Google uruchamia JavaScript w aktualnej wersji Chromium. Renderowanie odbywa się jednak w kolejce, więc trwa dłużej niż odczyt gotowego HTML, a inne roboty mogą go w ogóle nie robić.
Czy ChatGPT widzi treść dodaną JavaScriptem?
OpenAI nie opisuje w dokumentacji robotów, że wykonują JavaScript. Przyjmij, że OAI-SearchBot widzi HTML z serwera, i sprawdź go testem ze źródłem strony.
Czy noindex dodany albo usunięty skryptem działa?
Dodany skryptem Google odczyta, bo renderuje stronę; inne roboty mogą go nie zobaczyć. Usunięcie skryptem nie działa: Google pisze, że gdy trafi na noindex w HTML, może pominąć renderowanie i JavaScript.
Czy muszę przebudować całą stronę?
Nie zawsze. Często wystarczy włączyć renderowanie na serwerze albo statyczny eksport w używanym frameworku, czyli gotowym zestawie narzędzi, na którym zbudowano stronę. Najpierw zrób test i sprawdź, których podstron problem dotyczy.
Źródła
- Google Search Central: podstawy SEO dla stron z JavaScriptem
- Google Search Central: renderowanie dynamiczne jako obejście
- web.dev: Rendering on the Web
- Pomoc Search Console: Narzędzie do sprawdzania adresów URL
- OpenAI: Overview of OpenAI Crawlers
- Anthropic: roboty ClaudeBot, Claude-User i Claude-SearchBot
- Perplexity: Perplexity Crawlers