Join our community of websites already using SEOJuice to automate the boring SEO work.
See what our customers say and learn about sustainable SEO that drives long-term growth.
Explore the blog →TL;DR: SEO dla SPA to już nie problem renderowania, lecz dostarczania: adresy URL, kody statusu, metadane i główna treść muszą istnieć zanim JavaScript „zabierze głos”, bo Google może renderować z opóźnieniem, a wiele botów AI w ogóle nie renderuje JS.
Większość porad dotyczących SPA SEO zaczyna się od złego pytania: czy Google potrafi renderować JavaScript?
Tak. Google potrafi renderować JavaScript. Martin Splitt powtarza to od lat, a ludzie wciąż debugują SPA, wpatrując się w view-source:, jakby to była strona zaindeksowana przez Google.
„Wiele osób wciąż patrzy na view source. To nie to, czego używamy do indeksowania. Używamy renderowanego HTML.”
Martin Splitt, Developer Advocate w Google
Ten cytat jest ważny, bo eliminuje zły nawyk. Jeśli sprawdzasz tylko początkowy kod Reacta, Vue, Angulara, SvelteKit, Nuxt, Remix czy Next.js, możesz przeoczyć to, co ostatecznie widzi Google. Liczy się renderowane DOM.
Ale to nie znaczy, że renderowanie po stronie klienta jest bezpieczne dla każdej publicznej trasy. Renderowanie kosztuje czas. Może się nie udać. Może nastąpić później niż crawling. Inne boty mogą w ogóle nie renderować. Prawdziwe pytanie dla spa seo brzmi: czy crawler dostanie użyteczny dokument wystarczająco szybko.
View source pokazuje pierwszą odpowiedź HTML. W klasycznej aplikacji CSR może to być pusta skorupa, jeden korzeń, jeden bundle JS i modlitwa. Google może później wyrenderować stronę, wykonać trasę, wywołać API i odkryć właściwą treść. Może.
To „może” sprawia, że rankingi wariują. Strona może wyglądać idealnie w przeglądarce, a mimo to być krucha dla wyszukiwarek — przeglądarka jest cierpliwa, ale crawlery to systemy z kolejkami, budżetami, limitami czasu i trybami awarii.
seojuice.io jest celowo podzielone — publiczne strony wysyłają statyczny HTML, zalogowany dashboard zachowuje się jak aplikacja. Dwie strategie renderowania pod jedną domeną, bo te trasy mają różne zadania.
Blog, narzędzia i landing pages muszą być znajdowane, crawlowane, rozumiane, udostępniane i cytowane. Dashboard nie musi rankować na frazę „page health scoring UI” i nigdy nie będzie. JavaScript może ulepszać publiczną stronę po załadowaniu, ale pierwsza odpowiedź powinna już wyglądać jak strona.
Przez lata traktowałem to jako problem wyłącznie Google (myliłem się). Potem boty AI pogorszyły stary skrót.
„Wyniki konsekwentnie pokazują, że żaden z głównych crawlerów AI nie renderuje obecnie JavaScriptu.”
Vercel Engineering
Jeśli GPTBot, ClaudeBot, PerplexityBot lub inny crawler widzi tylko skorupę aplikacji, twojej treści po prostu tam nie ma. Wsparcie Google dla renderowania pomaga Google (i tylko Google) — nie ratuje każdego crawlera, bota podglądu, narzędzia monitorującego, parsera social czy systemu ingestującego AI.
To krok, który większość zespołów pomija. Pytają, czy całe SPA potrzebuje SSR. Takie ujęcie marnuje zasoby inżynierskie.
Prawdziwe SPA prawie zawsze miesza dwie rzeczy: crawlowalne strony i prywatne stany aplikacji. Cenniki, posty blogowe, dokumentacja, szablony, integracje, strony porównawcze i landing pages to strony. Dashboardy, onboarding, modale, filtry, ekrany konta i zapisane raporty to stany aplikacji.
Naprawę zaczyna klasyfikacja. Nie proś inżynierów, by „naprawili SEO dla aplikacji”. Poproś, by oznaczyli, które trasy zasługują na ruch z wyszukiwarek, a potem wybierz renderowanie, indeksowanie, canonicale i kody statusu dla każdej trasy.
| Typ trasy | Czy powinna rankować? | Model renderowania | Zasada indeksacji |
|---|---|---|---|
| Post na blogu | Tak | SSG lub SSR | Index, canonical do siebie |
| Landing produktowy | Tak | SSG lub SSR | Index, canonical do siebie |
| Strona wyników wyszukiwania | Zwykle nie | CSR lub SSR | Często noindex |
| Ruta dashboardu | Nie | CSR wystarcza | Blokada za auth lub noindex |
| URL filtrowania fasetowego | Czasem | SSR tylko, jeśli kuratorowana | Canonical lub noindex |
Tak wyjaśniłbym to w audycie technicznego SEO. SPA z 40 publicznymi adresami URL i 4 000 stanów dashboardu nie ma 4 040 stron SEO. Ma 40 stron i interfejs produktu.
To rozróżnienie zmienia roadmapę. Publiczne trasy potrzebują stabilnych URL-i, self-canonicali, metadanych dostarczanych z serwera, crawlowalnych linków, sensownego HTML-a w pierwszym bajcie i poprawnych kodów statusu. Trasy dashboardu potrzebują szybkiej interakcji, auth, zarządzania stanem i prywatności. Wciskanie obu grup w jeden model renderowania zazwyczaj pogarsza obie.
W mindnow to był najczęstszy błąd SPA, który widziałem w projektach klientów. Zespół chciał eleganckiej, jednolitej architektury front-endu. Search chciał nudnych dokumentów. Kompromisem nie było porzucenie aplikacji, lecz zaprzestanie udawania, że każda trasa ma ten sam cel.
Strategia renderowania to decyzja architektoniczna, nie ustawienie wtyczki SEO — jeśli wybierzesz zły model, każde kolejne zadanie będzie obejściem.
Renderowanie po stronie klienta jest w porządku dla ekranów wymagających logowania. Jeśli użytkownik musi się zalogować, crawler nie powinien i tak indeksować trasy. CSR staje się ryzykowne, gdy ta sama skorupa serwuje cenniki, dokumentację, artykuły i strony produktowe, gdzie treść pojawia się dopiero po wykonaniu JS i odpowiedziach API.
Statyczne generowanie oznacza, że strony budują się do HTML-a z wyprzedzeniem (zwykle przy deployu lub buildzie). Dla blogów, dokumentacji, changelogów, glosariuszy, szablonów i większości treści marketingowych SSG jest bezkonkurencyjne: szybkie, cache-owalne, tanie i przyjazne crawlerom.
Renderowanie po stronie serwera lepiej pasuje, gdy publiczna treść zmienia się zależnie od zapytania, geolokalizacji, stanu magazynu, uprawnień lub świeżości. Lee Robinson ujął model Next.js jasno:
„Next.js prerenderuje stronę do HTML na serwerze przy każdym żądaniu.”
Lee Robinson, VP of Developer Experience w Vercel
SSR daje crawlerom HTML bez czekania na bundle kliencki, a jednocześnie pozwala pokazać świeże dane.
Incremental Static Regeneration (odświeżanie statycznych stron po publikacji) to często najlepszy kompromis przy dużych bibliotekach treści. Większość żądań dostaje statyczny HTML, a regeneracja następuje, gdy treść się zmieni. Przy programmatic SEO, dokumentacji i dużych bibliotekach szablonów ISR zapobiega bólowi rebuildu bez cofania się do pełnego CSR.
Dynamic rendering serwuje jedną wersję crawlerom, a inną użytkownikom. Może uratować legacy SPA, gdy migracja nie jest gotowa — ale nie projektowałbym nowej strategii search wokół tego.
„Traktowałbym to jako tymczasowe obejście – gdzie tymczasowe może oznaczać parę lat – ale to rozwiązanie z ograniczonym terminem ważności.”
John Mueller, Search Advocate w Google
To właściwy model mentalny. Użyj dynamic rendering jako mostu, potem zastąp go trasami publicznymi renderowanymi na serwerze lub statycznie.
Poważne błędy SPA SEO są zwykle nudne. To nie tajemnicze kary rankingowe. To bugi dostarczania.
Pierwsza pułapka to uniwersalna skorupa. Każdy URL zwraca ten sam kod 200, ten sam pusty korzeń i ten sam bundle. Router później decyduje, czy /pricing, /docs/api albo /totally-fake-url istnieje. To zmusza crawlery do zbyt ciężkiej pracy i tworzy drugą pułapkę: soft 404.
„Zamiast odpowiedzieć 404, odpowiada 200 … zawsze pokazując stronę po wykonaniu JavaScriptu.”
Martin Splitt, Developer Advocate w Google
Nieprawidłowe trasy powinny zwracać prawdziwe 404 lub 410. Ładny komponent „page not found” po stronie klienta wysłany z 200 wciąż jest złym sygnałem (to pułapka soft 404, która marnuje budżet indeksowania).
Trzecia pułapka to nawigacja, której crawlery nie potrafią śledzić. Przyciski, click handlery, custom components i zdarzenia routera są w porządku dla użytkownika, ale wewnętrzne odkrywanie nadal potrzebuje linków z prawdziwymi atrybutami href. Jeśli twoje najważniejsze strony są osiągalne dopiero po kliknięciu handlera JS, crawlability jest słabsza, niż się wydaje.
Metadane to kolejna częsta porażka. Wiele SPA aktualizuje tytuły, opisy, canonicale, robots, Open Graph i schemę po zmianie trasy. Może to działać wizualnie w zakładce przeglądarki, a nadal zawieść crawlera, parsery social i boty AI. Metadane specyficzne dla trasy powinny być obecne w zwróconym HTML dla każdego indeksowalnego URL-a.
Canonicale zasługują na osobne ostrzeżenie. Widziałem aplikacje hydratujące poprawny canonical na domenę staging, adres root lub poprzednią trasę. Taki błąd jest cichy. Nikt go nie zauważy, dopóki duplikaty nie zbiorą się w złe klastry albo zacznie rankować niewłaściwa strona.
Nieskończone scrollowanie to kolejna pułapka, gdy ukrywa treść za stanem klienta. Jeśli strona druga, trzecia i starsze elementy nie mają crawlowalnych URL-i, wyszukiwarki mogą ich nigdy nie odkryć. Użyj stronicowanych URL-i zapasowych dla ważnych archiwów i kategorii.
Treść główna ładowana z API jest też krucha. Jeśli H1, body copy, szczegóły produktu, recenzje czy linki wewnętrzne wymagają dwóch wywołań API po hydracji, masz więcej punktów awarii. Boty mogą trafić na rate-limit, API mogą blokować nieznane user-agenty, timeouty mogą zostawić cienkie DOM.
Routing hash powinien być poza publicznymi stronami indeksowalnymi. URL w stylu /docs#pricing sprawdzi się dla fragmentów, ale routing aplikacyjny oparty na hash dla prawdziwych stron utrudnia odkrywanie, canonicalizację i analitykę.
Na koniec pilnuj auth i wagi bundli razem. Publiczna treść przypadkowo owinięta kontrolą logowania może zniknąć z crawlerów. Ciężkie bundle opóźniają renderowanie i marnują budżet crawl. Oba problemy wyglądają jak „JavaScript SEO”, ale praktyczna naprawa to czystsze granice tras i mniej pracy klienta dla publicznych stron.
Najlepsza reguła SPA SEO jest prosta: jeśli trasa zasługuje na ruch z wyszukiwarki, pierwsza odpowiedź powinna wyglądać jak strona.
To znaczy, że każdy publiczny URL powinien zwrócić użyteczny HTML z kluczowymi sygnałami już na miejscu:
<title>.
Potem JavaScript może hydratować komponenty, personalizować elementy, ładować kalkulatory, śledzić zdarzenia, filtrować tabele i wzbogacać doświadczenie. Nie powinien być wymagany, by crawler zrozumiał, o czym jest strona.
Tu spotykają się architektura serwisu i SPA SEO. Publiczna trasa bez crawlowalnych linków prowadzących do niej wciąż jest słaba, nawet jeśli jest renderowana na serwerze. Pięknie wyrenderowany dokument zakopany pięć klików głęboko za nawigacją kliencką nie zadziała tak jak strona w jasnym systemie linkowania wewnętrznego.
Zasada „document-first” trzyma zespoły w ryzach. Pricing to dokument. Post na blogu to dokument. Strona docs to dokument. Zapisany filtr dashboardu, otwarty modal czy krok onboardingowy to stan aplikacji. Traktowanie stanu aplikacji jak strony wyszukiwarki tworzy spuchnięty indeks. Traktowanie publicznych stron jak stanu aplikacji tworzy niewidzialność.
W seojuice.io ten podział jest zamierzony. Publiczne trasy muszą być wystarczająco nudne dla crawlerów. Produkt może pozostać interaktywny po zalogowaniu. Te dwa pomysły mogą współistnieć.
Jeśli testujesz tylko doświadczenie przeglądarki, testujesz najszczęśliwszą ścieżkę. SEO dla SPA potrzebuje brzydszych testów.
curl -I https://example.com/missing-route.Niewygodny test to test H1. Jeśli Googlebot potrzebuje pięciu kroków i dwóch wywołań API, by znaleźć H1, strona jest krucha, nawet jeśli ostatecznie trafi do indeksu.
Screaming Frog, Sitebulb, Google Search Console, Chrome DevTools, Rich Results Test i logi serwera — wszystko pomaga. Konkretne narzędzie ma mniejsze znaczenie niż porównanie. Chcesz wiedzieć, co istnieje w pierwszej odpowiedzi, co pojawia się po renderowaniu i co faktycznie zaindeksował Google.
Tu wiele audytów JavaScript SEO kończy za wcześnie. Udowadniają, że Google potrafi wyrenderować jedną stronę. Dobrze. Teraz przetestuj niepoprawne trasy, stronicowanie, zmiany canonicali, metadanych, awarie API, wolne odpowiedzi i boty inne niż Google.
Używaj tej listy na poziomie trasy. Ocena „zaliczone” dla całego serwisu ukrywa zbyt wiele błędów SPA.
404 lub 410, nie 200.href.„Jeśli coś nie jest crawlowane, nie może się pojawić w wyszukiwarce. Niezależnie od powierzchni.”
Jamie Indigo, Technical SEO Consultant w Not a Robot
To zdanie to cała lista kontrolna w jednej linijce. Search, odpowiedzi AI, podglądy linków i systemy odkrywania zależą najpierw od dostępu. Rankingi są później.
Gdybym zaczynał nowoczesne SPA z myślą o ruchu z wyszukiwarek, nie renderowałbym całego produktu po stronie serwera. Podzieliłbym go.
| Obszar serwisu | Zalecane podejście |
|---|---|
| Strona marketingowa | Statyczne generowanie |
| Blog i dokumentacja | Statyczne generowanie lub ISR |
| Strony produktowe | SSR lub ISR |
| Strony programmatic SEO | Statyczne generowanie z mocnym przycięciem |
| Dashboard | CSR za auth |
| Strony wyszukiwania i filtrów | Noindex, chyba że ręcznie kuratorowane |
| Nieprawidłowe trasy | Prawdziwe 404 lub 410 |
| Wspólny layout | Metadane i nawigacja renderowane na serwerze |
Tak podzieliłbym to na seojuice.io. Strony marketingowe i artykuły powinny być HTML-first. Powierzchnie produktowe wymagające świeżości mogą używać SSR lub ISR. Dashboard może pozostać aplikacyjny, bo jego ranking byłby bez sensu.
Strony programmatic SEO wymagają dodatkowej dyscypliny. Statyczne generowanie ułatwia tworzenie tysięcy stron, w tym tysięcy, których nikt nie powinien indeksować. Generuj tylko strony z realnym popytem wyszukiwań, wartościową treścią i linkami wewnętrznymi. Przytnij resztę, zanim Google podejmie decyzję za ciebie.
Zwycięskie SPA to nie to, które udowadnia, że crawlery potrafią uruchomić JavaScript. Zwycięskie SPA to to, które nie zmusza crawlerów do niepotrzebnej pracy.
Tak. SPA może rankować, jeśli indeksowalne trasy zwracają crawlowalną treść, poprawne metadane, linki wewnętrzne i ważne kody statusu. Google potrafi renderować JavaScript, ale poleganie na renderowaniu we wszystkim czyni serwis bardziej kruchym.
Nie, nie dla każdej trasy. SSR jest przydatne dla publicznych stron z często zmieniającą się treścią. SSG lub ISR jest często lepsze dla treści stabilnej. CSR jest OK dla prywatnych dashboardów, ekranów konta i stanów aplikacji, które nie powinny być indeksowane.
Trasy hash to kiepski wybór dla stron indeksowalnych. Mogą działać dla fragmentów na stronie, ale publiczna treść powinna mieć czyste URL-e, metadane specyficzne dla trasy i kody statusu na poziomie serwera.
Zwykle nie. Wewnętrzne strony wyszukiwania i filtry fasetowe często tworzą cienkie lub zduplikowane URL-e. Kuratorowane strony filtrów można indeksować, gdy mają unikalny popyt, stabilną treść i jasną strategię canonical.
Zażądaj fałszywego URL-a i sprawdź kod statusu. Jeśli /this-page-should-not-exist zwraca 200 z komunikatem „not found” po stronie klienta, ryzykujesz soft 404.
SEOJuice pomaga zespołom wzmacniać crawlowalne linki wewnętrzne na publicznych stronach, które naprawdę zasługują na ruch. Jeśli twoje SPA ma osierocone trasy, ukryte szablony lub strony, do których Google nigdy nie dociera, automatyzacja linkowania wewnętrznego może ułatwić crawlerom podążanie za warstwą dokumentu.
no credit card required
No related articles found.