Takédeferred loading, on-demand loading, lazy initializationPokročilý

Definice

Lazy loading je technika, při níž aplikace, stránka nebo knihovna načte data, komponentu či obrázek až ve chvíli, kdy jsou skutečně potřeba. Odkládá práci mimo první vykreslení nebo inicializaci, čímž může zrychlit start, snížit přenos dat a paměť, ale přidává složitost při měření, chybách a načítání obsahu.

Kategorie: Webové technologieAktualizováno

Proč lazy loading zkracuje první čekání

Lazy loading odkládá načtení části systému do chvíle, kdy pro ni vznikne reálná potřeba. Na webu typicky nejde o obrázky pod prvním viewportem, mapu ve spodní části stránky, video přehrávač nebo velký JavaScriptový balík pro administraci. V aplikacích se stejný princip používá u modulů, datových kolekcí, relací v ORM nebo obrazovek v mobilní aplikaci.

Hlavní zisk vzniká tím, že první vykreslení nemusí čekat na všechno. Prohlížeč stáhne méně bajtů, parser zpracuje méně HTML, CSS a JavaScriptu a uživatel se dřív dostane k viditelné části rozhraní. Lazy loading proto často doplňuje responzivní design, protože různé velikosti displeje mění, co je na začátku skutečně vidět.

Kde vzniká okamžik načtení

Spouštěč načtení může být velmi jednoduchý. U obrázků v HTML stačí atribut loading="lazy", prohlížeč pak sám rozhoduje, kdy je zdroj dost blízko viditelné oblasti. U složitějších rozhraní se často používá Intersection Observer, který oznámí, že prvek vstoupil do sledované části stránky.

V JavaScriptových aplikacích se lazy loading často kombinuje s code splittingem. Balík pro graf, editor nebo nastavení účtu se nevloží do úvodního bundle, ale stáhne se až při otevření příslušné části. Frameworky jako React nebo Next.js k tomu přidávají komponentové API a fallback, například skeleton nebo stav „načítám“.

Co lazy loading stojí v architektuře

Odložené načítání není bezplatná optimalizace. Každý odložený zdroj může při pozdějším zobrazení vytvořit čekání, bliknutí rozhraní nebo změnu rozměrů stránky. Obrázky proto potřebují známou šířku a výšku, jinak hrozí posun layoutu. Komponenty zase potřebují chybové stavy, retry logiku a rozumný fallback.

Lazy loading také mění práci s prioritami. Obrázek v hero sekci, hlavní CSS nebo data potřebná pro první rozhodnutí uživatele obvykle nemají být líně načtené. Příliš agresivní odkládání může zlepšit syntetické skóre, ale zhoršit reálný pocit z aplikace, protože uživatel čeká právě ve chvíli, kdy chce něco udělat.

Lazy loading v prohlížeči a aplikaci

Nativní lazy loading v HTML je nejjednodušší pro obrázky a iframe. Prohlížeč má přístup k informacím o síti, zařízení a vzdálenosti prvku od viewportu, takže může zdroje plánovat efektivněji než ruční skript. Ruční řešení dává smysl tam, kde načtení znamená víc než stažení souboru, například inicializaci mapového SDK, dotaz na API nebo načtení celé části administrace.

Měření bez iluzí

Přínos lazy loadingu se má ověřovat na metrikách, které odpovídají cíli. U webu jsou důležité hlavně přenos dat, čas do prvního použitelného zobrazení, LCP, CLS a interakce po scrollu nebo kliknutí. U aplikací mimo web se sleduje start programu, paměť, počet dotazů a latence při prvním otevření odložené části.

Příklady z praxe

  1. Produktové fotografie pod prvním viewportem

    E-shop má na kategorii 60 produktových fotografií, ale uživatel po otevření vidí jen první dvě řady. Obrázky níž na stránce dostanou atribut loading="lazy", takže prohlížeč je nestahuje hned při prvním vykreslení. První zobrazení kategorie je lehčí, ale rozměry obrázků zůstanou zadané, aby se karta produktu při načtení neposunula.

    <img
      src="/produkty/batoh.webp"
      alt="Černý městský batoh"
      width="800"
      height="600"
      loading="lazy">
  2. Odložené načtení React komponenty

    Účetní dashboard obsahuje drahý graf faktur, který vidí jen část uživatelů. Komponenta grafu se oddělí do samostatného balíku a stáhne se až ve chvíli, kdy se dashboard dostane k jejímu vykreslení. Úvodní JavaScript je menší, ale aplikace musí uživateli ukázat srozumitelný fallback během načítání.

    import { lazy, Suspense } from 'react';
    
    const InvoiceChart = lazy(() => import('./InvoiceChart'));
    
    export function Dashboard() {
      return (
        <Suspense fallback={<p>Načítám graf…</p>}>
          <InvoiceChart />
        </Suspense>
      );
    }

Časté omyly

MýtusLazy loading vždycky zrychlí web.
Ve skutečnostiLazy loading zrychlí hlavně první načtení, pokud odloží zdroje mimo první použitelnou obrazovku. Nevhodné odložení klíčového obrázku, dat nebo komponenty může naopak zhoršit LCP nebo přidat čekání při první interakci.
MýtusStačí dát loading="lazy" na všechny obrázky.
Ve skutečnostiAtribut loading="lazy" není dobrá volba pro každý obrázek. Obrázky viditelné hned po otevření stránky, hlavně hero obrázek nebo důležitý produktový obrázek, mají být načtené prioritně.

Časté dotazy

Může lazy loading poškodit SEO?
Lazy loading může SEO pomoci i uškodit podle toho, co se odkládá. Vyhledávače dnes umí zpracovat mnoho JavaScriptu a líně načtených obrázků, ale hlavní obsah stránky by neměl záviset na pozdní interakci nebo nekonečném scrollu bez alternativy. Lazy loading je bezpečnější pro doplňkové obrázky, galerie, mapy a widgety než pro nadpis, produktový popis nebo primární interní odkazy.
Patří první hero obrázek do lazy loadingu?
Lazy loading se pro hlavní hero obrázek většinou nehodí, protože hero obrázek často ovlivňuje Largest Contentful Paint. Viditelný obrázek nad ohybem stránky má být dostupný co nejdříve a někdy má dostat vyšší prioritu načítání. Lazy loading dává větší smysl pro obrázky níže na stránce, které uživatel uvidí až po scrollování.
Kdy je lepší eager loading než lazy loading?
Eager loading je vhodnější než lazy loading pro zdroje, které jsou nutné k prvnímu použitelnému zobrazení nebo k okamžité interakci. Typickým příkladem je hlavní navigace, základní CSS, data pro první obrazovku nebo komponenta, na kterou uživatel klikne hned po otevření stránky. Lazy loading má smysl tam, kde odklad nezablokuje první úkol uživatele.
Jak měřit přínos lazy loadingu v reálném webu?
Přínos lazy loadingu se měří porovnáním chování před úpravou a po úpravě na podobných stránkách, zařízeních a sítích. Důležitý není jen menší úvodní balík, ale také LCP, CLS, čas do interakce a zpoždění při pozdějším zobrazení odloženého obsahu. Dobrá implementace zlepší první načtení, aniž by vytvořila citelné čekání po scrollu nebo kliknutí.

Zdroje

  1. Lazy loading(otevře se v novém okně)MDN Web Docs
  2. HTMLImageElement: loading property(otevře se v novém okně)MDN Web Docs
  3. HTML Standard(otevře se v novém okně)WHATWG
  4. lazy(otevře se v novém okně)React
  5. Intersection Observer(otevře se v novém okně)W3C

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.