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
AstroSEO

Lighthouse 100/100 w Astro — case study optymalizacji strony usługowej

Jak realna strona usługowa uzyskała 100/100 w Lighthouse? Konkretne metryki, konkretne poprawki w Astro — bez handwavingu.

OpublikujLinkedInFacebookWyślij
Autor
Maciej Sala
Opublikowano
29 maja 2026 00:00
Czytanie
5 min czytania
Aktualizacja
31 maja 2026 08:00

Astro startuje z przewagą, której Next.js musi się dopracować: domyślnie wysyła zero JavaScriptu, więc świeży projekt często ma Lighthouse powyżej 95 bez jednej optymalizacji. Ale „prawie 100" a „100/100" dzieli kilka konkretnych decyzji o obrazach, fontach i skryptach. Pokazuję na case study strony usługowej, gdzie te punkty leżą — i czy w ogóle warto po nie sięgać.

Artykuł w skrócie

  • Astro startuje wysoko — zero JS domyślnie daje świeżemu projektowi Lighthouse powyżej 95 bez pracy; 100/100 to domknięcie obrazów, fontów i skryptów.
  • astro:assets dla obrazów — automatyczne WebP/AVIF, responsywny srcset i wymuszone wymiary eliminują CLS i tną wagę LCP.
  • Fonts API zamiast Google Fonts z CDN — samodzielne hostowanie i dopasowane fallbacki zerują layout shift z fontów.
  • client:visible jako domyślna dyrektywa — każdy client:load to JavaScript blokujący wątek; selektywna hydratacja to główna dźwignia INP i TBT.
  • 100/100 to nie cel sam w sobie — liczą się realne Core Web Vitals z pola i konwersja; powyżej 90 zwykle wystarcza.

Mamy stronę usługową w Astro: hero z obrazem, sekcje oferty, dowód społeczny, formularz kontaktowy jako wyspa React, analityka i czat. Świeży build dał 94/100 na mobile — wysoko, bo Astro nie wysyła zbędnego JavaScriptu. Ale klient chciał komplet. Lighthouse to narzędzie Google, które uruchamia techniczny test strony i wskazuje potencjalne problemy z wydajnością, SEO i dostępnością. wskazał trzy obszary do domknięcia: obrazy, fonty i skrypty third-party.

Lighthouse Mobile po optymalizacji
94 → 100Lighthouse Mobile po optymalizacji
LCP po uporządkowaniu obrazu hero
2.1 s → 0.9 sLCP po uporządkowaniu obrazu hero
CLS po wdrożeniu Fonts API
0.09 → 0.00CLS po wdrożeniu Fonts API
Uwaga

Wynik 100/100 jest dobrym dowodem technicznej dyscypliny, ale nie jest celem biznesowym. Ważniejsze jest to, czy realni użytkownicy mają szybki LCP, stabilny layout i responsywny formularz na produkcji — a to mierzysz danymi z pola, nie wynikiem laboratoryjnym.

Punkt wyjścia: dlaczego Astro startuje wysoko

Zanim zaczniemy optymalizować, warto zrozumieć, skąd te 94 punkty na starcie. Astro renderuje stronę jako statyczny HTML i domyślnie nie wysyła do przeglądarki frameworkowego JavaScriptu. Sekcje takie jak hero, oferta czy stopka to komponenty .astro — czysty HTML, zero kosztu po stronie klienta.

To strukturalna przewaga nad aplikacyjnym modelem React/Next, gdzie nawet statyczna strona ładuje runtime frameworka. Szerzej rozkładam to w artykule Astro.js vs Next.js. Dla Lighthouse oznacza to niski TBT (Total Blocking Time) to laboratoryjna metryka sumująca czas, w którym główny wątek był zablokowany na tyle długo, że nie mógł zareagować na interakcję. Służy jako przybliżenie INP w środowisku bez realnych użytkowników. i dobry punkt wyjścia pod INP (Interaction to Next Paint) to Core Web Vital mierzący responsywność strony. Zastąpił FID i ocenia, ile czasu mija od interakcji użytkownika do najbliższego odrysowania ekranu, biorąc pod uwagę wszystkie interakcje w trakcie sesji. bez żadnej pracy.

Ostatnie punkty to nie walka z frameworkiem — to dopracowanie zasobów, które framework przepuszcza bez zmian: obrazów, fontów i skryptów zewnętrznych.

Krok 1: Obrazy — astro:assets zamiast surowego <img>

Największy problem był w hero. Obraz wstawiony jako surowy <img> ładował się w pełnej wadze, bez WebP/AVIF i bez wymiarów — stąd duży LCP, czyli Largest Contentful Paint, mierzy czas do wyrenderowania największego widocznego elementu — oznaczenie go preload przyspiesza jego załadowanie. i przesunięcia układu.

Rozwiązaniem jest komponent <Image> z astro:assets to wbudowany moduł Astro do optymalizacji obrazów — generuje WebP/AVIF, responsywny srcset i wymusza wymiary, by uniknąć CLS.:

Code
---
import { Image } from 'astro:assets'
import heroImage from '../assets/hero.jpg'
---
 
<Image
  src={heroImage}
  alt="Strona usługowa po optymalizacji"
  width={1200}
  height={630}
  loading="eager"
  fetchpriority="high"
  format="webp"
/>

Trzy rzeczy zadziałały naraz. WebP/AVIF generuje się automatycznie podczas builda — bez ręcznej obróbki ani pipeline'u graficznego. Wymiary width i height sprawiają, że przeglądarka rezerwuje miejsce jeszcze przed załadowaniem obrazu, więc układ nie skacze. loading="eager" z fetchpriority="high" wyciąga obraz hero poza kolejkę lazy loading i ładuje go jako pierwszy — bo to on jest elementem LCP, który Lighthouse mierzy. W efekcie LCP spadł z 2.1 s do 0.9 s, a pozostałe obrazy dostały loading="lazy" automatycznie.

Krok 2: Fonty — Fonts API zamiast Google Fonts z CDN

Drugim źródłem CLS (Cumulative Layout Shift) to Core Web Vital mierzący nieoczekiwane przesunięcia elementów podczas ładowania i działania strony. Animacje psują go wtedy, gdy ruszają właściwości layoutowe albo gdy pojawiający się element nie ma zarezerwowanego miejsca. były Google Fonts ładowane z zewnętrznego CDN: zewnętrzny request, FOUT i skok układu, gdy właściwy krój się doczytał.

Rozwiązaniem jest Fonts API ustabilizowane w Astro 6 (top-level klucz fonts), które hostuje krój lokalnie i generuje dopasowane fallbacki:

Code
// astro.config.mjs
import { defineConfig, fontProviders } from 'astro/config'
 
export default defineConfig({
  fonts: [
    {
      provider: fontProviders.google(),
      name: 'Inter',
      cssVariable: '--font-inter',
      weights: ['400', '600', '700'],
      subsets: ['latin', 'latin-ext'],
    },
  ],
})

Astro podczas builda pobiera krój, kopiuje go do lokalnych zasobów, generuje font-display: swap z fallbackiem o zbliżonych metrykach i dodaje preload. Produkcja nie odpytuje serwerów Google, a tekst nie skacze przy podmianie kroju. CLS z fontów spadł z 0.09 do 0.00. Dla polskich znaków kluczowy jest latin-ext w subsets.

Krok 3: Skrypty third-party — leniwe ładowanie

Analityka i widget czatu ładowały się synchronicznie, blokując główny wątek i podbijając TBT. W Astro skrypty kontrolujesz dyrektywami i atrybutami ładowania:

Code
<!-- Skrypt niekrytyczny: ładuj asynchronicznie, nie blokuj parsowania -->
<script src="https://analytics.example.com/script.js" async></script>

Dla cięższych integracji (czat, embedy) najlepszą strategią jest załadowanie ich dopiero po interakcji albo gdy wejdą w viewport — przez wyspę z client:visible albo client:idle, zamiast wpinać skrypt w <head>. Wszystko, co nie jest krytyczne dla pierwszego renderu, schodzi poza ścieżkę krytyczną.

W wyniku tych działań TBT spadł poniżej progu, a INP ustabilizował się na bardzo niskim poziomie.

Krok 4: Dyrektywy client — selektywna hydratacja

To najważniejsza dźwignia specyficzna dla Astro. Formularz kontaktowy był wyspą React z client:load — hydratował się natychmiast, mimo że użytkownik dociera do niego dopiero po przewinięciu strony.

Zmiana na client:visible:

Code
---
import ContactForm from '../components/ContactForm.tsx'
---
 
<!-- Hydratacja dopiero, gdy formularz wejdzie w viewport -->
<ContactForm client:visible />

Każdy client:load to JavaScript blokujący wątek od razu po załadowaniu. client:visible odkłada koszt do momentu, gdy komponent jest realnie potrzebny — a jeśli użytkownik nie doscrolluje, kod nie pobiera się wcale. To główny mechanizm, którym w Astro sterujesz INP i TBT. Szerzej rozkładam dyrektywy w osobnym artykule.

Reguła: client:load tylko dla interfejsu krytycznego na pierwszym ekranie. Wszystko poniżej — client:visible.

Wynik końcowy

MetrykaPrzedPo
Lighthouse Mobile94100
Lighthouse Desktop98100
LCP2.1 s0.9 s
INP90 ms40 ms
CLS0.090.00
TBT180 ms30 ms

Checklist optymalizacji Astro

Pięć punktów, które w tym case study dały największy efekt i które warto wbudować w każdy projekt Astro od początku:

  • Obrazy przez astro:assets — <Image> z width/height, loading="eager" i fetchpriority="high" na elemencie LCP.
  • Fonty przez Fonts API (Astro 6) z latin-ext dla polskiego — samodzielne hostowanie zamiast Google Fonts z CDN eliminuje FOUT i layout shift.
  • client:visible jako domyślna dyrektywa; client:load tylko dla interfejsu krytycznego na pierwszym ekranie.
  • Skrypty third-party async/defer albo jako wyspa client:idle/client:visible — nigdy synchronicznie w <head>.
  • Testuj na produkcyjnym URL przez PageSpeed Insights, nie tylko lokalnie — Lighthouse w dev nie mierzy TTFB ani opóźnień CDN.

Astro vs Next.js — ta sama meta, inny start

Ten case study jest świadomym bliźniakiem mojego case study 100/100 w Next.js. Różnica nie leży w technikach — obrazy, fonty, lazy loading skryptów obowiązują tak samo. Leży w punkcie startu: Next.js zaczyna niżej (runtime React do okiełznania), Astro wyżej (zero JS domyślnie), ale obie strony dochodzą do 100/100 tą samą dyscypliną.

Werdykt Labu

100/100 w Lighthouse dla Astro to nie walka z frameworkiem — Astro startuje wysoko dzięki zerowemu JavaScriptowi domyślnie. Ostatnie punkty leżą w trzech miejscach: obrazy przez astro:assets, fonty przez Fonts API zamiast CDN i selektywna hydratacja przez client:visible zamiast client:load. To te same techniki co w Next.js, tylko z lepszym punktem wyjścia.

Pamiętaj o proporcjach: 100/100 to dobry dowód dyscypliny, ale nie cel sam w sobie. Liczą się realne Core Web Vitals z pola i konwersja — powyżej 90 zwykle wystarcza, a gonienie za ostatnimi punktami kosztem funkcjonalności rzadko się opłaca.

Audyt techniczny i optymalizacja pod kątem SEO i GEO.
SEO & Performance
  • Punkt wyjścia: dlaczego Astro startuje wysoko1 min
  • Krok 1: Obrazy — astro:assets zamiast surowego <img>1 min
  • Krok 2: Fonty — Fonts API zamiast Google Fonts z CDN1 min
  • Krok 3: Skrypty third-party — leniwe ładowanie1 min
  • Krok 4: Dyrektywy client — selektywna hydratacja1 min
  • Wynik końcowy1 min
  • Checklist optymalizacji Astro1 min
  • Astro vs Next.js — ta sama meta, inny start1 min
  • Werdykt Labu1 min

Często zadawane pytania

Źródła i dokumentacjaZweryfikowano: 29 maja 2026

Progi Core Web Vitals oraz dokumentację narzędzi optymalizacyjnych Astro zweryfikowano na podstawie oficjalnych źródeł Google i Astro:

web.dev — Core Web Vitals, PageSpeed Insights, Astro docs: Images (astro:assets), Astro docs: Fonts, Astro docs: Client directives.

Seria

Astro w praktyce 2026
Część 10 / 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. 6Server 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. Lighthouse 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.

Umów konsultację

Biblioteka wiedzy

Czytaj dalej

Zobacz więcej wpisów
Pagespeed 100/100 w Next.js — case study optymalizacji strony usługowej
Pagespeed 100/100 w Next.js — case study optymalizacji strony usługowej

100/100 w PageSpeed dla strony Next.js — jak to wygląda w realnym projekcie, nie na prostej demo. Metryki, decyzje i co naprawdę dało wynik.

Maciej Sala

Maciej Sala

Founder Strivelab

10 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
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
Poprzedni wpisPierwszy projekt w Astro — od npm create astro do wdrożenia w 15 minutOd 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
Następny wpisWordPress, Astro czy Next.js? Matryca decyzyjna, zanim ruszysz z migracjąWordPress, Astro czy Next.js? Pięć zmiennych, które rozstrzygną to za Ciebie, zanim przepiszesz jedną linię kodu.
Maciej Sala

Maciej Sala

Founder Strivelab

29 maja 2026