Lazy loading
Lazy loading to technika odraczania ładowania zasobów (obrazków, iframe'ów, komponentów JS) do momentu, gdy zbliżają się do viewportu. Zmniejsza początkowy payload strony, przyspiesza LCP i FCP, oszczędza pasmo użytkownika i zasoby serwera.
Natywny lazy loading
Wystarczy atrybut loading="lazy" na <img> lub <iframe>. Przeglądarka sama decyduje, kiedy załadować (zwykle ~1500 px przed viewportem na desktopie, ~3000 px na mobile). Wsparcie: wszystkie nowoczesne przeglądarki (od Chrome 76, Safari 15.4, Firefox 75). Dla Internet Explorera fallback nie jest potrzebny — i tak jest poza wsparciem.
Krytyczna zasada
Nigdy nie lazy-loaduj obrazków above the fold. Hero image z loading="lazy" opóźnia LCP — przeglądarka nie pobiera go priorytetowo, czeka aż będzie widoczny. Dla obrazków poniżej fold: zawsze lazy. Dla hero: loading="eager" + ewentualnie fetchpriority="high" dla maksymalnej priorytetyzacji.
Lazy loading komponentów (JS)
React.lazy(), dynamic imports w Next.js (next/dynamic), defineAsyncComponent w Vue — dzielą bundle na chunki ładowane on-demand. Klasyczne zastosowania: modale, czat widgety, mapy, edytory, panel admina, sekcja komentarzy. Mniejszy initial bundle = lepsze TTI i INP, bo główny wątek nie musi parsować kodu, którego użytkownik nie zobaczy.
Intersection Observer
Dla bardziej zaawansowanej kontroli (animacje on-scroll, video autoplay przy widoczności, infinite scroll) używaj Intersection Observer API zamiast scroll listeners. Wydajniejsze, asynchroniczne, mniej blokuje główny wątek. IntersectionObserver ma wsparcie we wszystkich nowoczesnych przeglądarkach.