JavaScript może ułatwiać tworzenie szybkich, interaktywnych serwisów, ale może też sprawić, że robot wyszukiwarki otrzyma pusty dokument, nie znajdzie linków albo zobaczy inną treść niż użytkownik. Sam fakt, że strona działa w przeglądarce, nie oznacza jeszcze, że jej zawartość jest dostępna dla Googlebota i innych crawlerów.
Po lekturze zrozumiesz, jak roboty przetwarzają JavaScript, czym różnią się crawling, rendering i indeksowanie, jak sprawdzić wyrenderowany HTML oraz kiedy wybrać SSR, SSG, CSR lub rendering hybrydowy. Otrzymasz również procedurę diagnostyczną, tabelę decyzyjną, przykłady kodu i listę najczęstszych błędów.
JavaScript a SEO – definicja i granice tematu
JavaScript SEO to część technicznego SEO dotycząca dostępności, renderowania, odkrywania i indeksowania treści generowanych lub modyfikowanych za pomocą JavaScriptu.
Obszar ten obejmuje między innymi:
- treść dodawaną do DOM po uruchomieniu skryptów,
- routing po stronie klienta,
- linki i nawigację generowane dynamicznie,
- metadane ustawiane przez JavaScript,
- dane strukturalne dodawane po załadowaniu strony,
- lazy loading obrazów i innych zasobów,
- komunikację z API,
- obsługę kodów HTTP, przekierowań i błędów,
- wydajność aplikacji wpływającą na rendering,
- różnice między wersją serwerową a wersją widoczną po wykonaniu skryptów.
JavaScript sam w sobie nie jest problemem SEO. Problem pojawia się wtedy, gdy najważniejsza treść, linki lub sygnały indeksowania są dostępne dopiero po wykonaniu kodu, którego robot nie może pobrać, uruchomić albo poprawnie zinterpretować.
Czego JavaScript SEO nie obejmuje?
Nie każdy problem strony napisanej w JavaScripcie jest problemem renderowania. Brak widoczności może wynikać także z:
- niskiej jakości lub duplikacji treści,
- braku linków wewnętrznych,
- blokady indeksowania,
- nieprawidłowych adresów kanonicznych,
- słabej architektury informacji,
- błędnych kodów HTTP,
- niedopasowania strony do intencji wyszukiwania,
- braku autorytetu i linków zewnętrznych.
Poprawne wyrenderowanie strony nie gwarantuje indeksacji ani wysokiej pozycji. Oznacza jedynie, że robot może uzyskać dostęp do treści i przetworzyć ją jako potencjalny dokument wyszukiwarki.
Jak robot wyszukiwarki przetwarza stronę z JavaScriptem?
Proces można podzielić na cztery odrębne etapy: odkrywanie adresu, crawling, rendering oraz indeksowanie.
1. Odkrywanie adresu URL
Robot musi najpierw dowiedzieć się, że dany adres istnieje. Może znaleźć go przez:
- zwykły link HTML,
- mapę witryny XML,
- przekierowanie,
- odnośnik z innej witryny,
- wcześniej znany adres,
- narzędzia udostępniane właścicielom serwisów.
Najbezpieczniejszą formą linku jest standardowy element HTML:
<a href="/oferta/audyt-seo">Audyt SEO</a>
Element obsługiwany wyłącznie zdarzeniem JavaScript nie musi zostać rozpoznany jako link:
<div onclick="goTo('/oferta/audyt-seo')">Audyt SEO</div>
Taki element może działać dla użytkownika, ale nie zapewnia robotowi jednoznacznego adresu do odkrycia.
2. Pobieranie dokumentu, czyli crawling
Robot wysyła żądanie HTTP i pobiera odpowiedź serwera. Na tym etapie znaczenie mają przede wszystkim:
- kod odpowiedzi HTTP,
- treść początkowego HTML,
- nagłówki HTTP,
- dyrektywy robots,
- dostępność zasobów,
- szybkość i stabilność serwera.
Jeśli serwer zwraca pusty kontener aplikacji, robot nie otrzymuje jeszcze właściwej treści:
<body><div id="app"></div>
<script src="/app.js"></script>
</body>
Treść może pojawić się dopiero po uruchomieniu app.js, pobraniu danych z API i zbudowaniu DOM.
3. Rendering i wykonanie JavaScriptu
Podczas renderowania robot próbuje przetworzyć stronę w sposób zbliżony do przeglądarki. Wykonuje skrypty, stosuje arkusze CSS i może wysyłać dodatkowe żądania do API.
Na tym etapie mogą wystąpić problemy, jeśli:
- pliki JavaScript są zablokowane,
- API zwraca błąd,
- kod wymaga logowania lub danych z pamięci przeglądarki,
- skrypt działa zbyt długo,
- występuje błąd wykonania,
- aplikacja zakłada obecność funkcji niedostępnej w środowisku robota,
- treść pojawia się dopiero po kliknięciu, przewinięciu lub innym działaniu użytkownika,
- serwer ogranicza ruch robotów albo traktuje go jako atak.
4. Indeksowanie
Po przetworzeniu dokumentu wyszukiwarka podejmuje decyzję, czy i w jakiej formie dodać adres do indeksu.
Analizowane mogą być między innymi:
- treść główna,
- tytuł i opis strony,
- nagłówki,
- linki,
- adres kanoniczny,
- dyrektywa
noindex, - dane strukturalne,
- podobieństwo do innych dokumentów,
- jakość i użyteczność strony.
Robot może więc poprawnie wyrenderować treść, ale mimo to jej nie zaindeksować.
HTML źródłowy, DOM i wyrenderowany HTML – najważniejsza różnica
W diagnostyce JavaScript SEO trzeba rozróżniać trzy warstwy strony.
HTML zwrócony przez serwer
To odpowiedź otrzymana bez wykonywania JavaScriptu. Można ją sprawdzić za pomocą opcji „Wyświetl źródło strony”, polecenia curl albo narzędzia do obsługi żądań HTTP.
Przykład:
curl -L https://example.com/produkt
Jeżeli ważna treść znajduje się już w tej odpowiedzi, jej dostępność dla robotów jest zwykle mniej zależna od renderowania.
DOM widoczny w przeglądarce
DOM jest aktualnym modelem dokumentu po wprowadzeniu zmian przez skrypty. Można go sprawdzić w panelu „Elements” narzędzi deweloperskich.
Kod widoczny w DOM nie musi znajdować się w początkowym HTML. To właśnie dlatego „Wyświetl źródło strony” i inspektor elementów mogą pokazywać inne wyniki.
Wersja wyrenderowana przez robota
Najważniejszym punktem odniesienia jest wersja, którą potrafi uzyskać konkretny robot. Przeglądarka użytkownika może mieć:
- zapisane pliki cookie,
- aktywną sesję,
- dostęp do lokalnej pamięci,
- inne uprawnienia,
- inne ustawienia geograficzne,
- rozszerzenia i mechanizmy blokowania,
- szybsze połączenie lub większe zasoby sprzętowe.
Dlatego samo sprawdzenie strony w Chrome nie odpowiada na pytanie, co widzi robot wyszukiwarki.
Jak sprawdzić, czy Googlebot widzi zawartość strony?
Najbardziej wiarygodna diagnostyka wykorzystuje kilka metod jednocześnie. Pojedynczy test może nie ujawnić problemów okresowych, różnic między szablonami albo błędów występujących tylko podczas pobierania danych z API.
Test adresu URL w Google Search Console
Inspekcja adresu URL pozwala sprawdzić informacje o wersji znanej Google oraz przeprowadzić test aktualnej wersji strony.
Podczas analizy zwróć uwagę na:
- możliwość pobrania strony,
- możliwość indeksowania,
- zadeklarowany i wybrany adres kanoniczny,
- kod odpowiedzi,
- wykryte dane strukturalne,
- zrzut wyrenderowanej strony, jeśli jest dostępny,
- HTML uzyskany w teście,
- problemy z wczytywaniem zasobów.
Wyrenderowany HTML należy przeszukać pod kątem:
- tytułu produktu lub artykułu,
- najważniejszych akapitów,
- nagłówka głównego,
- linków wewnętrznych,
- metadanych,
- adresu kanonicznego,
- danych strukturalnych.
Test wersji aktywnej nie jest równoznaczny z potwierdzeniem indeksacji. Pokazuje, czy Google może obecnie uzyskać dostęp do strony, ale nie gwarantuje, że dokument zostanie dodany do indeksu.
Porównanie surowego i wyrenderowanego HTML
Przygotuj dwa zrzuty:
- HTML zwrócony bez wykonywania JavaScriptu.
- HTML po pełnym renderowaniu.
Następnie porównaj obecność elementów istotnych dla SEO.
| Element | HTML serwerowy | HTML po renderowaniu | Ocena |
|---|---|---|---|
| Treść główna | nie | tak | zależność od JavaScriptu |
| Linki kategorii | nie | tak | ryzyko problemów z odkrywaniem |
title | tak | tak | prawdopodobnie poprawnie |
| Canonical | nie | tak | wymaga kontroli w renderze Google |
| Dane strukturalne | nie | tak | możliwe, ale bardziej podatne na błędy |
| Komunikat błędu API | nie | tak | krytyczny problem renderowania |
Brak treści w surowym HTML nie oznacza automatycznie, że Google jej nie zobaczy. Oznacza jednak, że strona zależy od poprawnego wykonania JavaScriptu.
Wyłączenie JavaScriptu w przeglądarce
Test bez JavaScriptu pokazuje, jak dużo informacji udostępnia warstwa serwerowa. Nie symuluje dokładnie działania Googlebota, ale szybko ujawnia zależności aplikacji.
Po wyłączeniu JavaScriptu sprawdź:
- czy widoczna jest główna treść,
- czy działa nawigacja,
- czy można przejść do kategorii i produktów,
- czy formularze mają sensowną wersję podstawową,
- czy użytkownik otrzymuje informację zamiast pustego ekranu.
Strona nie zawsze musi być w pełni funkcjonalna bez JavaScriptu. Dla SEO korzystne jest jednak, gdy zasadnicza treść i standardowe linki są dostępne w HTML.
Test za pomocą narzędzi deweloperskich
W Chrome DevTools sprawdź zakładki:
- Network – błędy żądań, czasy odpowiedzi, pliki blokowane i zapytania do API,
- Console – błędy JavaScriptu,
- Elements – końcowy DOM,
- Performance – długie zadania i moment pojawienia się treści,
- Application – zależności od plików cookie, pamięci lokalnej i service workera.
Szczególnie niebezpieczne są błędy, które zatrzymują inicjalizację całej aplikacji. Jeden nieobsłużony wyjątek może spowodować, że robot otrzyma tylko pusty kontener.
Sprawdzenie logów serwera
Logi pokazują rzeczywiste żądania wysyłane do serwisu. Pozwalają odpowiedzieć na pytania, których nie rozstrzygnie jednorazowy test:
- czy Googlebot odwiedza adresy,
- jak często pobiera podstrony,
- jakie kody HTTP otrzymuje,
- czy pobiera pliki JS i CSS,
- czy trafia na błędy 5xx lub limity 429,
- czy marnuje zasoby na parametry i duplikaty URL,
- czy istotne sekcje są odwiedzane rzadziej niż pozostałe.
Sam user-agent nie potwierdza, że żądanie pochodzi od prawdziwego Googlebota. W analizie wymagającej wysokiej wiarygodności należy zweryfikować adres IP odpowiednią procedurą DNS.
Testowanie jako Googlebot za pomocą curl
Można wysłać żądanie z user-agentem robota:
curl -L-A "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 Chrome/131.0.0.0 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
https://example.com/
Taki test pokazuje odpowiedź serwera dla określonego user-agenta, ale nie wykonuje JavaScriptu. Nie zastępuje więc renderowania w przeglądarce bez interfejsu ani testu Google.
Jest natomiast przydatny do wykrywania:
- odmiennej treści dla robotów,
- blokad systemu bezpieczeństwa,
- nieprawidłowych przekierowań,
- błędów zależnych od user-agenta,
- kodów HTTP innych niż te widoczne dla użytkownika.
Jak sprawdzić, czy inne roboty widzą treść?
Nie należy zakładać, że każdy crawler obsługuje JavaScript tak samo jak Google. Różnice mogą dotyczyć możliwości renderowania, czasu oczekiwania, obsługiwanych funkcji oraz częstotliwości ponownych odwiedzin.
Dotyczy to między innymi:
- robotów innych wyszukiwarek,
- crawlerów mediów społecznościowych,
- narzędzi SEO,
- systemów reklamowych,
- agregatorów treści,
- botów odpowiedzialnych za podgląd linków,
- asystentów i systemów wykorzystujących treść internetową.
Jeżeli prawidłowy podgląd w mediach społecznościowych ma znaczenie biznesowe, podstawowe dane Open Graph warto umieścić w odpowiedzi HTML serwera. Bot tworzący podgląd linku może nie czekać na ustawienie metadanych przez JavaScript.
Najbardziej uniwersalna zasada brzmi: krytyczna treść, linki, metadane i sygnały indeksowania powinny być dostępne bez uzależniania ich od złożonego renderowania po stronie klienta.
CSR, SSR, SSG i rendering hybrydowy
Sposób renderowania wpływa na to, kiedy powstaje HTML i jak wiele pracy musi wykonać robot.
CSR – client-side rendering
W modelu CSR serwer zwraca podstawowy dokument i pliki JavaScript. Właściwy interfejs powstaje w przeglądarce.
Zalety:
- wysoka interaktywność,
- możliwość budowy aplikacji z płynnymi przejściami,
- rozdzielenie front-endu od API,
- mniejsze obciążenie serwera HTML w niektórych architekturach.
Ryzyka SEO:
- początkowy HTML może nie zawierać treści,
- błędy JS mogą uniemożliwić wyświetlenie całej strony,
- routing może nie tworzyć poprawnych adresów,
- treść zależy od dostępności API,
- rendering wymaga dodatkowych zasobów.
CSR może być odpowiedni dla paneli po zalogowaniu i aplikacji, których ekrany nie muszą być indeksowane. Jest bardziej ryzykowny dla artykułów, kategorii, produktów i stron ofertowych.
SSR – server-side rendering
W SSR serwer generuje HTML dla każdego żądania. Użytkownik i robot otrzymują dokument zawierający treść, a JavaScript może następnie przejąć obsługę interakcji w procesie hydratacji.
Zalety:
- treść dostępna w początkowym HTML,
- mniejsza zależność indeksacji od renderowania klienta,
- dobre rozwiązanie dla dynamicznych i często aktualizowanych stron,
- łatwiejsze dostarczanie metadanych zależnych od adresu.
Wady:
- większa złożoność infrastruktury,
- obciążenie serwera,
- ryzyko wolnej odpowiedzi,
- błędy hydratacji,
- konieczność stosowania pamięci podręcznej i monitoringu.
SSG – static site generation
W modelu SSG dokumenty HTML powstają podczas budowania lub publikowania serwisu.
Zalety:
- szybka odpowiedź,
- wysoka stabilność,
- treść dostępna bez renderowania klienta,
- łatwe wykorzystanie CDN.
Wady:
- długi proces budowania przy bardzo dużej liczbie stron,
- opóźnienie aktualizacji,
- potrzeba ponownej generacji po zmianie danych,
- mniejsza wygoda dla treści zmieniających się w czasie rzeczywistym.
SSG dobrze sprawdza się w dokumentacji, bazach wiedzy, serwisach firmowych i publikacjach o przewidywalnym cyklu zmian.
Rendering hybrydowy i przyrostowa regeneracja
Nowoczesne frameworki pozwalają łączyć metody. Część stron może być generowana statycznie, część na serwerze, a wybrane komponenty – po stronie klienta.
W praktyce często jest to najlepszy model:
- treść główna powstaje na serwerze,
- nawigacja zawiera zwykłe linki,
- metadane są dostępne w HTML,
- komponenty interaktywne uruchamiają się po stronie klienta,
- dane szybkozmienne są aktualizowane niezależnie.
Dynamic rendering
Dynamic rendering polega na serwowaniu robotom gotowego HTML, podczas gdy użytkownicy otrzymują aplikację renderowaną po stronie klienta.
Może być rozwiązaniem przejściowym w trudnej migracji, lecz nie powinien zastępować prawidłowej architektury. Zwiększa koszty utrzymania, utrudnia testowanie i może prowadzić do rozbieżności między wersjami.
Jeżeli treść dla robota istotnie różni się od treści dla użytkownika w celu manipulowania wynikami, może zostać potraktowana jako cloaking.
Tabela decyzyjna: jaki sposób renderowania wybrać?
| Typ strony | Znaczenie SEO | Częstotliwość zmian | Zalecane podejście | Główne uzasadnienie |
|---|---|---|---|---|
| Artykuł poradnikowy | wysokie | niska lub średnia | SSG albo SSR | pełna treść w HTML |
| Strona usługowa | wysokie | niska | SSG | szybkość i stabilność |
| Kategoria e-commerce | bardzo wysokie | wysoka | SSR lub model hybrydowy | aktualne produkty i treść serwerowa |
| Karta produktu | bardzo wysokie | wysoka | SSR lub regeneracja przyrostowa | ceny, dostępność i metadane |
| Serwis ogłoszeniowy | wysokie | bardzo wysoka | SSR z cache | duża liczba dynamicznych adresów |
| Dokumentacja | wysokie | średnia | SSG z wyszukiwarką klientową | szybkie dokumenty HTML |
| Panel użytkownika | niskie | bardzo wysoka | CSR | zawartość zwykle nie jest indeksowana |
| Kalkulator | średnie | zależna od danych | hybrydowo | opis w HTML, obliczenia w JS |
| Wyniki wewnętrznego wyszukiwania | zwykle niskie | bardzo wysoka | CSR lub SSR z kontrolą indeksacji | ograniczenie duplikacji |
| Landing page kampanii | średnie lub wysokie | niska | SSG lub SSR | kontrola treści i metadanych |
| Aplikacja SaaS po zalogowaniu | niskie | bardzo wysoka | CSR | SEO dotyczy głównie publicznych landing pages |
| Strona wykorzystująca dane na żywo | wysokie | bardzo wysoka | SSR plus aktualizacja klientowa | indeksowalny stan początkowy i świeże dane |
Elementy strony szczególnie podatne na problemy z JavaScriptem
Tytuł, opis i nagłówki
JavaScript może zmieniać <title> i inne elementy dokumentu, ale bezpieczniej dostarczyć właściwe wartości już w HTML serwerowym.
Każdy indeksowalny adres powinien mieć:
- unikalny i opisowy tytuł,
- adekwatny meta description,
- jednoznaczny nagłówek główny,
- logiczną strukturę H2 i H3,
- treść zgodną z adresem oraz intencją strony.
Nie należy polegać na jednym domyślnym tytule aplikacji, który JavaScript podmienia dopiero po pobraniu danych.
Linki wewnętrzne i routing
W aplikacjach typu SPA przejście między ekranami często odbywa się bez pełnego przeładowania. Nie jest to problemem, jeśli:
- każdy istotny widok ma własny adres URL,
- adres działa po bezpośrednim otwarciu,
- serwer zwraca poprawną odpowiedź dla tego adresu,
- nawigacja wykorzystuje elementy
<a href>, - historia przeglądarki działa poprawnie,
- nie stosuje się fragmentów
#jako substytutu indeksowalnych adresów.
Przycisk może inicjować akcję. Link powinien prowadzić do zasobu.
Canonical
Adres kanoniczny informuje wyszukiwarkę o preferowanej wersji dokumentu. Najbezpieczniej umieścić go w sekcji <head> odpowiedzi serwera:
<link rel="canonical" href="https://example.com/kategoria/produkt">
Canonical ustawiany przez JavaScript może zostać przetworzony, ale zwiększa ryzyko opóźnień, konfliktów i błędów wynikających z routingu.
Należy także unikać sytuacji, w której HTML serwerowy wskazuje jeden canonical, a skrypt zamienia go na inny.
Meta robots i noindex
Dyrektywa może być przekazana w HTML:
<meta name="robots" content="noindex,follow">
lub w nagłówku HTTP:
X-Robots-Tag: noindex
Nie należy uzależniać krytycznej dyrektywy od wykonania JavaScriptu. Szczególnie niebezpieczny jest szablon zawierający początkowo noindex, który ma być usunięty przez skrypt.
Warto też pamiętać, że zablokowanie adresu w robots.txt może uniemożliwić robotowi pobranie strony i zobaczenie znajdującej się na niej dyrektywy noindex.
Dane strukturalne
Dane strukturalne w formacie JSON-LD mogą być generowane po stronie klienta, ale powinny:
- odpowiadać treści widocznej dla użytkownika,
- zawierać aktualne wartości,
- być poprawne składniowo,
- być obecne w wyrenderowanej wersji,
- nie powielać sprzecznych zestawów danych.
W e-commerce należy szczególnie kontrolować cenę, walutę, dostępność, nazwę produktu i identyfikatory.
Obrazy i lazy loading
Obrazy ładowane leniwie powinny korzystać z prawidłowego atrybutu src lub rozwiązania, które robot może wyrenderować.
Przykład natywnego lazy loadingu:
<imgsrc="/images/produkt.jpg"
alt="Czarny plecak turystyczny 40 l"
loading="lazy"
width="800"
height="600">
Nie należy uzależniać ładowania wszystkich obrazów od nietypowego zdarzenia przewijania. Główny obraz widoczny od razu nie powinien być niepotrzebnie opóźniany.
Paginacja i nieskończone przewijanie
Robot nie powinien być zmuszony do wielokrotnego przewijania strony, aby odkryć kolejne produkty lub artykuły.
Nieskończone przewijanie warto uzupełnić o:
- oddzielne adresy kolejnych części listy,
- zwykłe linki prowadzące do następnych stron,
- stabilną kolejność elementów,
- obsługę bez wymagania interakcji,
- możliwość bezpośredniego otwarcia każdego adresu.
Treść ukryta za interakcją
Zakładki, akordeony i rozwijane sekcje mogą zawierać przydatną treść. Istotne jest jednak, czy tekst znajduje się w DOM i czy nie jest pobierany dopiero po kliknięciu.
Jeśli ważny opis produktu trafia do dokumentu dopiero po wykonaniu akcji użytkownika, robot może go nie zobaczyć. Bezpieczniej umieścić treść w HTML, a JavaScript wykorzystać jedynie do sterowania jej prezentacją.
JavaScript, wydajność i Core Web Vitals
Problemy JavaScript SEO nie ograniczają się do samej indeksacji. Nadmiar skryptów może pogarszać szybkość i responsywność strony.
Najczęstsze przyczyny to:
- zbyt duże paczki JavaScript,
- niewykorzystany kod,
- długie zadania blokujące główny wątek,
- zbyt wczesne uruchamianie skryptów zewnętrznych,
- wielokrotne renderowanie komponentów,
- pobieranie danych w sekwencyjnych łańcuchach,
- hydratacja całej strony mimo niewielkiej interaktywności,
- brak dzielenia kodu.
Działania optymalizacyjne obejmują:
- code splitting,
- tree shaking,
- opóźnienie skryptów niekrytycznych,
- ograniczenie skryptów firm trzecich,
- renderowanie treści na serwerze,
- wykorzystanie cache i CDN,
- częściową hydratację,
- rezygnację z JavaScriptu tam, gdzie wystarczy HTML i CSS.
Optymalizacja nie powinna polegać wyłącznie na zmniejszeniu rozmiaru plików. Ważne jest również to, ile pracy skrypt wymaga od głównego wątku przeglądarki.
Liczby i statystyki ważne w JavaScript SEO
Poniższe wartości są praktycznymi punktami odniesienia, a nie gwarancją wysokich pozycji.
Progi Core Web Vitals
Ocena jest oparta na danych użytkowników i analizowana na poziomie 75. percentyla:
- LCP: dobry wynik to maksymalnie 2,5 sekundy,
- INP: dobry wynik to maksymalnie 200 milisekund,
- CLS: dobry wynik to maksymalnie 0,1.
JavaScript może wpływać na wszystkie trzy wskaźniki: opóźniać największy element, blokować interakcje i powodować przesunięcia układu.
Kody odpowiedzi HTTP
Najważniejsze grupy kodów:
- 2xx – żądanie zakończone powodzeniem,
- 3xx – przekierowanie,
- 4xx – błąd po stronie żądania, np. 404 lub 410,
- 5xx – błąd serwera,
- 429 – zbyt wiele żądań.
Aplikacja nie powinna zwracać kodu 200 dla każdego widoku błędu. Strona nieistniejącego produktu z komunikatem „nie znaleziono” i kodem 200 może zostać potraktowana jako soft 404.
Limity map witryny XML
Pojedyncza mapa witryny może zawierać maksymalnie:
- 50 000 adresów URL,
- 50 MB po rozpakowaniu.
Większy serwis powinien stosować wiele map oraz indeks map witryny. Sitemap wspiera odkrywanie adresów, ale nie zastępuje linkowania wewnętrznego.
Rozmiar pobieranego HTML
Robot może nie przetwarzać dokumentu HTML bez ograniczeń. Szczególnie istotne informacje nie powinny znajdować się dopiero po wielu megabajtach kodu. Przyjmuje się limit pierwszych 15 MB odpowiedzi HTML dla pojedynczego zasobu.
W praktyce prawidłowy dokument powinien być wielokrotnie mniejszy. Tak duży HTML zwykle wskazuje na problemy z architekturą, osadzonymi danymi lub duplikacją kodu.
Liczba etapów potrzebnych do zobaczenia treści
Najbezpieczniejszy wariant to:
- jedno żądanie strony,
- odpowiedź HTML zawierająca treść,
- opcjonalna hydratacja i funkcje interaktywne.
Każdy dodatkowy etap – pobranie skryptu, wykonanie kodu, zapytanie do API, odczyt tokenu i ponowne renderowanie – zwiększa liczbę punktów awarii.
Najczęstsze błędy JavaScript SEO
Pusty HTML aplikacji
Serwer zwraca jedynie kontener i odwołania do skryptów. Awaria jednego zasobu powoduje brak całej zawartości.
Linki bez href
Nawigacja oparta na onclick, elementach div lub niestandardowych komponentach może utrudniać odkrywanie adresów.
Treść dostępna dopiero po interakcji
Robot może nie klikać przycisków, nie rozwijać filtrów i nie przewijać strony tak jak użytkownik.
Błędy API
Front-end działa, ale API blokuje część żądań, wymaga tokenu lub zwraca błędy dla ruchu z określonych lokalizacji.
Blokowanie plików JS i CSS
Jeśli robot nie może pobrać zasobów potrzebnych do renderowania, może otrzymać niepełną stronę. Reguły robots.txt, zapora i CDN powinny być analizowane łącznie.
Niewłaściwe kody HTTP
SPA może wyświetlać ekran 404, nadal zwracając status 200. Może też przekierowywać wszystkie nieznane adresy do strony głównej.
Sprzeczne metadane
W HTML znajduje się jeden canonical lub tytuł, a JavaScript ustawia inny. Powstaje niejednoznaczny sygnał.
Adresy zależne od fragmentów
Adresy takie jak /#/produkt/123 nie są dobrym zamiennikiem standardowych, indeksowalnych ścieżek.
Blokada robotów przez system bezpieczeństwa
WAF, CDN lub system ochrony przed botami może zwracać CAPTCHA, 403 albo 429. Test wykonany przez pracownika nie ujawni wtedy problemu dotyczącego crawlerów.
Renderowanie spersonalizowane
Jeśli treść zależy od lokalnej pamięci, historii użytkownika lub sesji, robot może otrzymywać stronę domyślną, pustą albo niekompletną.
Mity dotyczące JavaScriptu i SEO
Mit: Google nie wykonuje JavaScriptu
Google potrafi renderować wiele stron wykorzystujących JavaScript. Nie oznacza to jednak, że każdy skrypt zawsze zostanie wykonany poprawnie ani że wszystkie roboty mają takie same możliwości.
Mit: jeśli treść jest w DOM, na pewno trafi do indeksu
DOM widoczny w przeglądarce użytkownika nie jest dowodem na to, że robot uzyska identyczny dokument. Nawet poprawnie wyrenderowana treść może nie zostać zaindeksowana.
Mit: SSR automatycznie rozwiązuje całe SEO
SSR poprawia dostępność początkowej treści, lecz nie naprawia niskiej jakości, błędnej kanonikalizacji, słabego linkowania czy kodów HTTP.
Mit: sitemap zastępuje linki
Mapa witryny pomaga odkrywać adresy. Nie tworzy jednak kontekstu, hierarchii ani przepływu sygnałów zapewnianych przez linkowanie wewnętrzne.
Mit: narzędzie do audytu widzi dokładnie to samo co Google
Crawler SEO może renderować stronę inną wersją przeglądarki, z innym limitem czasu i ustawieniami. Jego wyniki są ważne diagnostycznie, ale powinny być potwierdzone w narzędziach Google i logach.
Mit: duży framework zawsze szkodzi SEO
Framework nie przesądza o wyniku. Znaczenie ma sposób renderowania, ilość przesyłanego kodu, dostępność treści, obsługa adresów i wydajność implementacji.
Procedura audytu JavaScript SEO krok po kroku
Krok 1: wybierz reprezentatywne szablony
Nie testuj tylko strony głównej. Uwzględnij:
- kategorię,
- produkt lub ofertę,
- artykuł,
- paginację,
- stronę błędu,
- adres z parametrami,
- stronę z danymi pobieranymi z API.
Krok 2: sprawdź status HTTP i przekierowania
Potwierdź, że poprawne strony zwracają 200, przekierowania są celowe, a usunięte zasoby zwracają właściwy status.
Krok 3: pobierz HTML bez JavaScriptu
Sprawdź obecność treści, tytułu, canonicala, robots, danych strukturalnych i linków.
Krok 4: wyrenderuj stronę
Porównaj DOM z odpowiedzią serwera. Zapisz różnice i moment pojawiania się poszczególnych elementów.
Krok 5: wykonaj test w Search Console
Przeszukaj wyrenderowany HTML i sprawdź zasoby, których nie udało się wczytać.
Krok 6: przeanalizuj konsolę oraz sieć
Szukaj błędów wykonania, nieudanych zapytań API, przekroczeń czasu, blokad CORS i zasobów zwracających 403 lub 429.
Krok 7: sprawdź linki
Każda istotna podstrona powinna być dostępna przez standardowy link. Zweryfikuj również działanie adresu po bezpośrednim wejściu.
Krok 8: porównaj urządzenia i warunki
Przetestuj wolniejsze połączenie, urządzenie mobilne, brak plików cookie i nową sesję. Problemy często ujawniają się dopiero poza środowiskiem dewelopera.
Krok 9: przeanalizuj logi
Sprawdź zachowanie prawdziwych robotów w dłuższym okresie, a nie tylko w jednorazowym teście.
Krok 10: monitoruj po wdrożeniu
Po zmianie architektury obserwuj:
- liczbę indeksowanych stron,
- raporty indeksowania,
- błędy serwera,
- częstotliwość crawlowania,
- ruch organiczny według szablonów,
- Core Web Vitals,
- różnice między HTML serwerowym a renderowanym.
Jak ustalać priorytety napraw?
Najwyższy priorytet mają problemy, które uniemożliwiają robotowi dotarcie do strony lub zobaczenie jej głównej treści.
| Problem | Wpływ | Pilność | Zalecane działanie |
|---|---|---|---|
| Blokada strony w robots.txt | krytyczny | natychmiast | zweryfikować cel blokady |
noindex na ważnych stronach | krytyczny | natychmiast | usunąć błędną dyrektywę |
| Pusty render po błędzie JS | krytyczny | natychmiast | naprawić błąd i zapewnić HTML serwerowy |
Linki bez href | wysoki | wysoka | zastosować standardowe odnośniki |
| API blokujące roboty | wysoki | wysoka | zmienić autoryzację, CDN lub rendering |
| Soft 404 w aplikacji | wysoki | wysoka | zwracać poprawne statusy HTTP |
| Canonical ustawiany sprzecznie | wysoki | wysoka | ujednolicić sygnał serwerowy |
| Treść ładowana po kliknięciu | średni lub wysoki | zależna od treści | umieścić ją w HTML lub DOM początkowym |
| Nadmierny JavaScript | średni | średnia | ograniczyć kod i pracę głównego wątku |
| Metadane generowane klientowo | średni | średnia | przenieść do renderowania serwerowego |
| Błędy tylko w narzędziu zewnętrznym | nieznany | do weryfikacji | potwierdzić w Google i logach |
Checklista: czy roboty widzą zawartość strony?
- Strona zwraca prawidłowy kod HTTP.
- Ważny adres nie jest zablokowany w
robots.txt. - Strona nie zawiera przypadkowego
noindex. - Główna treść jest obecna w HTML lub w renderze Google.
- Każda ważna podstrona ma własny, stabilny URL.
- Linki wewnętrzne wykorzystują
<a href>. - Bezpośrednie otwarcie podstrony działa bez wcześniejszej nawigacji w aplikacji.
- Pliki JS, CSS, obrazy i API są dostępne dla robotów.
- Konsola nie pokazuje błędów zatrzymujących aplikację.
- Tytuł, canonical i robots są zgodne przed oraz po renderowaniu.
- Dane strukturalne odpowiadają widocznej treści.
- Strony 404 zwracają odpowiedni status.
- Paginacja działa bez nieskończonego przewijania.
- Kluczowa treść nie wymaga kliknięcia.
- System bezpieczeństwa nie blokuje prawdziwych robotów.
- Logi potwierdzają pobieranie istotnych szablonów.
- Serwis działa także przy wolniejszym połączeniu.
- Wdrożenia są monitorowane pod kątem zmian w indeksacji.
FAQ – JavaScript a widoczność treści dla robotów
Czy Google widzi treść dodawaną przez JavaScript?
Tak, Google może renderować i indeksować treść dodaną przez JavaScript. Musi jednak mieć dostęp do strony, skryptów i danych, a kod musi wykonać się bez błędów. Nie oznacza to, że każda treść generowana klientowo zostanie automatycznie zaindeksowana.
Jak najszybciej sprawdzić, co widzi Googlebot?
Wykonaj test aktywnego adresu w Google Search Console, sprawdź wyrenderowany HTML i wyszukaj w nim charakterystyczny fragment treści. Następnie porównaj wynik z HTML zwracanym przez serwer.
Czy brak treści w źródle strony jest błędem?
Nie zawsze. Treść może zostać dodana podczas renderowania. Jest to jednak sygnał, że strona zależy od JavaScriptu i wymaga dokładniejszych testów.
Czy opcja „Wyświetl źródło strony” pokazuje DOM?
Nie. Pokazuje odpowiedź HTML otrzymaną z serwera. DOM po wykonaniu JavaScriptu można sprawdzić w inspektorze elementów.
Czy warto udawać Googlebota przez zmianę user-agenta?
To pomocniczy test odpowiedzi serwera, nie pełna symulacja Google. Zmiana user-agenta nie uruchamia mechanizmu renderowania i nie odtwarza całego środowiska robota.
Czy SSR jest zawsze najlepszy dla SEO?
Nie. Dla treści zmieniających się rzadko lepsze może być SSG, a dla panelu po zalogowaniu wystarczający będzie CSR. W wielu serwisach optymalny jest model hybrydowy.
Czy strona SPA może dobrze pozycjonować się w Google?
Tak, jeśli ma indeksowalne adresy, prawidłowe linki, dostępne treści, właściwe statusy HTTP, poprawne metadane i stabilny rendering. Samo SPA nie wyklucza widoczności organicznej.
Czy Googlebot klika przyciski i przewija stronę?
Nie należy projektować indeksacji z takim założeniem. Treść i linki ważne dla SEO powinny być dostępne bez wymagania kliknięcia, przewijania lub wypełnienia formularza.
Czy JavaScript może zmieniać canonical?
Technicznie tak, lecz lepiej dostarczyć prawidłowy canonical w odpowiedzi serwera. Trzeba unikać sprzeczności między wersją początkową i wyrenderowaną.
Czy można dodać dane strukturalne przez JavaScript?
Tak, ale powinny być obecne w wersji wyrenderowanej i zgodne z treścią widoczną dla użytkownika. Warto je testować po każdej zmianie szablonu.
Dlaczego strona jest wyrenderowana, ale nie ma jej w indeksie?
Możliwe przyczyny to między innymi duplikacja, wybranie innego canonicala, niska jakość, soft 404, noindex, brak sygnałów wewnętrznych lub decyzja wyszukiwarki o nieindeksowaniu dokumentu.
Czy blokowanie plików JavaScript w robots.txt szkodzi SEO?
Może szkodzić, jeśli pliki są potrzebne do odtworzenia treści, nawigacji lub układu. Robot powinien mieć dostęp do zasobów niezbędnych do zrozumienia strony.
Czy szybkość JavaScriptu wpływa na indeksowanie?
Może wpływać pośrednio. Wolny lub niestabilny kod zwiększa ryzyko niepełnego renderu, a ponadto pogarsza doświadczenie użytkownika i wskaźniki wydajności.
Jak często należy audytować JavaScript SEO?
Po każdej istotnej zmianie frameworka, routingu, renderowania, API, CDN lub systemu zgód. W dużych serwisach kluczowe szablony warto monitorować automatycznie i okresowo weryfikować ręcznie.
Co jest najbezpieczniejszą zasadą wdrożeniową?
Najważniejszą treść, linki, metadane i dyrektywy indeksowania dostarczaj w początkowym HTML. JavaScript wykorzystuj przede wszystkim do wzbogacania funkcji i interakcji, a nie jako jedyny sposób udostępnienia dokumentu robotom.