StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Konsultacje

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

RealizacjeO mnieBlog
Porozmawiajmy
PL
EN

Nowoczesne strony internetowe dla firm, które myślą odważnie.

Przewiń do góry

Nazwa

StriveLab Maciej Sala

NIP

6772218995

REGON

524008527

E-mail

contact@strivelab.pl

Usługi główne
  • Tworzenie stron internetowych
  • Strony internetowe Next.js
  • Strony internetowe Astro
  • Strony internetowe React
Inne usługi
  • Usługi
  • Audyt SEO i Performance
  • Testy automatyczne i QA
  • Konsultacje Produktowe
  • Automatyzacja Procesów AI
  • Aplikacje webowe Next.js
  • Współpraca ciągła
Strony
  • O mnie
  • Usługi
  • Realizacje
  • Blog

© 2026 StriveLab.pl

Polityka prywatności
Next.jsAstro

Server Islands w Astro — dynamiczne fragmenty na statycznej stronie

Statyczna strona z dynamicznymi fragmentami — Server Islands w Astro łączą szybkość CDN z personalizacją SSR. Jak to działa w praktyce?

OpublikujLinkedInFacebookWyślij
Autor
Maciej Sala
Opublikowano
24 kwietnia 2026 00:00
Czytanie
10 min czytania
Aktualizacja
25 maja 2026 12:53

Przez lata architekci webowi stali przed fałszywym wyborem: albo pełna statyka i wolność od serwera, albo i dynamika na żądanie. to koniec tego dylematu. Jeden element wymaga danych w czasie rzeczywistym — reszta strony pozostaje statyczna i bezpieczna w . Inżynieria punktowa, nie przebudowa całej strony.

w skrócie

  • pozwalają wpleść dynamiczny element bez konieczności rezygnowania z buforowania (cache) całej strony.
  • Użycie wyodrębnia dany komponent, dzięki czemu jego treść renderuje się osobno na serwerze i doczytuje dopiero po załadowaniu głównego szkieletu HTML.
  • Zadbany stan zastępczy (fallback) to podstawa dobrego UX — użytkownik wie, że dane się ładują, i nie doświadcza nieprzyjemnych przesunięć layoutu, zanim wyspa wróci z serwera.
  • Propsy przekazywane do Server Islands muszą być w pełni serializowalne (np. funkcje czy cykliczne obiekty są tu niedozwolone).

Odruchowa odpowiedź na potrzebę dynamiki brzmi: „cała strona musi przejść na ”. To błąd kosztujący wydajność i budżet CDN. zachowują statyczny charakter większości strony, generując na żądanie tylko te fragmenty, które tego faktycznie wymagają.

Czym tak właściwie są Server Islands?

Najprościej rzecz ujmując, Server Island to komponent renderowany po stronie serwera, ale w sposób całkowicie niezależny od głównej strony. Jak to wygląda w praktyce? Pierwsza odpowiedź serwera dostarcza nam statyczny HTML, w którym znajduje się jedynie tzw. (czyli tymczasowe miejsce zastępcze) tam, gdzie docelowo ma pojawić się nasza dynamiczna treść. Chwilę później, w tle, maleńki skrypt wstrzyknięty przez Astro wysyła kolejne żądanie, pobiera gotową wyspę i płynnie podmienia wstawiony wcześniej placeholder.

Najważniejsza różnica między Server Islands a dobrze znanymi jest fundamentalna: wyspa serwerowa nie renderuje się w przeglądarce użytkownika. Cały proces zachodzi na serwerze i dzięki temu wyspa może bezpośrednio łączyć się z bazą danych, korzystać z bezpiecznych kluczy (sekretów), czytać ciasteczka i zarządzać sesjami — czyli może wszystko co klasyczny SSR. Przewaga polega na tym, że renderowanie wyspy nie opóźnia wysłania głównego szkieletu strony.

Kiedy Server Islands pokazują pazur?

Oto kilka życiowych przykładów, w których to rozwiązanie sprawdza się idealnie:

Scenariusz 1: Sklep internetowy (karta produktu) Znakomita większość informacji — takich jak opis, zdjęcia, specyfikacja techniczna czy opinie klientów — rzadko ulega zmianie, więc z powodzeniem może być statyczna. Z kolei stan magazynowy to element, który musi być zawsze aktualny. Zanim wprowadzono Server Islands, staliśmy przed trudnym wyborem: albo przerzucamy całą stronę na powolniejszy i droższy SSR, albo ryzykujemy pokazanie klientowi towaru, którego już nie ma w magazynie.

Scenariusz 2: Blog z panelem użytkownika Treść artykułu jest w 100% statyczna i bezpiecznie leży w cache'u. Jednak avatar i spersonalizowane menu nawigacyjne zalogowanego czytelnika w nagłówku strony zależą od sesji i muszą być generowane dynamicznie.

Scenariusz 3: Spersonalizowane rekomendacje na blogu Sam tekst wpisu jest taki sam dla wszystkich, ale sekcja „Polecane dla Ciebie” pod artykułem ma już unikalny charakter i dobiera treści na podstawie profilu lub historii przeglądania danego czytelnika.

We wszystkich tych sytuacjach Server Islands dają nam to, co najlepsze z obu światów: główna treść może być mocno cache'owana (np. z nagłówkiem Cache-Control: public, max-age=3600), a to, co wymaga aktualizacji na żywo, "dociera" do użytkownika chwilę później w formie osobnego zapytania.

Podstawowa konfiguracja

Zanim zaczniemy, coś bardzo ważnego - Server Islands do działania potrzebują adaptera SSR, a w Astro 6 możemy sięgnąć po dowolne wspierane rozwiązanie, na przykład Node, Vercel, Netlify czy Cloudflare:

Code
npx astro add cloudflare
# lub
npx astro add node

Kolejny krok to po prostu dodanie do wybranego komponentu dyrektywy server:defer:

Code
---
// src/pages/blog/[slug].astro
import BlogPost from '../../components/BlogPost.astro';
import UserAvatar from '../../components/UserAvatar.astro';
import RelatedPosts from '../../components/RelatedPosts.astro';
---
 
<main>
  <header>
    <nav>
      <!-- Statyczne linki -->
      <a href="/">Home</a>
      <a href="/blog/">Blog</a>
 
      <!-- Server Island - personalizowany avatar -->
      <UserAvatar server:defer>
        <div slot="fallback" class="avatar-placeholder">
          <!-- Generyczny awatar pokazywany do momentu załadowania się docelowej wyspy -->
        </div>
      </UserAvatar>
    </nav>
  </header>
 
  <!-- Główna treść statyczna -->
  <BlogPost />
 
  <!-- Server Island - rekomendacje -->
  <RelatedPosts server:defer>
    <div slot="fallback">Ładowanie rekomendacji...</div>
  </RelatedPosts>
</main>

Zobaczmy, jak może wyglądać sam komponent takiej wyspy:

Code
---
// src/components/UserAvatar.astro
const sessionCookie = Astro.cookies.get('session');
const userId = sessionCookie ? await validateSession(sessionCookie.value) : null;
 
if (!userId) {
  // Użytkownik jest niezalogowany
  return Astro.redirect('/login');
}
 
const user = await getUserById(userId);
---
 
<div class="user-avatar">
  <img src={user.avatar} alt={user.name} />
  <span>{user.name}</span>
  <a href="/logout/">Wyloguj</a>
</div>

Jak widać, wewnątrz komponentu Server Island możemy swobodnie korzystać z dobrodziejstw środowiska SSR — mamy dostęp do Astro.cookies, Astro.request, możemy odpytywać bazy danych i wczytywać ukryte zmienne środowiskowe. Jednocześnie główna zawartość strony pozostaje nietknięta i wciąż może być błyskawicznie serwowana prosto z cache'a.

Fallback, czyli zadbajmy o odczucia użytkownika

Atrybut slot="fallback" to zdecydowanie coś więcej niż tylko estetyczny dodatek, ponieważ to kluczowy element, który ma realny wpływ zarówno na (doświadczenia użytkownika), jak i na wskaźniki . Jeśli go z jakiegoś powodu pominiemy, użytkownik najpierw zobaczy pustą dziurę na stronie, a ułamek sekundy później docelowa treść nagle "wskoczy" na swoje miejsce. Taki efekt powoduje nieprzyjemne przesunięcia układu strony (znane jako — Cumulative Layout Shift), a możesz mi wierzyć - algorytmy Google'a bardzo tego nie lubią i może to mieć jakiś wpływ na pozycje strony, nie mówiąc już o negatywnych skutkach dla użytkownika.

Dobra praktyka podpowiada proste rozwiązanie: nasz element zastępczy powinien mieć dokładnie takie same wymiary jak ostateczna zawartość wyspy:

Code
<UserAvatar server:defer>
  <div slot="fallback" style="width: 40px; height: 40px; border-radius: 50%; background: #e5e7eb;">
    <!-- Okrągłe miejsce zastępcze dopasowane rozmiarem do faktycznego awatara -->
  </div>
</UserAvatar>

Podobnie sprawa wygląda w przypadku tzw. skeletonów (ekranów szkieletowych):

Code
<RelatedPosts server:defer>
  <div slot="fallback" class="related-skeleton">
    <div class="skeleton-card" />
    <div class="skeleton-card" />
    <div class="skeleton-card" />
  </div>
</RelatedPosts>

A tak mógłby wyglądać przykładowy kod CSS dla takiego skeletonu (z użyciem frameworka Tailwind CSS):

Code
.skeleton-card {
  @apply h-48 animate-pulse rounded-lg bg-gray-200;
}

Dzięki takiemu podejściu użytkownik od razu dostaje jasny sygnał, że dane wciąż się ładują, a układ strony pozostaje stabilny i nasze wskaźniki CLS utrzymują się na idealnym poziomie.

Jak to wygląda pod maską?

Cały proces renderowania strony z użyciem Server Islands w Astro przebiega w trzech prostych krokach:

  1. Każdy komponent oznaczony jako server:defer zostaje wyizolowany i przypisany do specjalnej, ukrytej ścieżki (np. /_server-islands/{nazwa}).
  2. W wygenerowanym dokumencie HTML w miejscu komponentu ląduje wspomniany wcześniej placeholder oraz miniaturowy skrypt. Kiedy strona ładuje się w przeglądarce, skrypt ten natychmiast wysyła zapytanie (fetch()) pod adres wygenerowanej wyspy.
  3. Serwer zwraca gotowy kod HTML wyspy, który gładko zastępuje tymczasowy placeholder.

Z perspektywy przeglądarki przypomina to następujący scenariusz:

Code
1. GET /blog/moj-wpis               → Pobieramy HTML + fallback + skrypt
2. GET /_server-islands/UserAvatar  → Doczytujemy HTML wyspy
3. JavaScript płynnie podmienia fallback na właściwą treść

Warto zaznaczyć, że wszystkie (właściwości), które przekazujemy do wyspy, są automatycznie szyfrowane unikalnym kluczem (generowanym przy każdym budowaniu projektu) i doczepiane do adresu URL jako parametry. Co nam to daje?

  • Możemy bezpiecznie przesyłać poufne dane (jak choćby wewnętrzne identyfikatory) bez obaw, że ktoś złośliwy ręcznie podmieni wartości w adresie.
  • Astro domyślnie respektuje nagłówki Cache-Control, więc jeśli wyspa jest wywoływana z dokładnie takimi samymi propsami, systemy takie jak Cloudflare mogą bez problemu zaserwować gotową odpowiedź prosto z pamięci podręcznej.

Należy jednak pamiętać o jednym istotnym ograniczeniu, by długość adresu URL nie przekraczała 2048 bajtów, ponieważ gdy zechcemy przekazać za dużo danych w propsach, Astro automatycznie zmieni typ zapytania na POST i to drastycznie utrudni późniejsze cache'owanie. Praktyczny wniosek jest taki, by przekazywać do wyspy wyłącznie najpotrzebniejsze identyfikatory, a całą resztę obszernych danych dociągać już wewnątrz samego komponentu.

Server Islands vs. Partial Prerendering w Next.js

Brzmi znajomo? Jeśli śledzisz nowości w świecie Next.js (szczególnie od wersji 15), z pewnością kojarzysz technologię (PPR) połączoną z mechanizmem (streaming) opartym na komponencie Suspense. Na papierze obie technologie rozwiązują bardzo zbliżony problem, jednak pod spodem działają całkowicie inaczej:

AspektAstro Server IslandsNext.js PPR
Model mentalnyWyspa jako odseparowany endpoint HTTPGranica Suspense w obrębie jednej strony
DostawaDrugie, asynchroniczne żądanie HTTPStrumieniowanie danych w ramach pierwszego żądania
ŚrodowiskoLekki skrypt odpowiedzialny za podmianę HTML-aCałe środowisko Reacta (runtime) + logika strumieniowania
Cache'owanieIndywidualne, elastyczne reguły dla każdej wyspyCache nakładany całościowo (mniejsza kontrola nad detalami)
Kiedy wygrywa?Treści statyczne urozmaicone małymi porcjami dynamicznych danychZłożone aplikacje webowe opierające się mocno na architekturze SSR

PPR jest głęboko wrośnięty w ekosystem Reacta i zdecydowanie lepiej odnajduje się w cięższych aplikacjach webowych. Z kolei Server Islands to rozwiązanie prostsze koncepcyjnie, które znakomicie wpisuje się w naturę stron zorientowanych na szybkie dostarczanie treści (portale czy blogi). Trudno tu wyłonić jednoznacznego zwycięzcę i lepiej go zresztą nie wyłaniać, ponieważ to po prostu dwa świetne, lecz odmienne narzędzia do osiągnięcia podobnego celu. Chcesz wiedzieć więcej? Zajrzyj do mojego artykułu porównującego fundamenty Astro i Next.js.

Tworzymy licznik komentarzy (przykład praktyczny)

Wyobraźmy sobie taki dość typowy scenariusz: prowadzimy bloga liczącego ponad setkę wpisów, a każdy z artykułów jest generowany statycznie i przez pełną godzinę siedzi bezpiecznie w cache'u CDN. Chcemy jednak, by licznik komentarzy pod wpisem zawsze pokazywał aktualny jego stan.

Gdybyśmy nie użyli Server Islands, prawdopodobnie użylibyśmy zwykłego fetch(), który odpytywałby API z poziomu głównego szablonu. Tyle, że cała strona przymusowo przechodzi na SSR i finalnie bardzo trudno jest ją optymalnie buforować (bo w końcu komentarze ciągle się pojawiają), a sam czas wczytywania ulega wydłużeniu.

Z pomocą Server Islands rozwiązujemy ten problem niezwykle elegancko:

Code
---
// src/pages/blog/[slug].astro
import BlogPost from '../../components/BlogPost.astro';
import CommentsCount from '../../components/CommentsCount.astro';
 
const { post } = Astro.props;
---
 
<BlogPost post={post}>
  <aside class="post-meta">
    <span>
      Komentarze:
      <CommentsCount server:defer postId={post.id}>
        <span slot="fallback" class="inline-block w-8 h-4 bg-gray-200 rounded animate-pulse" />
      </CommentsCount>
    </span>
  </aside>
</BlogPost>
Code
---
// src/components/CommentsCount.astro
const { postId } = Astro.props;
const response = await fetch(`${import.meta.env.API_URL}/comments/count?postId=${postId}`);
const { count } = await response.json();
---
 
<strong>{count}</strong>

Co dzięki temu zyskujemy? Główny artykuł wciąż bezpiecznie "siedzi" w cache'u CDN przez całą godzinę, podczas gdy licznik komentarzy albo odświeża się z każdym odwiedzeniem strony, albo korzysta z osobnego - własnoręcznie ustawionego - buforowania dla danej wyspy.

O czym warto pamiętać? (Ograniczenia i pułapki)

Każda technologia ma swoje własne zasady o których warto wiedzieć od razu:

1. Propsy muszą być bezwzględnie serializowalne. Do wnętrza Server Island nie wrzucisz funkcji, instancji klas ani złożonych komponentów. Musisz cały czas działać na podstawowych formatach danych, czyli typach prostych, tablicach, obiektach JSON czy datach.

2. Uważaj na obiekt Astro.url. Jeśli go wywołasz wewnątrz komponentu wyspy, nie pokaże Ci adresu bazowego (np. /blog/moj-wpis), ale wewnętrzną ścieżkę prowadzącą do wyspy (np. /_server-islands/CommentsCount?...). Potrzebujesz adresu głównej strony? Pobierz go z nagłówka Referer:

Code
---
const referer = Astro.request.headers.get('referer');
const pageUrl = referer ? new URL(referer) : null;
---

3. Wyspy żyją we własnym świecie. Renderują się w całkowitym oderwaniu od reszty drzewa i jeśli na poziomie głównego dokumentu ustawisz jakąś zmienną kontekstową, Twoja wyspa nie będzie miała do niej dostępu. Pamiętaj, że komunikacja musi przebiegać wprost przez zadeklarowane propsy.

4. Uważaj na buforowanie prywatnych danych. Jeśli implementujesz wyspę, która pobiera informacje ściśle przypisane do konkretnego użytkownika (np. wspomniany avatar po zalogowaniu), bezwzględnie zadbaj o dodanie nagłówków Cache-Control: private lub no-store. Brak tej konfiguracji może poskutkować tym, że serwer CDN przypadkowo wyświetli poufne dane innej osobie odwiedzającej Twój serwis.

Dobre praktyki: buforowanie, prywatność i placeholdery

Z Server Islands wyciśniesz maksimum możliwości, pod warunkiem że nauczysz się sprawnie zarządzać trzema odrębnymi warstwami: głównym szkieletem HTML, dynamicznym punktem końcowym samej wyspy oraz jej stanem zastępczym.

Oto złote zasady, których powinieneś się ZAWSZE trzymać:

  • Ponieważ główna treść zazwyczaj nie zawiera prywatnych informacji, śmiało nakładaj na nią bardzo rygorystyczne zasady publicznego cache'owania.
  • Dla wysp mających poufne dane (tylko do wglądu dla danego użytkownika) zawsze stosuj profil zapobiegawczy — Cache-Control: private albo no-store.
  • Kiedy operujesz na danych ogólnodostępnych, ale podlegających częstym rotacjom (jak np. stany magazynowe w sklepie), ustaw dla wyspy bardzo krótki czas trwania pamięci podręcznej (np. ).
  • Oszczędzaj bajty, czyli w praktyce - przekazuj wyspie jedynie bazowe identyfikatory i niezbędne minimum informacji, zamiast wrzucać do propsów całe, masywne obiekty pobrane uprzednio z bazy.
  • Nie zapominaj także o precyzyjnych wymiarach dla swoich placeholderów, aby uniknąć niepotrzebnego "skakania" elementów na stronie (ma to negatywny wpływ na metryki CLS).
Uwaga

Najważniejsze fragmenty witryny, mające krytyczne znaczenie pod kątem pozycjonowania (SEO), generuj zawsze w początkowym strumieniu HTML. Traktuj Server Islands jako cenną "posypkę" odpowiadającą za dynamikę i świeżość treści, a nie jako fundament widoczności Twojego biznesu w wyszukiwarce.

Wydajność — czy to się w ogóle opłaca?

Zazwyczaj tak, aczkolwiek bywają wyjątki od reguły. Server Islands rozwijają skrzydła i pokazują pełen potencjał w różnych sytuacjach:

  • Miażdząca większość zawartości strony jest w pełni statyczna, co pozwala na jej drastyczne optymalizowanie za pomocą cache'a.
  • Dodawany fragment dynamiczny jest na tyle niewielki, że wygenerowanie drugiego, docelowego żądania odbywa się praktycznie w oka mgnieniu.
  • Twoja domena obsługuje zauważalny ruch, przez co korzyści płynące z cache'owania na poziomie CDN stają się łatwo mierzalne.

Trzeba jednak wiedzieć, że to rozwiązanie mija się z celem, gdy:

  • Cały Twój projekt ze swej natury (np. zamknięty dashboard dla klientów) opiera się wyłącznie na procesach (SSR).
  • Dynamiczna zawartość to w rzeczywistości ogromny moloch (np. paginowana, długa na 50 pozycji sekcja z wynikami wyszukiwania), a w takich przypadkach wymóg wykonania asynchronicznego żądania będzie w praktyce wąskim gardłem i spowolni wczytywanie aplikacji.
  • Prowadzisz malutką stronę o bardzo niskim natężeniu ruchu, gdzie stosowanie skomplikowanych wdrożeń z zakresu optymalizacji CDN przynosi mikroskopijne zyski.

Werdykt Labu

rozwiązują problem, który od lat blokował architekturów stron treściowych: jak wprowadzić dynamikę bez rezygnowania ze statycznej wydajności? Odpowiedź jest precyzyjna: statyczny szkielet z , dynamiczny fragment z serwera — osobnym żądaniem, bez blokowania głównej odpowiedzi.

Jeśli Twój statyczny projekt Astro pod ciężarem nowych wymagań zaczyna ewoluować w stronę pełnego — Server Islands powstrzymują to wycofanie. Wdrażasz je punktowo, tylko tam, gdzie dynamika ma realną wartość dla użytkownika.

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.
Automatyzacja AI
  • Czym tak właściwie są Server Islands?1 min
  • Kiedy Server Islands pokazują pazur?1 min
  • Podstawowa konfiguracja1 min
  • Fallback, czyli zadbajmy o odczucia użytkownika1 min
  • Jak to wygląda pod maską?1 min
  • Server Islands vs. Partial Prerendering w Next.js2 min
  • Tworzymy licznik komentarzy (przykład praktyczny)1 min
  • O czym warto pamiętać? (Ograniczenia i pułapki)1 min
  • Dobre praktyki: buforowanie, prywatność i placeholdery1 min
  • Wydajność — czy to się w ogóle opłaca?1 min
  • Werdykt Labu1 min

Często zadawane pytania

Źródła i data weryfikacjiZweryfikowano: 25 maja 2026

Informacje o Server Islands, adapterach, modelu renderowania i wymaganiach środowiskowych zweryfikowano na podstawie oficjalnej dokumentacji Astro:

Astro docs — Server Islands, Astro docs — On-demand Rendering, Astro docs — Adapters, Astro 4.12 release notes, Astro — Islands Architecture.

Seria

Astro w praktyce 2026
Część 6 / 10
  1. 1Pierwszy projekt w Astro — od npm create astro do wdrożenia w 15 minut
  2. 2Astro 6 — przewodnik po nowościach: Cloudflare Workers, Live Content Collections, Fonts API i CSP
  3. 3Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry
  4. 4Client directives w Astro — client:load, client:idle, client:visible, client:media, client:only w praktyce
  5. 5Astro Content Collections — typowany blog z walidacją Zod od podstaw
  6. Server Islands w Astro — dynamiczne fragmenty na statycznej stronie
  7. 7Astro View Transitions — płynne przejścia między stronami bez budowania SPA
  8. 8SEO w Astro — Core Web Vitals, dane uporządkowane i techniczny fundament rankingu w 2026
  9. 9Migracja bloga z WordPress na Astro — eksport treści, przekierowania 301 i zachowanie pozycji w Google
  10. 10Lighthouse 100/100 w Astro — case study optymalizacji strony usługowej
Maciej Sala

O autorze

Maciej Sala

Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwija własne projekty side-projecty.

Moje artykułyWięcej o mnie

Pomagam przekładać takie tematy na konkretne wdrożenia w frontendzie, SEO, analityce i procesie produktowym.

Skontaktuj się ze mną

Biblioteka wiedzy

Czytaj dalej

Zobacz więcej wpisów
Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry
Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry

Zero JS domyślnie to fundament Astro. Czym są wyspy, jak działa selektywna hydratacja i kiedy naprawdę ma to wpływ na wydajność?

Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026
Astro.js vs Next.js w 2026 — kompleksowe porównanie frameworków
Astro.js vs Next.js w 2026 — kompleksowe porównanie frameworków

Astro 6 vs Next.js 16 — zupełnie różne założenia. Które wybrać do strony usługowej, bloga, SaaS i e-commerce? Decydujące kryteria.

Maciej Sala

Maciej Sala

Founder Strivelab

15 kwietnia 2026
Pierwszy projekt w Astro — od npm create astro do wdrożenia w 15 minut
Pierwszy projekt w Astro — od npm create astro do wdrożenia w 15 minut

Od zera do wdrożonej strony w 15 minut — Astro w pigułce dla tych, którzy nie chcą tracić czasu na konfigurację.

Maciej Sala

Maciej Sala

Founder Strivelab

29 maja 2026

Poprzedni wpis

Astro View Transitions — płynne przejścia między stronami bez budowania SPA
Astro View Transitions — płynne przejścia między stronami bez budowania SPA

Płynne przejścia jak w SPA, ale bez budowania SPA — View Transitions API w Astro i kiedy faktycznie warto go używać w produkcji.

Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026

Następny wpis

Astro Content Collections — typowany blog z walidacją Zod od podstaw
Astro Content Collections — typowany blog z walidacją Zod od podstaw

Błędny frontmatter w Astro wykryty dopiero na produkcji? Content Collections z Zod sprawdzają schematy już w edytorze. Jak to skonfigurować?

Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026