News

Shopware LCP Optimization: Core Web Vitals, HTTP/2 Prioritization & Lazy Loading (Performance-Pillar)

Von Erol Demirkoparan
9 min
Shopware LCP Optimization: Core Web Vitals, HTTP/2 Prioritization & Lazy Loading (Performance-Pillar) - Cloudox Software Agentur Blog

1) LCP in Shopware reproduzierbar messen & LCP-Element finden

Mess-Setup (Field + Lab) für Core Web Vitals

Für eine belastbare Shopware LCP Optimization brauchst du zwei Perspektiven: Field Data (echte Nutzer, z.B. CrUX/RUM) und Lab Data (Lighthouse/WebPageTest). Ziel ist, das LCP-Element (meist Hero-Bild, H1-Block oder Slider) eindeutig zu identifizieren und dann dessen Render-Pfad zu verkürzen.

Vorgehen:

  • Im Browser DevTools → Performance/Network: prüfen, wann das LCP-Element geladen und gerendert wird (Timing + Request Waterfall).
  • Lighthouse → „Largest Contentful Paint element“ ansehen und die dazugehörige DOM-Node in deinem Shopware Theme zuordnen.
  • WebPageTest (oder ähnliches): Filmstrip + Waterfall, um Blocker (CSS/JS) vor dem LCP zu sehen.

Typische Shopware Ursachen für schlechtes LCP:

  • Hero-Image wird zu spät geladen (kein Preload, falsche Priorität, zu groß, falsches Format).
  • Render-blocking CSS/JS im Theme (kritisches CSS fehlt, zu viele Bundles, Third-Party Scripts).
  • Cache/TTFB zu hoch (HTTP Cache, Reverse Proxy, PHP/DB, fehlende CDN-Edge-Caches).
FeatureDetails
Core Web Vitals FokusLCP (sichtbarer Hauptinhalt), INP (Interaktion), CLS (Layout-Stabilität). LCP ist oft am schnellsten hebelbar über Image/CSS/TTFB.
Shopware Theme EinflussTemplate-Struktur (Hero/Slider), Asset-Pipeline, kritisches CSS, JS-Bundling und Third-Party Tags.
LCP-ElementHäufig ein Bild (Hero), manchmal Textblock (H1/Teaser) – wichtig ist: Priorität + Blocker entfernen.

Lighthouse-Report mit markiertem LCP-Element (Hero Image) in einer Shopware-Kategorieseite
Lighthouse-Report mit markiertem LCP-Element (Hero Image) in einer Shopware-Kategorieseite

2) HTTP/2 Prioritization gezielt für LCP nutzen

Was bedeutet HTTP/2 Prioritization (und warum hilft es LCP)?

HTTP/2 Prioritization erlaubt dem Browser (und teilweise Server/Proxy), die Reihenfolge und Gewichtung von Ressourcen-Downloads zu steuern. Für LCP ist das entscheidend, weil du willst, dass LCP-relevante Ressourcen (Hero-Bild, kritisches CSS, ggf. Fonts) möglichst früh Bandbreite bekommen – statt dass sie mit unwichtigen Skripten, Tracking oder unterhalb des Folds konkurrieren.

Praktische Hebel in Shopware:

  • Preload für das LCP-Bild (und ggf. kritische Fonts) setzen, damit der Browser es früh anfordert.
  • Render-blocking reduzieren: kritisches CSS inline oder als priorisierte Ressource, Rest später.
  • Third-Party Scripts defer/async und möglichst nach LCP laden.

Wichtig: HTTP/2-Prioritäten werden in der Praxis auch von CDNs/Reverse Proxies beeinflusst. Teste daher immer in der echten Auslieferungskette (CDN → Reverse Proxy → Shopware), nicht nur lokal.

Checkliste: Priorisierung, die LCP wirklich verbessert

  • LCP-Bild: früh im HTML referenzieren (nicht erst per JS nachladen).
  • LCP-Bild: <link rel="preload" as="image"> (Theme/Template) – passend zur ausgelieferten Größe.
  • CSS: kritische Styles für Above-the-Fold minimal halten; Rest nachladen.
  • Fonts: nur wenn unbedingt nötig preloaden; sonst system fonts oder font-display: swap.
flowchart TD A[Request HTML] --> B[Parse HTML] B --> C{Find LCP candidate} C -->|Hero image| D[Prioritize image download] C -->|CSS blocks render| E[Reduce render blocking] D --> F[Earlier paint] E --> F F --> G[Improved LCP in Core Web Vitals]

3) Lazy Loading richtig einsetzen (ohne LCP zu verschlechtern)

Lazy Loading: Konzept & häufige Fehler

Lazy Loading bedeutet, dass Ressourcen (meist Bilder) erst dann geladen werden, wenn sie wahrscheinlich bald im Viewport erscheinen. Das spart initiale Bandbreite und kann TTFB/Render-Pipeline entlasten. Der häufigste Fehler in Shops: Das LCP-Image wird versehentlich lazy geladen (z.B. loading="lazy" auf dem Hero-Bild). Dadurch wird die wichtigste Ressource nach hinten geschoben – LCP wird schlechter.

Regel: Above-the-fold und insbesondere das LCP-Element nicht lazy loaden. Lazy Loading nur für unterhalb des Folds (Produktlisten weiter unten, Empfehlungs-Slider, Footer-Galerien).

TypeScript: Lazy Loading Funktion mit IntersectionObserver (Shopware Theme)

Das folgende Beispiel ist eine realistische Theme-Implementierung: Bilder werden erst geladen, wenn sie in die Nähe des Viewports kommen. Gleichzeitig gibt es einen Fallback für Browser ohne IntersectionObserver.

TypeScript function for Lazy Loading

type LazyImageOptions = {
    rootMargin?: string;
    threshold?: number;
    selector?: string;
    loadedClass?: string;
};

/**
 * Enables lazy loading for images that use data-src and optional data-srcset.
 * Important: Do NOT apply this to the LCP image (hero / above-the-fold).
 */
export function enableLazyLoading(options: LazyImageOptions = {}): void {
    const {
        rootMargin = '200px 0px',
        threshold = 0.01,
        selector = 'img[data-src], source[data-srcset]',
        loadedClass = 'is-lazy-loaded',
    } = options;

    const elements: Array<HTMLImageElement | HTMLSourceElement> = Array.from(
        document.querySelectorAll(selector)
    ) as Array<HTMLImageElement | HTMLSourceElement>;

    const loadElement = (el: HTMLImageElement | HTMLSourceElement): void => {
        if (el instanceof HTMLImageElement) {
            const src = el.dataset.src;
            const srcset = el.dataset.srcset;

            if (src) {
                el.src = src;
                delete el.dataset.src;
            }

            if (srcset) {
                el.srcset = srcset;
                delete el.dataset.srcset;
            }

            el.addEventListener(
                'load',
                () => {
                    el.classList.add(loadedClass);
                },
                { once: true }
            );
        } else {
            const srcset = el.dataset.srcset;
            if (srcset) {
                el.srcset = srcset;
                delete el.dataset.srcset;
            }
        }
    };

    // Fallback: load everything immediately
    if (!('IntersectionObserver' in window)) {
        elements.forEach(loadElement);
        return;
    }

    const observer = new IntersectionObserver(
        (entries, obs) => {
            entries.forEach((entry) => {
                if (!entry.isIntersecting) {
                    return;
                }

                const target = entry.target as HTMLImageElement | HTMLSourceElement;
                loadElement(target);
                obs.unobserve(target);
            });
        },
        { root: null, rootMargin, threshold }
    );

    elements.forEach((el) => observer.observe(el));
}

Integration-Hinweise im Shopware Theme:

  • Markiere Lazy-Load-Images im Template mit data-src statt src (und optional data-srcset).
  • Nutze für das LCP-Bild weiterhin normales src/srcset + ggf. Preload, damit es früh geladen wird.

4) Caching & Auslieferung: TTFB senken, LCP stabilisieren

Warum Caching direkt auf LCP einzahlt

Selbst wenn dein LCP-Element perfekt priorisiert ist, kann ein hoher TTFB (langsamer HTML-Start) das gesamte Rendering verschieben. Für Shopware bedeutet das: HTTP Cache / Reverse Proxy / CDN und korrektes Cache-Tagging sind zentrale Performance-Hebel.

YAML: Config für Caching (Reverse Proxy / HTTP Cache)

Beispielhaftes YAML, um HTTP Cache/Proxy-Settings strukturiert zu verwalten. Je nach Setup (integrierter HTTP Cache, Symfony-HTTP-Cache, Reverse Proxy wie Varnish/NGINX oder CDN) variieren die Parameter – das Muster bleibt: Cache aktivieren, TTL definieren, Debug-Header für Verifikation, saubere Purge-Strategie.

YAML Config for Caching

# config/packages/http_cache.yaml
# Example configuration pattern for improving cache hit ratio and reducing TTFB.
# Adjust keys to your hosting stack (Shopware + Symfony + reverse proxy/CDN).

http_cache:
  enabled: true

  # Default TTL in seconds for cacheable storefront responses
  default_ttl: 300

  # Allow stale content while revalidating in the background
  stale_while_revalidate: 60

  # Add headers to help you verify caching behavior in production
  debug_headers:
    enabled: true
    header_name: "X-Cache-Debug"

  # Purge settings (e.g., when products/categories change)
  purge:
    enabled: true
    endpoint: "/_cache/purge"
    allowed_ips:
      - "127.0.0.1"
      - "10.0.0.0/8"

  # Vary rules to avoid cache fragmentation
  vary:
    by_cookies:
      - "session-"
      - "sw-states"
    by_headers:
      - "Accept-Encoding"
      - "Accept-Language"

Validierung: Prüfe im Network-Tab Response-Header (z.B. HIT/MISS, Age, Cache-Control). Ziel: Hoher HIT-Anteil auf Kategorieseiten/Produktlisten, stabile TTFB-Spitzen vermeiden.

5) Shopware Theme: Above-the-Fold verschlanken (LCP-Path kürzen)

Theme-optimierte Maßnahmen mit direktem LCP-Effekt

  • Hero/Slider vereinfachen: Slider sind oft JS-lastig und verzögern LCP. Ein statisches Hero-Bild kann massiv helfen.
  • Bildformate: WebP/AVIF nutzen, korrekte Dimensionen ausliefern (keine 2500px Bilder für 390px Viewport).
  • Kritisches CSS: Nur Above-the-Fold Styles initial laden; restliches CSS nachladen.
  • Third-Party: Tag Manager, Tracking, Chat-Widgets nach LCP laden oder per Consent/Trigger verzögern.

Shopware Theme Hero-Bereich mit Hinweis: LCP-Image darf nicht lazy loaden, muss passende Größen & srcset haben
Shopware Theme Hero-Bereich mit Hinweis: LCP-Image darf nicht lazy loaden, muss passende Größen & srcset haben

6) Priorisierte Maßnahmen-Roadmap (was bringt am meisten?)

FeatureDetails
LCP-Element fixenHero-Bild nicht lazy loaden, passende Größe/Format, früh im HTML, ggf. preloaden.
HTTP/2 Prioritization nutzenLCP-Ressourcen bevorzugen, Third-Party nachrangig laden, Render-Blocker reduzieren.
Caching/TTFBCache-Hit erhöhen (CDN/Proxy), TTL/Vary reduzieren Fragmentierung, saubere Purges.
Theme-Overhead reduzierenSlider/JS entschlacken, kritisches CSS, Fonts optimieren, Bildpipeline modernisieren.

Umsetzung mit externer Unterstützung

Wenn du LCP & Core Web Vitals in Shopware strukturiert verbessern willst (Messkonzept, Theme-Optimierung, Caching/CDN, Priorisierung, QA), findest du Unterstützung über unsere Shopware Agentur.

Häufig gestellte Fragen

Autor

Erol Demirkoparan

Erol Demirkoparan

Senior Software Architect

Full-Stack & Cloud-Native Systems Expert. Spezialisiert auf AWS, Next.js und skalierbare SaaS-Architekturen. Building the future of automated SEO.

AWSNext.jsScalable SaaSSystem Architecture

Veröffentlicht am

5. Januar 2026

Das könnte Sie auch interessieren