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.

Doradztwo produktowe

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.

Doradztwo produktowe

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.

Doradztwo produktowe

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
  • SEO & Performance Sprint
  • QA & Stabilizacja
  • Konsultacje Product / Delivery
  • 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 osiągnąć 100/100 w Lighthouse dla strony Astro: optymalizacja LCP, CLS i INP przez astro:assets, Fonts API, dyrektywy client i lazy loading third-party scripts. Case study z konkretnymi metrykami.

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 — self-hosting 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 → 100
LCP po uporządkowaniu obrazu hero
2.1 s → 0.9 s
CLS po wdrożeniu Fonts API
0.09 → 0.00
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 self-hostuje krój 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 — self-hosting 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.

Jeśli masz stronę w Astro i chcesz audyt, który przełoży wydajność na realny wynik biznesowy — umów konsultację.

  • 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ęść 8 / 8
  1. 1Astro 6 — przewodnik po nowościach: Cloudflare Workers, Live Content Collections, Fonts API i CSP
  2. 2Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry
  3. 3Client directives w Astro — client:load, client:idle, client:visible, client:media, client:only w praktyce
  4. 4Server Islands w Astro — dynamiczne fragmenty na statycznej stronie
  5. 5Astro View Transitions — płynne przejścia między stronami bez budowania SPA
  6. 6SEO w Astro — Core Web Vitals, dane uporządkowane i techniczny fundament rankingu w 2026
  7. 7Migracja bloga z WordPress na Astro — eksport treści, przekierowania 301 i zachowanie pozycji w Google
  8. Lighthouse 100/100 w Astro — case study optymalizacji strony usługowej
Maciej Sala

O autorze

Maciej Sala

Maciej Sala — project manager i frontendowiec z doświadczeniem w marketingu internetowym. Na co dzień pracuję z Reactem, Next.js i TypeScriptem, łącząc perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat związany z branżą gier wideo jako project manager i game designer.

Absolwent historii na Uniwersytecie Jagiellońskim i studiów podyplomowych z marketingu internetowego na Akademii Górniczo-Hutniczej w Krakowie. Poza pracą trenuje na siłowni, maluje figurki i realizuje własne projekty.

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

Jak osiągnąć wynik 100/100 w PageSpeed Insights dla strony Next.js? Case study optymalizacji LCP, INP i CLS — fonty, obrazy, JavaScript, third-party scripts i Server Components.

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

Porównanie Astro 6 i Next.js 16 z perspektywy wdrożeń: architektura, JavaScript po stronie klienta, SEO, DX, hosting i konkretne przypadki użycia.

Maciej Sala

Maciej Sala

Founder Strivelab

15 kwietnia 2026
Astro 6 — przewodnik po nowościach: Cloudflare Workers, Live Content Collections, Fonts API i CSP
Astro 6 — przewodnik po nowościach: Cloudflare Workers, Live Content Collections, Fonts API i CSP

Co nowego w Astro 6: workerd jako środowisko uruchomieniowe w trybie programistycznym, Live Content Collections, wbudowane Fonts API, Content Security Policy i nowy kompilator Rust.

Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026
Poprzedni wpisClaude Opus 4.8: co nowy flagowiec Anthropic zmienia w pracy agentów i Claude CodePremiera Claude Opus 4.8 (28 maja 2026): wyższe wyniki na SWE-bench Pro i Terminal-Bench, „honesty” jako oś narracji, dynamic workflows w Claude Code, kontrola wysiłku i tańszy fast mode. Konkretna analiza dla zespołów budujących agenty.
Maciej Sala

Maciej Sala

Founder Strivelab

28 maja 2026
Następny wpisWordPress, Astro czy Next.js? Matryca decyzyjna, zanim ruszysz z migracjąZanim zaczniesz migrację, musisz wiedzieć dokąd. Matryca pięciu zmiennych (rozmiar serwisu, wydajność, e-commerce, model edycji treści, częstotliwość zmian) pokazuje, czy Twój następny stack to Astro, Next.js, czy nadal WordPress — zanim wydasz złotówkę na przepisywanie strony.
Maciej Sala

Maciej Sala

Founder Strivelab

29 maja 2026