JavaScript SEO to sprawdzenie i poprawa stron, w których JavaScript dostarcza treść, linki, routing albo sygnały techniczne. Strona jest przygotowana pod SEO wtedy, gdy Googlebot może pobrać URL, wyrenderować pełny dokument i odczytać główną treść, linki, canonical, meta robots oraz dane strukturalne bez dodatkowej interakcji użytkownika.
JavaScript SEO - rola i granice decyzji
JavaScript SEO odpowiada na jedno pytanie: czy publiczny URL oparty o JS jest dla Google pełnym dokumentem, czy tylko interfejsem, który dopiero po stronie klienta próbuje zbudować treść i sygnały SEO.
Zakres tej strony kończy się tam, gdzie render działa poprawnie. Gdy Google widzi pełną treść, linki i sygnały techniczne, dalsza diagnoza przechodzi do indeksowania, wyboru canonicala, jakości treści, linkowania wewnętrznego albo architektury informacji.
JavaScript może być warstwą interakcji albo warstwą dostarczania treści. SEO staje się ryzykowne głównie wtedy, gdy tytuł, H1, opis produktu, cena, lista ofert, linki lub canonical istnieją dopiero po wykonaniu skryptów.
Jak Google przetwarza JavaScript - crawl, render i indeks
Google przetwarza stronę opartą o JavaScript jako sekwencję: crawling, renderowanie i indeksowanie. Najpierw Googlebot pobiera HTML, sprawdza robots.txt, status HTTP, linki i zasoby, a dopiero później może uruchomić JavaScript w środowisku renderującym.
Pobranie HTML-a
Googlebot pobiera adres URL, sprawdza robots.txt, status HTTP, nagłówki i początkowy kod HTML.
Odkrywanie linków i zasobów
Z HTML-a odczytywane są linki w atrybutach href oraz zasoby potrzebne do renderowania, między innymi CSS i JavaScript.
Renderowanie
Google uruchamia stronę w Web Rendering Service, wykonuje JavaScript i analizuje wyrenderowany HTML.
Indeksowanie
Do indeksu może trafić treść widoczna po przetworzeniu strony, jeśli URL nie jest blokowany przez noindex, canonical, błędy lub niską wartość.
Według dokumentacji Google wyszukiwarka obsługuje JavaScript przy użyciu aktualnego Chromium, ale Googlebot nadal nie zachowuje się jak zalogowany użytkownik w przeglądarce. Nie zakładaj kliknięć, logowania, udzielania zgód, przewijania strony ani zachowania stanu między kolejnymi adresami. Dla większości witryn punktem odniesienia jest wersja mobilna, więc test renderu powinien obejmować mobile, a nie tylko desktop.
HTML źródłowy, renderowany DOM i widok użytkownika - co porównywać?
W JavaScript SEO nie wystarczy zobaczyć stronę w przeglądarce. Trzeba porównać trzy wersje: kod HTML zwrócony przez serwer, renderowany DOM po wykonaniu JavaScriptu oraz obraz strony, który widzi użytkownik. Każda różnica może być normalna, ale różnica w treści głównej, linkach i sygnałach SEO wymaga sprawdzenia.
| Warstwa | Co sprawdzasz? | Co oznacza problem? |
|---|---|---|
| Źródłowy HTML | Title, meta robots, canonical, H1, główną treść, linki i dane strukturalne. | Jeśli HTML jest pustą powłoką, Google musi czekać na render i poprawne wykonanie JS. |
| Renderowany DOM | To, co zostaje po uruchomieniu JS, hydratacji, API i komponentów. | Jeśli DOM nie zawiera treści, problem może leżeć w błędzie JS, API, blokadzie zasobów albo czasie ładowania. |
| Widok użytkownika | Treść widoczną na mobile, bez logowania, zgód i specjalnego stanu przeglądarki. | Jeśli użytkownik widzi więcej niż Google, porównaj sesję, cookies, geolokalizację, API i lazy loading. |
SSR, SSG, CSR i prerendering - jak dobrać renderowanie pod SEO?
Model renderowania powinien wynikać z typu URL-a i celu indeksacji. Im bardziej strona ma działać jako wynik Google, tym wcześniej powinna dostarczać treść, linki i sygnały techniczne. Widoki aplikacyjne bez celu indeksacji mogą zostać mocniej po stronie klienta.
| Model | Kiedy ma sens? | Rola SEO | Ryzyko |
|---|---|---|---|
| SSG Static Site Generation | Treść generowana przed publikacją, np. blog, dokumentacja, landingi, kategorie z rzadkimi zmianami. | Dobry wybór, gdy ważna treść może być w HTML-u od pierwszej odpowiedzi. | Wymaga dobrego procesu odświeżania danych, żeby strona nie pokazywała nieaktualnych informacji. |
| SSR Server-Side Rendering | Strony dynamiczne, produkty, oferty, widoki zależne od danych, które muszą być aktualne przy żądaniu. | Ułatwia Google zobaczenie tytułu, H1, treści, linków i danych produktu bez czekania na pełny render po stronie klienta. | Może pogorszyć TTFB, jeśli serwer, API albo cache są źle zaprojektowane. |
| CSR Client-Side Rendering | Panele, aplikacje po zalogowaniu, narzędzia interaktywne albo sekcje, których Google nie musi indeksować. | Może działać, ale wymaga testów renderu, dostępnych zasobów, crawlable links i stabilnego ładowania treści. | Pusty app shell, opóźnione API, błędy JS i linki tylko na klik mogą ograniczyć odkrywanie oraz indeksowanie. |
| Prerendering Wstępne renderowanie wybranych URL-i | Witryny CSR, w których nie da się szybko przebudować frontu, a część publicznych adresów ma wartość SEO. | Może być sensownym pomostem, jeśli użytkownik i Google dostają równoważną treść. | Trzeba pilnować aktualności, cache i zgodności treści, żeby nie tworzyć dwóch różnych wersji strony. |
| Dynamic rendering Osobny render dla crawlerów | Wyjątkowe przypadki przejściowe, gdy serwis ma poważny problem z JS i nie może od razu wdrożyć SSR lub SSG. | Według dokumentacji Google to obejście tymczasowe. Lepszym celem jest SSR, SSG albo hydratacja. | Różnice między wersją dla użytkownika i bota mogą wprowadzać błędy diagnostyczne oraz ryzyko niezgodności. |
W praktyce decyzja nie dotyczy całej domeny naraz. Ten sam serwis może mieć SSG dla artykułów, SSR dla produktów i CSR dla panelu użytkownika.
| Typ URL-a | Cel SEO | Preferowany model | Co musi być dostępne? |
|---|---|---|---|
| Artykuł, strona usługi, landing | URL ma odpowiadać na konkretną intencję i pozyskiwać ruch z Google. | SSG albo SSR | Title, H1, lead, główna treść, linki i canonical dostępne od pierwszego renderu. |
| Kategoria, produkt, lista ofert | Google ma widzieć asortyment, ceny, dostępność, linki do detali i dane strukturalne. | SSR, SSG z odświeżaniem albo hybryda | Treść listy, paginacja, status HTTP, self-canonical i schema zgodne z widokiem użytkownika. |
| Filtr SEO lub paginacja | Tylko wybrane warianty mają być samodzielnymi URL-ami w indeksie. | SSR/SSG dla wariantów indeksowalnych | Stały URL, link <a href>, unikalny zakres, canonical i brak zależności od samego scrolla. |
| Panel, koszyk, konto, konfigurator | Widok ma działać dla użytkownika, ale zwykle nie ma być wynikiem Google. | CSR jest zwykle wystarczający | Kontrola noindex, dostęp po logowaniu albo brak linkowania do technicznych URL-i. |
Najmniej ryzykowny wzorzec dla publicznych stron SEO to dokument, który zawiera podstawową odpowiedź bez kruchej sekwencji skryptów, a JavaScript dopiero wzmacnia interakcję i doświadczenie użytkownika.
Co musi być dostępne dla Google na stronie opartej o JS?
Google musi widzieć te elementy, które określają temat dokumentu, adres reprezentatywny, możliwość indeksowania i dalsze ścieżki crawlowania. Przy JavaScript SEO kontroluje się nie tylko treść, ale cały zestaw sygnałów przed i po renderowaniu.
| Element | Wymaganie | Dlaczego? |
|---|---|---|
| Title i meta description | Powinny być unikalne i zgodne z właściwym URL-em. | To podstawowy opis dokumentu i kontekstu wyniku w Google. |
| H1 i główna treść | Powinny być dostępne w HTML-u albo stabilnie widoczne w renderowanym DOM. | Bez nich Google może zobaczyć powłokę aplikacji zamiast strony o konkretnej intencji. |
| Linki wewnętrzne | Używaj elementów <a> z atrybutem href prowadzącym do prawdziwego URL-a. | Google odkrywa adresy przede wszystkim z linków, a nie z samej obsługi kliknięcia w JavaScripcie. |
| Canonical | Najbezpieczniej umieszczać go w HTML head i nie zmieniać na inną wartość po renderze. | Sprzeczny canonical utrudnia wybór reprezentatywnego adresu. |
| Meta robots | Noindex powinien być świadomą decyzją, a nie efektem błędu w szablonie lub API. | Przypadkowy noindex w renderze może wykluczyć stronę z wyników. |
| Dane strukturalne | Schema musi opisywać treść widoczną dla użytkownika i być obecna po renderowaniu. | Google może odrzucić dane, które nie pasują do widocznej zawartości strony. |
Linki i routing SPA - czyste URL-e zamiast widoków ukrytych za kliknięciem
Google może odkrywać adresy z elementów HTML <a href="/adres">. Dlatego ważne widoki w SPA nie powinny istnieć wyłącznie jako stan aplikacji, obsługa kliknięcia albo fragment URL-a po znaku #. Każda strona z intencją SEO powinna mieć stały, możliwy do pobrania adres.
// słabo dla odkrywania URL-i
<button onClick={() => router.push("/produkty")}>Produkty</button>
// lepiej dla użytkowników i crawlerów
<a href="/produkty">Produkty</a>Routing po stronie klienta może działać, ale URL musi być realny. History API jest bezpieczniejsze niż hash routing dla ważnych widoków, bo adres można pobrać, odświeżyć, podlinkować i przeanalizować jako osobny dokument.
Status HTTP, canonical, noindex i schema - sygnały nie mogą zmieniać sensu po renderze
Status HTTP, canonical, noindex i schema powinny opisywać ten sam URL przed i po renderowaniu. JavaScript może zmieniać elementy head, ale najważniejsze sygnały nie powinny zależeć od niestabilnego API, opóźnionego komponentu albo błędu hydratacji.
- Strona błędu w SPA nie powinna zwracać zwykłego 200 OK z komunikatem „nie znaleziono”.
- Canonical w HTML-u i po renderowaniu powinien wskazywać ten sam reprezentatywny URL.
- Noindex dodawany przez JS powinien być świadomym wyjątkiem, a nie domyślnym stanem ładowania.
- Dane strukturalne powinny być zgodne z treścią widoczną dla użytkownika po renderowaniu.
- Sitemap.xml powinna wzmacniać finalne, kanoniczne URL-e, a nie adresy aplikacyjne bez treści.
Jeśli problem dotyczy JSON-LD dodawanego przez aplikację, sprawdź, czy dane strukturalne zgodne z treścią po renderowaniu mają właściwy typ schema.org, widoczne pola, stabilne dane i poprawny wynik w Rich Results Test.
Jeżeli route w aplikacji pokazuje brak produktu, artykułu albo danych, ale serwer nadal zwraca 200 OK, diagnozuj go jako możliwy soft 404 w aplikacji SPA.
Jeśli problem dotyczy wyboru reprezentatywnego adresu, przejdź do przewodnika o canonicalu w SEO. Jeśli chodzi o listę URL-i zgłaszanych Google, właściwym miejscem jest sitemap.xml w SEO.
Lazy loading i infinite scroll - wydajność bez ukrywania treści
Lazy loading pomaga wydajności, ale w SEO jest poprawny tylko wtedy, gdy istotna treść ładuje się bez kliknięcia, ręcznego scrollowania albo zgody użytkownika. Krytyczna treść pierwszego widoku nie powinna być opóźniana bez powodu, a dalsze elementy powinny ładować się wtedy, gdy trafiają do viewportu.
Jeśli lazy loading, hydracja albo ciężki JavaScript pogarszają LCP lub INP, dalsza diagnoza należy do przewodnika Core Web Vitals - LCP, INP i CLS.
Infinite scroll wymaga osobnych, trwałych URL-i dla kolejnych fragmentów listy oraz linków, które pozwalają Google odkryć te adresy. Samo dogrywanie kolejnych elementów po scrollu nie tworzy jeszcze stabilnej architektury indeksowania.
Jak sprawdzić, czy Google widzi treść renderowaną przez JavaScript?
Diagnoza JavaScript SEO zaczyna się od porównania tego, co wysyła serwer, z tym, co Google może wyrenderować. Jedno narzędzie zwykle nie wystarczy, bo GSC pokazuje perspektywę Google, crawler pokazuje skalę problemu, a logi pokazują realne żądania.
| Objaw | Prawdopodobna przyczyna | Co poprawić? |
|---|---|---|
| Google widzi pusty ekran lub loader | Treść ładuje się dopiero po API, które zwraca błąd, timeout albo wymaga sesji. | Przenieś treść krytyczną do SSR/SSG, dodaj fallback i sprawdź odpowiedzi API dla Googlebota. |
| W GSC brakuje linków do podstron | Nawigacja działa przez onClick, buttony, fragmenty URL albo elementy bez href. | Zastąp je linkami <a href> i czystymi URL-ami obsługiwanymi przez History API. |
| Strona błędu zwraca 200 OK | SPA obsługuje brak danych po stronie klienta, ale serwer nadal zwraca poprawny status. | Zwróć prawdziwe 404/410 albo dodaj noindex dla widoku błędu, jeśli inaczej się nie da. |
| Google wybiera inny canonical | Canonical w HTML, canonical po renderze, sitemap i linkowanie wskazują różne adresy. | Ujednolić self-canonical, linkowanie, sitemapę i wersję po renderowaniu. |
| Treść z lazy loadingu nie trafia do indeksu | Wczytanie zależy od kliknięcia, scrolla użytkownika albo niestabilnego mechanizmu. | Ładuj treść, gdy pojawia się w viewportcie, i testuj ją w renderowanym HTML-u. |
| Sygnał | Co sprawdzić? | Jak czytać wynik? |
|---|---|---|
| Render w Inspekcji URL | Sprawdź zrzut ekranu, HTML renderowany, załadowane zasoby i błędy JavaScript. | Jeśli w renderze nie ma głównej treści, problem dotyczy dostępności lub wykonania JS. |
| Porównanie źródła i DOM | Porównaj View Source, HTML po renderze i widok użytkownika. | Duża różnica nie zawsze jest błędem, ale wymaga kontroli tytułu, H1, linków, canonicala i treści. |
| Test bez JavaScriptu | Wyłącz JS albo pobierz HTML narzędziem technicznym i sprawdź, co zostaje. | Jeśli zostaje pusta ramka, architektura może wymagać SSR, SSG albo prerenderingu. |
| Crawl z renderowaniem | Przeskanuj witrynę crawlerem, który wykonuje JavaScript i porównaj wynik z crawlem bez JS. | Różnice pokażą URL-e, linki i elementy, które zależą od działania frontu. |
| Logi serwera | Sprawdź żądania Googlebota, pobierane zasoby, statusy i częstotliwość wizyt. | Logi pokazują realny crawl, a nie tylko deklaracje narzędzi. |
W Google Search Console użyj Inspekcji URL, testu live URL, zrzutu ekranu i renderowanego HTML-u. Jeśli wynik pokazuje brak treści, błędy zasobów albo inną wersję niż użytkownik, JavaScript SEO jest głównym kierunkiem diagnozy. Pełny kontekst pracy z GSC opisuje artykuł Google Search Console - co to jest i do czego służy.
Po poprawce nie wystarczy sprawdzić, czy strona działa w przeglądarce. Trzeba sprawdzić, czy zmienił się sygnał, który blokował widoczność.
| Co mierzyć? | Gdzie sprawdzić? | Jaka decyzja? |
|---|---|---|
| Kompletność renderowanego HTML-u | Inspekcja URL, test live URL, crawler z renderowaniem | Czy po renderze widoczne są title, H1, główna treść, linki, canonical, noindex i schema? |
| Różnica między crawlem bez JS i z JS | Crawler techniczny | Które URL-e, linki albo sekcje istnieją tylko po wykonaniu JavaScriptu? |
| Błędy JavaScript i zasobów | GSC, logi, monitoring błędów, narzędzia developerskie | Czy błędy występują na pojedynczym URL-u, czy na całym szablonie? |
| Statusy indeksowania po poprawce | Google Search Console | Czy problem nadal dotyczy renderu, czy przeszedł do canonicala, jakości treści albo linkowania? |
Jak przygotować stronę opartą o JS pod SEO - proces wdrożenia
Proces wdrożenia JavaScript SEO powinien zaczynać się od klasyfikacji URL-i, nie od pojedynczego błędu w narzędziu. Najpierw ustal, które szablony mają być wynikami Google, a dopiero potem wybierz renderowanie, linki, statusy i testy.
Ustal, które treści mają być indeksowane
Oddziel publiczne strony SEO od paneli, koszyka, wyszukiwarki wewnętrznej i widoków po zalogowaniu.
Wybierz model renderowania dla szablonu
Dla bloga, kategorii, produktów i usług rozważ SSG, SSR albo prerendering. CSR zostaw tam, gdzie indeksacja nie jest celem albo jest dobrze przetestowana.
Umieść elementy krytyczne jak najwcześniej
Title, H1, główna treść, linki, canonical, meta robots i schema nie powinny zależeć od kruchej sekwencji skryptów.
Zaprojektuj crawlable links i czyste URL-e
Każdy ważny widok powinien mieć stały URL, link <a href> i odpowiedź serwera zgodną z rzeczywistym stanem strony.
Przetestuj render na reprezentatywnych URL-ach
Sprawdź stronę główną, kategorię, produkt, artykuł, filtr SEO, paginację i stronę błędu, a nie tylko jeden wygodny adres.
Monitoruj po wdrożeniu
Porównaj GSC, logi, crawl techniczny, błędy JS i statusy indeksowania po zmianie szablonu albo frontu.
Najczęstsze błędy JavaScript SEO
Błędy JavaScript SEO rzadko są widoczne jako jeden komunikat „Google nie lubi JS”. Częściej są to rozproszone różnice między źródłem, renderem, statusem, linkami i wersją mobilną.
Zakładanie, że skoro użytkownik widzi treść, Google też ją widzi
Użytkownik może mieć aktywną sesję, szybkie API, inne cache i inny przebieg interakcji niż Googlebot.
Budowanie nawigacji jako zdarzeń kliknięcia
Button z onClick może działać w aplikacji, ale nie jest tym samym co link HTML prowadzący do indeksowalnego URL-a.
Zmiana canonicala dopiero po niestabilnym renderze
Jeśli canonical zależy od danych z API, błędu hydratacji albo wtyczki, Google może dostać sprzeczne sygnały.
Ukrywanie głównej treści za lazy loadingiem
Lazy loading jest dobry dla wydajności, ale nie powinien wymagać od Google kliknięcia lub manualnego scrollowania.
Diagnoza tylko na stronie głównej
Najczęściej problem siedzi w szablonie produktu, kategorii, filtrze, paginacji albo widoku błędu, nie na stronie głównej.
Mieszanie problemu JS z każdym problemem indeksowania
Brak indeksacji może wynikać z noindex, canonicala, robots.txt, jakości treści, duplikacji lub linkowania, nawet gdy render działa poprawnie.
Kiedy zmieniać sposób renderowania, a kiedy diagnozować dalej?
Zmiana renderowania ma sens, gdy problem powtarza się na ważnym szablonie i wpływa na treść, linki albo sygnały SEO. Jeśli Google widzi pełny render, nie zmieniaj architektury tylko dlatego, że strona używa JavaScriptu.
| Sytuacja | Decyzja |
|---|---|
| Treść SEO jest pusta w źródłowym HTML-u i pojawia się dopiero po kilku żądaniach API | Rozważ SSR, SSG albo prerendering dla danego szablonu. |
| Strona ma wartościowy content, ale Google często widzi loader, błędy JS lub niepełny render | Nie łataj wyłącznie pojedynczego błędu. Popraw architekturę ładowania danych. |
| Widok nie ma być w Google, bo jest panelem, koszykiem albo funkcją po zalogowaniu | CSR jest zwykle wystarczający, a ważniejsze są noindex, dostęp i brak linkowania do URL-i technicznych. |
| Problem dotyczy tylko kilku publicznych URL-i, a przebudowa frontu potrwa | Prerendering może być rozwiązaniem przejściowym, jeśli treść dla bota i użytkownika jest równoważna. |
| Google widzi treść, ale URL nadal nie jest indeksowany | Przenieś diagnozę do indeksowania, canonicala, jakości treści i linkowania wewnętrznego. |
Powiązane tematy techniczne
Powiązane tematy są tu dalszym krokiem diagnostycznym, nie drugim głównym tematem strony. Wybierz je dopiero po ustaleniu, czy problem dotyczy renderu, odkrywania URL-i, indeksacji albo blokady zasobów.
hub o crawl, renderowaniu, indeksowaniu, canonicalach, statusach i architekturze technicznej
jak Google odkrywa URL-e, linki i zasoby potrzebne do renderu
co sprawdzić, gdy render działa, ale URL nadal nie trafia do indeksu
jak diagnozować LCP, INP i CLS, gdy JavaScript, obrazy lub hydracja pogarszają doświadczenie użytkownika
kiedy blokada CSS, JS albo API utrudnia renderowanie strony
Google widzi pełną stronę czy tylko powłokę aplikacji?
Sprawdzimy HTML źródłowy, renderowany DOM, Inspekcję URL w GSC, linki, routing SPA, canonicale, noindex, statusy HTTP, lazy loading, logi i crawl z renderowaniem, żeby ustalić, czy problem leży w JavaScripcie, indeksowaniu czy architekturze strony.
FAQ
01Co to jest JavaScript SEO?
JavaScript SEO to część SEO technicznego, która sprawdza, czy Google może pobrać, wyrenderować i zindeksować treść generowaną lub zmienianą przez JavaScript. Obejmuje między innymi SSR, SSG, CSR, linki, routing, lazy loading, canonicale, meta robots i diagnostykę renderu.
02Czy Google indeksuje strony z JavaScriptem?
Tak, Google może renderować JavaScript, ale nie warto zakładać, że każda ważna treść zostanie szybko i bezbłędnie odczytana po stronie klienta. Kluczowe informacje powinny być dostępne w HTML-u lub stabilnym renderowanym DOM.
03Jak sprawdzić, czy Google widzi treść renderowaną przez JS?
Użyj Inspekcji URL w Google Search Console, testu live URL, zrzutu ekranu i renderowanego HTML-u. Porównaj je ze źródłowym HTML-em oraz widokiem użytkownika. Dodatkowo sprawdź błędy JS, zablokowane zasoby i crawl z renderowaniem.
04Czy SSR jest zawsze lepszy od CSR pod SEO?
Nie zawsze. SSR lub SSG są zwykle bezpieczniejsze dla publicznych stron SEO, ale CSR może wystarczyć dla aplikacji, paneli i widoków bez celu indeksacji. Decyzja zależy od tego, czy Google musi widzieć treść, linki i sygnały strony.
05Czy dynamic rendering jest dobrym rozwiązaniem?
Według dokumentacji Google dynamic rendering jest obejściem tymczasowym, a nie docelowym standardem. Lepszym kierunkiem jest SSR, SSG albo hydratacja, które udostępniają równoważną, stabilną treść użytkownikom i robotom.
06Czy blokowanie JavaScriptu w robots.txt szkodzi SEO?
Może szkodzić, jeśli zablokowany plik jest potrzebny do renderowania treści, linków, danych produktu, canonicala albo danych strukturalnych. Zasoby krytyczne dla interpretacji strony powinny być dostępne dla Googlebota.