seojuice

Static Site SEO: Jamstack, SSG i jak być widocznym w wyszukiwarkach

Vadim Kravcenko
Vadim Kravcenko
· Updated · 9 min read

TL;DR: Static site SEO zaczyna się od istotnej przewagi: ważne treści mogą trafiać do przeglądarki jako wstępnie wyrenderowany HTML, zamiast czekać na uruchomienie JavaScript. Ale Astro, Hugo, 11ty, Gatsby, Jekyll oraz statyczne eksporty Next.js nie rozwiązują automatycznie canonicals (tagów kanonicznych), metadanych, danych strukturalnych, przekierowań (redirects), linków wewnętrznych ani problemu „wysp JS”, które ukrywają treść przed robotami. Oceniaj wdrożony HTML, a nie nazwę frameworka.

Wymóg SEO Domyślne dla statycznej witryny Co sprawdzić
Treści do crawlowania Zwykle mocne Nagłówki, treść, linki i obrazy istnieją w surowym HTML
Core Web Vitals Dobry punkt startu Obrazy, czcionki i hydratacja nie pogorszyły LCP ani INP
XML sitemap Zależne od generatora Istnieje sitemap produkcyjna i zawiera poprawne URL-e kanoniczne
Tagi canonical Zwykle ręcznie Każda strona, którą da się indeksować, ma poprawny absolutny canonical
Tytuły i opisy Szablonowane Strony mają unikalne metadane, a nie tylko wartości domyślne z układu (layoutu)
Dane strukturalne Ręczne JSON-LD jest poprawny i zawiera wymagane właściwości
Redirects Konfiguracja hostingu lub CDN Stare URL-e zwracają prawdziwe przekierowania HTTP
Linki wewnętrzne i tekst alternatywny (alt text) Odpowiedzialność po stronie tworzenia treści Kluczowe strony są linkowane, a obrazy mają użyteczne alternatywy
Statyczne strony wygrywają pod kątem crawlability i szybkości, ale nadal odpowiadasz za sitemap, canonical, przekierowania i pułapkę z „wyspami” JavaScript.

Co statyczne strony faktycznie dostają „za darmo”

Generator statycznych stron, taki jak Astro, Hugo, 11ty, Jekyll, Gatsby lub Next.js w trybie statycznego eksportu, uruchamia szablony i treści podczas budowania. W rezultacie otrzymujesz pliki HTML oraz CSS, JavaScript i zasoby (assets) potrzebne dla każdej strony. Warstwa hostingowa może serwować te pliki bez zapytań do bazy danych i bez renderowania strony przy każdym żądaniu.

Ma to znaczenie, ponieważ Google przetwarza strony przez crawling, rendering, indeksowanie i serwowanie. Nasz poradnik o tym jak działa indeksowanie w Google opisuje te etapy szczegółowo. Przewaga statycznych stron jest prostsza: jeśli tekst i linki są już w pobranym HTML, Google nie musi uruchamiać JavaScript, żeby je odkryć.

„Pamiętaj, że renderowanie po stronie serwera lub pre-rendering nadal jest świetnym pomysłem, bo przyspiesza Twoją witrynę zarówno dla użytkowników, jak i dla crawlerów, a nie wszystkie boty potrafią uruchamiać JavaScript.”

To jest dokładne brzmienie z Understand the JavaScript SEO basics w Google Search Central. To również najmocniejszy argument za static site SEO: pre-rendering usuwa zależność. Nie tworzy jednak automatycznie relewancji, autorytetu, sensownego pisania ani spójnej architektury (chętnie zleciłbym te cztery rzeczy komendzie build).

Statyczne pliki łatwo też cache’ować na brzegach CDN. Usunięcie renderowania per żądanie eliminuje jeden z potencjalnych źródeł opóźnień i awarii. Dokumentacja Google dotycząca Web Vitals definiuje „dobrą” wydajność jako LCP w czasie do 2,5 sekundy, INP na poziomie 200 ms lub mniej oraz CLS 0,1 lub mniej. Te progi są oceniane na 75. percentylu, osobno dla ruchu mobilnego i desktopowego.

Nie przekładaj tego na wniosek „statyczne strony automatycznie spełniają Core Web Vitals”. Obraz hero o wadze 3 MB, czcionki blokujące renderowanie, skrypty stron trzecich i duży pakiet hydratacji nadal potrafią zepsuć LCP albo INP. Statyczna architektura daje miejsce, żeby osiągać dobre wyniki. Nie narzuca budżetu zasobów.

Szybkość sama też nie sprawi, że nieistotna strona zacznie wysoko rankować. To infrastruktura, a nie zamiennik popytu, treści czy linków.

Test „view-source” wychwytuje największą porażkę SEO w Jamstack

Statyczna strona może nadal być aplikacją JavaScript w przebraniu statycznej otoczki.

Wyspy Astro, widgety React, siatki produktów pobierane po stronie klienta, komponenty recenzji, sekcje komentarzy i listy „load more” mogą zapełniać się dopiero po hydratacji. Jeśli treść istotna z perspektywy SEO pojawia się dopiero w wyniku żądania API po stronie przeglądarki, jej nie ma w początkowej odpowiedzi. W praktyce wracasz do JavaScript SEO, mimo że wdrożenie zawiera pliki HTML.

Google opisuje problem app-shell wprost: „initial HTML does not contain the actual content”, więc Google musi uruchomić JavaScript, zanim zobaczy wygenerowaną treść. Dokumentacja mówi też, że strona może pozostać w kolejce renderowania „przez kilka sekund, ale może to trwać dłużej”. Część botów w ogóle nie potrafi uruchamiać JavaScript.

Otwórz wdrożony URL i użyj view-source. Nie polegaj na panelu Elements w DevTools, bo pokazuje DOM już po tym, jak skrypty go zmieniły. Przeszukaj źródło w poszukiwaniu nagłówka, kilku charakterystycznych zdań, kluczowych linków, szczegółów produktu oraz atrybutów alt obrazów.

Jeśli ich nie ma — przenieś dane do budowania. Pobieraj je podczas generacji i renderuj artykuł, listy, recenzje albo informacje o produkcie do wygenerowanego HTML. Zachowaj JavaScript po stronie przeglądarki do interakcji, a nie jako główne źródło treści. Nasz przewodnik po frameworkach wyjaśnia, jak utrzymać treści Next.js, React i Nuxt po właściwej stronie tej granicy.

Ten test zaliczyłem na minus na stronach, które w Chrome wyglądały perfekcyjnie kompletne. Przeglądarka pobrała dane na tyle szybko, że podczas przeglądu nic nie było „nie tak”, natomiast w view-source było niewiele więcej niż element root oraz odnośniki do skryptów. Zielony znacznik check w panelu wdrożenia nie jest testem indeksowania (a niestety „działa u mnie” też nie).

To rozróżnienie jest dla mnie najważniejsze w statycznych serwisach, które oglądam w SEOJuice. Wybór frameworka przyciąga dużo uwagi, ale crawler dostaje odpowiedź HTTP, nie Twoje intencje architektoniczne.

Praca SEO, którą generator zostawia z Tobą

Generuj i sprawdzaj XML sitemap

Zachowanie sitemap różni się w zależności od generatora. Hugo generuje sitemap.xml domyślnie; jego dokumentacja ma nawet sekcję o wyłączaniu generowania sitemap — to wyraźny sygnał, że funkcja jest włączona, dopóki jej nie wyłączysz.

Minimalna poprawna sitemap ma jeden blok url na każdą stronę:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/</loc>
    <lastmod>2026-07-19</lastmod>
  </url>
</urlset>

Astro podchodzi do tego inaczej. W swojej dokumentacji sitemap pisze, że @astrojs/sitemap potrzebuje URL-a wdrożonej witryny, zanim będzie w stanie wygenerować sitemap. Po skonfigurowaniu integracja dodaje do katalogu wyjściowego index sitemap oraz pliki samej sitemap.

Dla pozostałych generatorów sprawdź aktualną dokumentację i ekosystem wtyczek, zamiast zakładać, że sitemap istnieje. Test nie polega na tym, czy zależność pojawia się w Twoim pliku pakietu. Test polega na tym, czy wdrożona sitemap się ładuje, zwraca właściwy typ zawartości i zawiera adresy produkcyjne, które faktycznie chcesz indeksować.

Następnie sprawdź próbkę. Szukaj adresów hostów ze stagingu, niekanonicznych wariantów z ukośnikiem na końcu, URL-i z parametrami, brakujących sekcji i stron, które powinny być wykluczone. Sitemap może być poprawna składniowo, a jednocześnie opisywać… złą witrynę.

Astro zasługuje na dodatkową uwagę, bo skonfigurowany site URL przydaje się też do budowania absolutnych URL-i. Nasza lista kontrolna SEO dla Astro omawia sitemap, canonicals i problemy specyficzne dla „wysp” (islandów) dużo głębiej.

Buduj canonicals na podstawie URL produkcyjnego

Generatory statycznych stron generalnie nie podejmują za Ciebie decyzji o canonical URL. Twój layout musi utworzyć canonical dla każdej strony, którą da się indeksować, używając produkcyjnego adresu bazowego (base URL) oraz znormalizowanej ścieżki strony. Domenę stagingową albo localhost „wypieczone” w kodzie produkcyjnym kierują wyszukiwarki na złą wersję.

Względne canonicals to jeszcze jedna niejednoznaczność, której warto unikać. Buduj absolutne URL-e, a potem zdefiniuj jedną politykę dla końcowych ukośników, plików indeksu i wielkości liter w URL. Twoje canonicale, linki wewnętrzne, wpisy w sitemap oraz reguły przekierowań powinny być ze sobą spójne.

W styczniu 2026 przenieśliśmy SEOJuice z seojuice.io do seojuice.com. Widoczna nawigacja była łatwą częścią. Prawdziwe ryzyko migracji obejmowało tagi canonical, wpisy w sitemap, linki wewnętrzne, URL-e w structured-data, odnośniki do assetów oraz przekierowania na poziomie hosta. Jeden stary hostname osadzony w współdzielonym szablonie może zostać skopiowany do każdej wygenerowanej strony, zanim ktokolwiek to zauważy (świetnie wydajny sposób na skalowanie błędu).

Nie ufam uniwersalnemu komponentowi canonical kopiowanemu między frameworkami. Różnią się base path, zachowanie ukośników, pomocniki do URL-i oraz zmienne środowiskowe. Sprawdź finalny HTML pod finalnym URL-em. Szablony są szczegółami implementacji; to wdrożony output dostaje crawler.

Przestań wysyłać jeden tytuł na całą witrynę

Tytuły stron, meta opisy, pola Open Graph oraz tagi social zwykle pochodzą z front matteru przekazywanego do współdzielonego layoutu. Jeśli front matter nie jest dostępny albo fallback jest zbyt ogólny, setki stron mogą dziedziczyć jeden, generyczny tytuł.

Kluczowe metadane miej jawnie w modelu treści. Nadaj każdej stronie indeksowalnej unikalny, opisowy tytuł oraz dopasowany opis. Zdefiniuj logikę fallback dla przewidywalnych przypadków, ale nie pozwól, by globalny brand string w cichym trybie stał się tytułem każdej strony.

Potem prze-crawluj zbudowaną witrynę pod kątem duplikatów, pustych wartości, źle zbudowanych tagów oraz nieoczekiwanie długich pól. Generowanie statyczne daje spójność — w tym spójność błędów.

Dodaj dane strukturalne do właściwej strony

Google Search Central definiuje structured data jako „standaryzowany format do udostępniania informacji o stronie i klasyfikowania treści strony”. Google rekomenduje JSON-LD i podkreśla, że markup powinien trafić na stronę, którą opisuje.

Obiekt musi pasować do widocznej treści i zawierać wszystkie wymagane właściwości, żeby kwalifikować się do rozszerzonych prezentacji w Search. Kwalifikacja nie jest gwarancją rich result. Schema wyjaśnia znaczenie maszynom; nie zmusza Google do ozdabiania wyniku.

Generuj dane strukturalne z tego samego źródła, co widoczną stronę — tam, gdzie to możliwe. Dublowanie nazw produktów, cen, dat i danych o autorze w osobnych, ręcznych polach powoduje rozjazdy. Waliduj typy stron na reprezentatywnych przykładach po wdrożeniu, a nie tylko sprawdzaj osobno szablon JSON-LD.

Spisz te „niewdzięczne” podstawy

Nadal potrzebujesz poprawnego robots.txt, przydatnego tekstu alternatywnego dla obrazów, spójnych poziomów nagłówków, opisowych anchorów (odnośników) oraz linków wewnętrznych. Generowanie statyczne nie eliminuje stron osieroconych. URL może istnieć w katalogu outputu i w sitemap, a mimo to pozostawać odłączony od ścieżek, którymi podążają użytkownicy i crawlers.

Z tego, co widzimy w serwisach działających z SEOJuice, to często właśnie tutaj kończy się pomoc „czystej architektury”. Strona buduje się szybko i ładuje się szybko, ale powiązane podstrony nie są ze sobą połączone, pokrycie metadanych jest nierówne, a stare treści leżą kilka poziomów od jakiejkolwiek aktualnej strony. Żaden z tych defektów nie wymaga migracji frameworka. Wymaga utrzymania (maintenance).

Praca bywa żmudna. Najczęściej. Ale ma znaczenie.

Przekierowania (redirects) należą do hostingu lub CDN

W pełni statyczne wdrożenie nie uruchamia na serwerze routera aplikacji dla każdego żądania. Z tego powodu przekierowania należy konfigurować na poziomie hostingu lub CDN, a nie w komponencie po stronie klienta.

Host Konfiguracja Ważne zachowanie
Netlify _redirects lub netlify.toml Wygrywa pierwsza pasująca reguła; domyślny status to 301
Vercel redirects w vercel.json Reguły można wersjonować wraz z ustawieniami czystych URL-i i ukośników
Cloudflare Pages _redirects Domyślny status to 302, więc podaj 301 dla przekierowań stałych

Dokumentacja Netlify mówi, że silnik przekierowań przetwarza pierwszą pasującą regułę od góry do dołu i używa 301 domyślnie. Kolejność ma znaczenie. Zbyt szeroki wildcard powyżej reguły migracji może przechwycić żądanie wcześniej.

Vercel udostępnia przekierowania, czyste URL-e i zachowanie ukośników jako konfigurację projektu. Cloudflare Pages obsługuje też plik _redirects, ale domyślnie ma 302 zamiast 301 jak w Netlify. Ustaw status jawnie, jeśli chodzi Ci o przekierowanie stałe (musiałem sprawdzić tę różnicę dwa razy; identyczne nazwy plików zachęcają do błędnego założenia).

Trzymaj mapę przekierowań obok źródła i testuj stare URL-e po wdrożeniu. Uwzględnij przemianowane strony, skonsolidowane artykuły, warianty domeny, zmiany protokołu oraz wybraną politykę dla końcowych ukośników. Sprawdź zwracany status i docelowy adres, także przy łańcuchach przekierowań.

Kliend-side router, który widzi stary path i zmienia URL w przeglądarce, nie jest tym samym. Oryginalna odpowiedź pozostaje 200 albo 404, a klienci bez JavaScript nie dostają zamierzonego przekierowania.

Funkcje dynamiczne są OK, o ile nie dotykają głównej ścieżki treści

Formularze mogą korzystać z funkcji hostingu, endpointu strony trzeciej albo funkcji serverless. Sama interakcja wysyłki nie jest treścią indeksowalną, ale strona powinna zawierać wstępnie wyrenderowany opis wyjaśniający, co robi formularz.

Wyszukiwanie po stronie klienta może korzystać z lokalnego indeksu albo hostowanego API. Wyniki wyszukiwania zwykle nie powinny być jedyną drogą odkrywania treści. Każdy ważny wynik musi mieć własny statyczny URL oraz przynajmniej jeden indeksowalny link wewnętrzny poza interfejsem wyszukiwarki.

Komentarze i widgety recenzji wymagają więcej ostrożności. Jeśli hydratyzują się dopiero po załadowaniu, ich treści mogą nie istnieć w oryginalnym HTML. Jeśli recenzje realnie wspierają stronę produktu, wyrenderuj odpowiednie treści recenzji w trakcie budowania i wygeneruj poprawne dane strukturalne na podstawie tego samego źródła.

Personalizacja, rekomendacje i eksperymenty mogą pozostać po stronie klienta, jeśli główna strona nie jest od nich zależna. Moja zasada jest prosta i bez owijania: podejmuj decyzje o treści indeksowalnej podczas build; dodaj opcjonalną interakcję w przeglądarce.

Proces wydania (release), który wykrywa statyczne błędy SEO

  1. Buduj z konfiguracją produkcyjną. Potwierdź, że prawdziwa nazwa hosta i base path są dostępne dla szablonów.
  2. Zajrzyj do surowego HTML. Sprawdź tytuły, opisy, canonicals, nagłówki, linki, alt text, JSON-LD oraz podstawową treść.
  3. Otwórz sitemap i robots.txt. Zweryfikuj, że oba są wdrożone i spójne wewnętrznie.
  4. Wyłącz JavaScript. Potwierdź, że podstawowe informacje i nawigacja pozostają dostępne.
  5. Przetestuj stare URL-e. Sprawdź, czy host zwraca zamierzony status i docelowy adres.
  6. Mierz reprezentatywne strony. Porównuj je z progami LCP, INP i CLS, zamiast zakładać, że „statyczne” oznacza szybkie.
  7. Zrób crawling po wdrożeniu. Znajdź duplikaty metadanych, brakujące canonicals, strony osierocone, uszkodzone linki i nieoczekiwane kody statusu.

Uruchamiaj ten proces dla typów stron, nie tylko dla strony głównej. Artykuły na blogu, strony produktów, paginacja, archiwa tagów, podstrony dokumentacji i landing pages często używają różnych layoutów. Jedna zdrowa strona główna mówi niewiele o tysiącu wygenerowanych URL-i.

Podczas migracji trzymaj listę starych URL-i i testuj ją automatycznie po wydaniu. Podczas migracji domeny SEOJuice nauczyliśmy się, że kontrole migracji muszą obejmować również to, czego użytkownicy nie widzą, a nie tylko to, co widzą. Canonicals i identyfikatory w danych strukturalnych łatwo pominąć podczas przeglądu wizualnego.

Gdzie pasuje SEOJuice, a gdzie nie

SEOJuice w sposób ciągły dodaje linki wewnętrzne, tytuły i opisy meta, markup schematu (schema) oraz alt text do obrazów na żywej witrynie. Można go zainstalować przez snippet JavaScript albo wtyczkę WordPress/CMS, a darmowy plan dostępny jest bez podawania karty.

Istnieje ważna granica dla statycznych serwisów. Metadane, schema i linki wstrzykiwane przez snippet zależą od renderowania po stronie klienta, więc nie są obecne w oryginalnym HTML z kroku crawl i mogą być niedostępne dla botów bez JavaScript. Gdy masz kontrolę nad buildem, trzymaj główną treść, canonicals, kluczowe tytuły i opisy oraz krytyczne JSON-LD w wygenerowanym HTML. Używaj snippetów do przyrostowych poprawek on-page, które mogą działać „łagodnie” (degrade gracefully), a nie jako wymówkę, by wysłać pustą otoczkę.

SEOJuice nie zastępuje też Twojej sitemap, przekierowań na CDN, architektury build ani strategii treści. Jeśli chcesz zobaczyć, czego brakuje w warstwie on-page, zacznij od darmowego SEO audit. Napraw problemy strukturalne w buildzie, a potem zautomatyzuj powtarzalną warstwę tam, gdzie ten trade-off ma sens.

Najczęściej zadawane pytania

Czy statyczne strony są dobre pod SEO?

Tak, jako punkt startu w architekturze. Wstępnie wyrenderowany HTML usuwa zależność od renderowania JavaScript dla treści obecnych w źródle, a dostarczanie przez CDN ułatwia osiąganie dobrych wyników wydajności. Nadal potrzebujesz trafnej treści, metadanych, canonicals, sitemap, danych strukturalnych, linków wewnętrznych i przekierowań.

Czy statyczne strony potrzebują XML sitemap?

Tak. Hugo generuje sitemap.xml domyślnie, natomiast Astro wymaga integracji sitemap oraz skonfigurowanego site URL. Inne generatory mogą wymagać konfiguracji specyficznej dla projektu albo wtyczki. Sprawdź wdrożoną sitemap, zamiast zakładać, że build utworzył ją poprawnie.

Czy Jamstack jest dobry pod SEO?

Jamstack może dawać te same przewagi co inne statyczne architektury: wstępnie wyrenderowany markup i dostarczanie przez CDN. Ryzyko pojawia się wtedy, gdy ważne treści są pobierane przez API po stronie przeglądarki. Jeśli nie ma ich w zbudowanym HTML, Google musi renderować JavaScript, żeby je zobaczyć, a inne boty mogą pominąć je całkowicie.

Jak ustawić przekierowania na statycznej stronie?

Skonfiguruj je na hostingu lub w CDN. Netlify obsługuje _redirects oraz netlify.toml, Vercel korzysta z konfiguracji projektu, a Cloudflare Pages obsługuje plik _redirects. Określ statusy stałe świadomie, trzymaj reguły w kontroli wersji i przetestuj odpowiedź HTTP po wdrożeniu.

Czy Google indeksuje JavaScript w statycznych stronach?

Google może renderować JavaScript, ale dzieje się to po crawlowaniu i może być odroczone. Google też zaznacza, że nie wszystkie boty potrafią uruchamiać JavaScript. Jeśli główna treść pojawia się dopiero po hydratacji, wyrenderuj ją do zbudowanego HTML, zamiast polegać na wykonaniu po stronie przeglądarki.

Czy statyczne strony nadal potrzebują meta tagów i canonical tags?

Tak. Generatory statycznych stron nie tworzą niezawodnie unikalnych tytułów, opisów, tagów Open Graph ani canonical URL dla każdego projektu. Wygeneruj je na podstawie danych strony, użyj produkcyjnego base URL do absolutnych canonicals i sprawdź finalny HTML pod kątem duplikatów lub wartości ze stagingu.

SEOJuice
Stay visible everywhere
Get discovered across Google and AI platforms with research-based optimizations.
Works with any CMS
Automated Internal Links
On-Page SEO Optimizations
Get Started Free

no credit card required

More articles

No related articles found.