LCP na stronie produktu w sklepie B2B - jak zejść poniżej 2 sekund
Karta produktu w sklepie B2B to strona, którą klient otwiera dziesiątki razy w godzinę. Powolne LCP boli każdorazowo. Sklep z 80k SKU i klasycznym Magento 2.4 bez optymalizacji ma LCP w okolicach 3-5 sekund. Z konkretną listą poprawek - można zejść do 1,5-2 sekund, bez przebudowy architektury.
Spis treści (9)
W skrócie
- 1. Krok 1: WebP / AVIF zamiast JPG (-70% wagi)
-
2.
Krok 2:
fetchpriority="high"na głównym obrazie (-200-500ms) -
3.
Krok 3: Preload obrazu w
<head>(-100-300ms) - 4. Krok 4: CDN z image optimization on-the-fly (-300-800ms)
- 5. Krok 5: Eliminacja render-blocking CSS / JS przed LCP (-200-700ms)
Razem: realny LCP 3.5s → 1.5s na typowym Magento.
Krok 1 - Format obrazu
WebP / AVIF zamiast JPG.
Porównanie wielkości dla zdjęcia produktu 1000×1000:
- JPG (jakość 80): 180 KB
- WebP (jakość 80): 70 KB
- AVIF (jakość 80): 45 KB
WebP wspierane przez wszystkie nowoczesne przeglądarki od 2020. AVIF od 2022 (Chrome, Firefox), Safari od 2023.
Implementacja:
<picture>
<source srcset="produkt.avif" type="image/avif">
<source srcset="produkt.webp" type="image/webp">
<img src="produkt.jpg" alt="..." width="1000" height="1000">
</picture>
Lub przez CDN:
Cloudflare Polish, BunnyCDN Optimizer, Fastly IO konwertują format on-the-fly. Wystarczy URL image.jpg?format=webp i CDN to ogarnie.
Magento: moduły obrazów (Mageworx, Amasty Image Compress) lub Adobe Commerce Page Builder. Lub po prostu CDN z optimization.
Shopware: wbudowane Thumbnail Service ma WebP support od 6.4.
Krok 2 - fetchpriority na głównym obrazie
Atrybut fetchpriority="high" mówi przeglądarce: ten zasób jest krytyczny, pobierz go priorytetowo.
<!-- Główny obraz produktu (LCP element) -->
<img
src="produkt.webp"
alt="..."
width="600"
height="600"
fetchpriority="high"
>
<!-- Pozostałe obrazy galerii - domyślny priority lub low -->
<img src="produkt-2.webp" loading="lazy" fetchpriority="low">
Wsparcie: Chrome od 2022, Safari od 2023, Firefox od 2023. Browser bez wsparcia po prostu zignoruje atrybut.
Realny zysk: 200-500ms LCP. Najwięcej w środowiskach z wolnym backendem (sklep wysyła HTML wolno, ale obraz jest na CDN i może być pobierany równolegle szybciej).
Krok 3 - preload obrazu w head
<link rel="preload"> mówi przeglądarce zacząć pobierać zasób natychmiast po otrzymaniu HTML, nawet przed parsowaniem reszty.
<head>
...
<link rel="preload" as="image" href="/images/produkt-12345.webp" fetchpriority="high">
</head>
Wartość: podczas gdy browser parsuje HTML, obraz już się pobiera. Klasycznie obraz pobiera się dopiero po dotarciu do <img> tag w HTML.
Realny zysk: 100-300ms LCP.
Uwaga: preload tylko prawdziwie krytycznych zasobów (1 obraz, krytyczne fonty). Jeśli preload'ujesz 10 obrazów - efekt odwrotny, sieć przeciążona.
Krok 4 - CDN z image optimization
CDN robi trzy rzeczy istotne dla LCP:
1. Edge proximity. Obraz z node'a w Frankfurcie do Krakowa = 15ms. Obraz z serwera w Warszawie do Krakowa też 15ms. Obraz z USA do Krakowa = 150ms. Dla zagranicznych klientów CDN ratuje skórę.
2. HTTP/2, HTTP/3, Brotli. Multipleksing, kompresja. Realnie -50-100ms na żądanie.
3. Image optimization on-the-fly. URL parameter (?width=600&format=webp) → CDN serwuje przekonwertowany obraz, cachuje wynik. Pierwsze pobranie dłuższe (konwersja), kolejne - natychmiastowe.
Wynik dla typowego sklepu B2B: -300-800ms LCP po dodaniu CDN. Cloudflare free tier wystarczy.
Krok 5 - Eliminacja render-blocking
Browser nie renderuje strony aż pobierze i sparseuje krytyczny CSS i JS. Jeśli te są wolno pobierane / parsowane - LCP czeka.
Render-blocking CSS:
<!-- ZŁY - blocking CSS dla całego sklepu -->
<link rel="stylesheet" href="/static/sklep.min.css">
<!-- DOBRY - critical CSS inline, reszta lazy -->
<style>
/* tylko CSS dla above-the-fold contentu */
body, .product-page, .product-image { ... }
</style>
<link rel="preload" href="/static/sklep.min.css" as="style" onload="this.rel='stylesheet'">
Render-blocking JS:
<!-- ZŁY - synchronous JS -->
<script src="analytics.js"></script>
<script src="chat.js"></script>
<!-- DOBRY - defer/async -->
<script src="analytics.js" defer></script>
<script src="chat.js" async></script>
<!-- JESZCZE LEPIEJ - chat ładowany po interakcji -->
<script>
// Załaduj chat dopiero gdy klient scrolluje lub po 5s
window.addEventListener('scroll', loadChat, { once: true });
setTimeout(loadChat, 5000);
</script>
Realny zysk: 200-700ms LCP zależnie od wagi i liczby blokujących skryptów.
Magento PDP - typowe problemy
1. Quickview / hover effects ładowane z głównym JS.
Funkcje, które nie są używane natychmiast (preview po hoverze) ładowane razem z core JS. Move do osobnego chunka, lazy load.
2. Recommendation engine sync.
„Klienci kupowali także" - często wywoływane synchronicznie podczas render. Move do async, render po LCP.
3. Recenzje (Trusted Shops, Opineo) iframe.
Iframe widget z third-party = blocking. Lazy load, intersection observer.
4. Galeria zdjęć ładuje wszystkie obrazy.
5 zdjęć produktu × 200 KB = 1 MB. Lazy load 4 pozostałych, eager tylko pierwsze.
5. Selektory atrybutów (configurable products).
Magento generuje JS z całą logiką atrybutów (kolor → SKU mapping). Może być 50-200 KB JS na configurable z dużą liczbą wariantów. Optymalizacja: lazy load tej logiki.
Hyvä Theme - skokowa zmiana dla Magento
Hyvä to alternatywny theme dla Magento (Alpine.js + Tailwind zamiast Knockout). Daje:
- 70-90% mniej JS (Alpine.js to ~10 KB vs. Knockout 80+ KB)
- 60-80% szybsze rendering (mniej layoutów, mniej queries)
- LCP zazwyczaj 30-50% lepsze out-of-the-box
Wdrożenie Hyvä: licencja jednorazowa ~6-8 tys. EUR per organizację, plus integracja modułów (każdy moduł musi być Hyvä-compatible lub przepisany).
Dla nowych projektów Magento 2.4 dla B2B w 2026 - Hyvä jest praktycznie defaultem.
Mierzenie i monitoring
Po implementacji wszystkich kroków - mierz.
Lab:
- Lighthouse DevTools, mobile + desktop
- PageSpeed Insights dla 5-10 reprezentatywnych PDP
Field (krytyczne):
- Google Search Console → Core Web Vitals → PDP segment
- 28-dniowe okno, sprawdzaj co tydzień
Performance budget:
- LCP PDP (niezalogowany): < 2.0s
- LCP PDP (zalogowany): < 2.5s
- Total page weight PDP: < 1.5MB
- Initial JS: < 200KB gzipped
Co zwiększa LCP w roku 2 (regresja)
Po wdrożeniu często pierwszy miesiąc - pięknie. Po 6-12 miesiącach - wynik się degraduje. Powody:
1. Nowe pluginy. Każdy plugin coś dorzuca. „Tylko jeden mały skrypt" - 50-100ms.
2. Nowe banery / promocje. Dodanie sliderem dziesięciu banerów = 10× obraz do pobrania.
3. Marketing tools. Google Tag Manager, Facebook Pixel, GA4, Hotjar - każdy 50-200ms.
4. Trzecie strony zmieniają swoje skrypty. Zewnętrzny chat zmienia loader, ten staje się większy.
5. Wzrost katalogu. 30k SKU → 80k SKU. Każde wyszukiwanie wolniejsze (search bez aktualizacji indeksu).
Performance budget i ciągły monitoring to obrona.
FAQ
Czy mogę mieć LCP 1s na Magento? Dla niezalogowanych z idealnym stackiem (Varnish + CDN + Hyvä + preload) - tak. Dla zalogowanych B2B z cenami kontraktowymi - typowo 1.5-2.0s realne.
Czy AVIF jest worth it? Tak. -25-40% wagi vs. WebP. Wszystkie nowoczesne przeglądarki wspierają. Fallback do WebP/JPG dla starszych.
Czy mogę preload kilku obrazów? Krytycznie ważnych - max 1-2. Preload jest dla najmocniejszego priorytetu, nadużycie = utrata efektu.
Czy fetchpriority działa na background-image?
Nie. Tylko na <img> i <link rel="preload">. Dla background images: preload + load via JS.
Czy headless rozwiązuje problem LCP? Może. Z dobrym SSR i edge caching - tak. Z client-side rendering (CSR) - pogarsza LCP (browser musi pobrać JS, wykonać, dopiero potem renderować).
Co dalej
- Core Web Vitals (kompletne): Core Web Vitals dla sklepu
- Lazy loading dla galerii: Lazy loading obrazów
- CDN dla katalogu: CDN dla katalogów
- Pillar wydajności: Wydajność e-commerce
O autorze
Jakub Owsianka
Architekt rozwiązania w WiseB2B - silniku platform B2B. Zaczynał po stronie biznesu (własne sklepy), potem deweloper, dziś projektuje wdrożenia dla sklepów z katalogami w dziesiątkach tysięcy SKU. W ostatnich latach wdrożył AI-development w zespole i funkcjonalności oparte o AI bezpośrednio w silniku sklepu.
Masz pytanie do tego artykułu?
Dodatkowy kontekst, problem z własnym wdrożeniem, druga opinia - napisz wprost. Odpowiadam osobiście w 1-2 dni robocze.