Design wechseln

Frontend-Performance-Optimierung: Core Web Vitals – Anleitung für Top-Scores

Easton editorial illustration: component assembly loom

Lighthouse liegt bei nur 60 Punkten, und innerhalb einer Woche soll es 90 werden. Chrome DevTools öffnen, LCP, FID, CLS – diese Metriken müssen Sie verstehen. Performance-Optimierung ist für Frontend-Entwickler oft plötzlich zusätzliche Arbeit, die dazukommt.

Viele Stolpersteine: Beim ersten Optimierungsversuch habe ich alle Bilder mit Lazy Loading versehen – der LCP-Score sank stattdessen. Das große Hero-Bild im Above-the-Fold-Bereich darf man nicht lazy laden. Einmal habe ich zwei Tage in Service-Worker-Cache-Strategien investiert – der Score stieg nur um 2 Punkte. Dieser Artikel ist kein theoretischer Überblick, sondern ein praxiserprobter Leitfaden mit sichtbaren Ergebnissen in 2 Wochen: welche Optimierungen den höchsten ROI liefern, welche Fallstricke Sie meiden sollten und wie Sie Lighthouse priorisiert von 60 auf 90+ bringen.

70%+
LCP-Probleme
Stammen von Bildern
41%
Komprimierungsgewinn
AVIF vs. JPEG
2 Wochen
Optimierungszeitraum
60 → 90+
Source: Praxisdaten

Kapitel 1: Die drei Core Web Vitals verstehen

Lassen Sie sich von den englischen Abkürzungen nicht abschrecken – im Kern geht es um: Lädt die Seite schnell, reagiert sie auf Klicks, bleibt das Layout stabil?

Was sind Core Web Vitals?

Google hat 2020 drei zentrale Nutzererfahrungsmetriken eingeführt. Sie beeinflussen nicht nur die User Experience, sondern auch das SEO-Ranking direkt. Selbst hervorragender Inhalt hilft wenig, wenn die Performance schlecht ist. Seit März 2024 gibt es ein wichtiges Update: INP ersetzt FID als Kernmetrik. Wer noch FID optimiert, hinkt hinterher.

LCP – Largest Contentful Paint

LCP misst, wie schnell der Hauptinhalt einer Seite geladen wird – meist das große Hero-Bild, eine Überschrift oder ein Video im sichtbaren Bereich. Die Bewertungsskala:

  • Unter 2,5 Sekunden: Gut (grün)
  • 2,5–4 Sekunden: Verbesserungsbedarf (gelb)
  • Über 4 Sekunden: Schlecht (rot)
    Ich vergleiche LCP gern mit dem Servieren des Hauptgerichts im Restaurant. Wenn Sie zehn Minuten warten und das Hauptgericht noch nicht da ist, sind Sie verständlicherweise unzufrieden.
    Eine reale Zahl: Steigt die Ladezeit von 3 auf 5 Sekunden, steigt die Absprungrate um 38 %. Auf Mobilgeräten verlassen 53 % der Nutzer die Seite, wenn das Laden länger als 3 Sekunden dauert. Ein optimiertes LCP kann die Conversion um 7–15 % steigern.
38%
Absprungrate steigt
Source: Ladezeit 3 s → 5 s

INP – Interaction to Next Paint

Das ist die neue Metrik seit März 2024, die FID offiziell ersetzt. INP misst, wie schnell die Seite auf Nutzerinteraktionen reagiert – Klicks, Tastatureingaben und Touch-Gesten im gesamten Reaktionszyklus. Die Bewertungsskala:

  • Unter 200 ms: Gut (grün)
  • 200–500 ms: Verbesserungsbedarf (gelb)
  • Über 500 ms: Schlecht (rot)
    Warum hat Google FID ersetzt? FID misst nur die „First Input Delay“, während INP den gesamten Interaktionsprozess abdeckt. Wie beim Essen bestellen: FID prüft nur, ob der Kellner Sie gehört hat – INP misst die Zeit vom Bestellen bis das Gericht auf dem Tisch steht.
    Beim ersten Check lag die INP eines Projekts bei 650 ms – ein Button-Klick dauerte über eine halbe Sekunde, kein Wunder, dass Nutzer von Ruckeln berichteten. Die Ursache war ein automatisch eingebettetes YouTube-Video; nach dem Entfernen sank INP auf 220 ms, und die Seite fühlte sich spürbar flüssiger an.

CLS – Cumulative Layout Shift

CLS misst die visuelle Stabilität der Seite. Kennen Sie das? Sie wollen gerade auf einen Button klicken, die Seite springt plötzlich – und Sie treffen die Werbung daneben. Das ist CLS. Die Bewertungsskala:

  • Unter 0,1: Gut (grün)
  • 0,1–0,25: Verbesserungsbedarf (gelb)
  • Über 0,25: Schlecht (rot)
    Als ich zum ersten Mal CLS 0,5 sah, dachte ich, das sei gar nicht so schlimm – bis mir klar wurde, dass das bereits im roten Bereich liegt. Typische CLS-Ursachen: Bilder ohne Breite/Höhe, plötzlich eingefügte Werbung, Font Flash of Invisible Text (FOIT).

Kapitel 2: LCP-Optimierung – die Performance-Maßnahme mit höchstem ROI

Warum setze ich LCP an erster Stelle?

  • Direkt spürbar: Nutzer nehmen es sofort wahr
  • Größtes Optimierungspotenzial: Typisches LCP lässt sich von 5 auf unter 2 Sekunden verbessern
  • Reife Technologien: Bildoptimierung und CDN-Beschleunigung sind erprobte Lösungen
  • Höchster ROI: Wenig Aufwand, schnelle Wirkung – das beste Preis-Leistungs-Verhältnis

Vollständiger Core-Web-Vitals-Optimierungsprozess

Komplettlösung von LCP über INP bis CLS – Lighthouse in 2 Wochen von 60 auf 90+ Punkte

Estimated time: PT2W

  1. 1

    Step 1: P0-Priorität: Bildoptimierung (LCP)

    Bilder verursachen über 70 % der LCP-Probleme – höchster ROI:
  2. 2

    Step 2: P0-Priorität: Drittanbieter-Skripte verzögern (INP)

    Drittanbieter-Skripte sind der Hauptengpass für INP:
  3. 3

    Step 3: P0-Priorität: Bildbreite und -höhe setzen (CLS)

    CLS ist die am leichtesten zu behebende Metrik:
  4. 4

    Step 4: P1-Priorität: Code-Splitting und Ressourcenoptimierung

    Code-Splitting und Ressourcenoptimierung:
  5. 5

    Step 5: P1-Priorität: Schriftarten und Serveroptimierung

    Schriftarten und Serveroptimierung:
  6. 6

    Step 6: P2-Priorität: Fortgeschrittene Optimierung

    Fortgeschrittene Optimierung (mittlerer ROI, hoher Aufwand):

1. Bildoptimierung (ROI: ⭐⭐⭐⭐⭐)

Das ist der wichtigste Hebel – über 70 % der LCP-Probleme stammen von Bildern. Bei jeder Performance-Optimierung beginne ich mit Bildern.

a) Moderne Bildformate nutzen

Unterschätzen Sie das Format nicht: Von JPEG auf AVIF spart ein einzelnes Bild leicht 300 KB.

<!-- Option 1: <picture>-Tag – Browser wählt automatisch das beste Format -->
<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg" alt="Hero image"> <!-- Fallback für ältere Browser -->
</picture>
// Option 2: Next.js automatische Optimierung (empfohlen)
import Image from 'next/image'
<Image
  src="/hero.jpg"
  width={1200}
  height={600}
  priority // Wichtig: LCP-Bilder brauchen priority – kein Lazy Loading!
/>

Konkrete Zahlen:

  • AVIF: 41 % bessere Komprimierung als JPEG
  • WebP: 30 % bessere Komprimierung als JPEG
  • Praxisfall: E-Commerce-Startseite – Hero-Bild von 500 KB auf 120 KB (AVIF), LCP von 4,2 s auf 2,1 s – halbiert!

b) Lazy Loading (außer LCP-Bilder)

Ein klassischer Fehler: Auch LCP-Bilder lazy laden – der Score sinkt dann.

<!-- ❌ Falsch: LCP-Bilder nicht lazy laden! -->
<img src="hero.jpg" loading="lazy">
<!-- ✅ Richtig: Above-the-Fold mit eager, Rest mit lazy -->
<img src="hero.jpg" loading="eager"> <!-- LCP-Bild -->
<img src="product1.jpg" loading="lazy"> <!-- Bilder weiter unten -->
<img src="product2.jpg" loading="lazy">

Merken Sie sich: Jedes Bild im sichtbaren Bereich darf nicht lazy geladen werden. Lazy Loading ist für Bilder unterhalb des Fold gedacht.

c) Responsive Bilder

Mobile Nutzer brauchen keine Desktop-Großbilder – srcset spart bis zu 60 % Traffic.

<img
  src="hero-800w.jpg"
  srcset="hero-400w.jpg 400w,
          hero-800w.jpg 800w,
          hero-1200w.jpg 1200w"
  sizes="(max-width: 600px) 400px,
         (max-width: 1000px) 800px,
         1200px"
  alt="Hero"
/>

Praxiswirkung: Mobile Nutzer laden 400w statt 1200w – LCP verbessert sich um etwa 1 Sekunde.

d) Bild-CDN und Preload

CDN ist kein Luxus, sondern Pflicht. Aliyun OSS kostet im Jahr nur wenige Euro.

<!-- Kritische Bilder preloaden – Browser lädt sie zuerst -->
<link rel="preload" as="image" href="hero.jpg">
<!-- Bild-CDN (automatische Formatkonvertierung + Komprimierung) -->
<!-- Tencent COS, Aliyun OSS, Cloudflare Images unterstützen das -->
<img src="https://cdn.example.com/hero.jpg?x-oss-process=image/format,webp/quality,80">

e) Bildgröße und Komprimierung

Empfohlene Tools:

  • TinyPNG: Online-Komprimierung, einfach und effektiv
  • ImageOptim: Mac-Klassiker für Batch-Komprimierung
  • Squoosh: Von Google, unterstützt AVIF
    Komprimierungsregeln:
  • Above-the-Fold-Bilder: Qualität 80 % (visuell kaum Unterschied)
  • Andere Bilder: 70 % (reicht aus)
  • Breite: doppelte Designbreite (für Retina-Displays)

f) Keine großen Base64-Inline-Bilder

// ❌ Große Bilder nicht inline (über 10 KB)
// Erhöht HTML-Volumen und verzögert Rendering
const heroImage = 'data:image/jpeg;base64,/9j/4AAQSkZJRg...' // 500 KB
// ✅ Base64 nur für kleine Icons (unter 10 KB)
// z. B. Loading-Icon, einfache SVG-Icons
const icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR...' // 2 KB

2. Server-Antwortzeit optimieren (ROI: ⭐⭐⭐⭐)

a) CDN nutzen

Alle statischen Ressourcen über CDN ausliefern; HTML kann ebenfalls gecacht werden (mit SSG/ISR). Ich habe Fälle gesehen, in denen TTFB von 200 ms auf 50 ms sank – spürbar für Nutzer.

b) Serverseitiges Rendering (SSR) oder statische Generierung (SSG)

// Next.js – statische Generierung (bevorzugt, beste Performance)
export async function getStaticProps() {
  const data = await fetchData()
  return {
    props: { data },
    revalidate: 60 // ISR: alle 60 Sekunden neu generieren
  }
}
// Oder serverseitiges Rendering (wenn Echtzeitdaten nötig sind)
export async function getServerSideProps() {
  const data = await fetchData()
  return { props: { data } }
}

c) Datenbankabfragen optimieren

  • Indizes hinzufügen (EXPLAIN-Analyse nicht vergessen)
  • Redis für Hotspot-Daten nutzen
  • N+1-Queries vermeiden (JOIN oder DataLoader)

3. Ressourcenladen optimieren (ROI: ⭐⭐⭐)

a) Kritisches CSS inline

<!-- Kritisches Above-the-Fold-CSS inline in <head>, Rendering nicht blockieren -->
<style>
  .hero {
    width: 100%;
    height: 600px;
    background: #f0f0f0;
  }
  .nav {
    position: fixed;
    top: 0;
    width: 100%;
  }
</style>
<!-- Nicht-kritisches CSS verzögert laden -->
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>

b) Schriftarten optimieren

/* font-display gegen FOIT (Flash of Invisible Text) */
@font-face {
  font-family: 'CustomFont';
  src: url('font.woff2') format('woff2');
  font-display: swap; /* Fallback-Schrift sofort anzeigen, kein Weißbildschirm */
}
<!-- Kritische Schriftarten preloaden -->
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>

Kapitel 3: INP-Optimierung – Interaktionen flüssiger machen

Drittanbieter-Skripte sind der größte INP-Killer! Das Extrembeispiel: Eine Seite mit 12 Drittanbieter-Skripten – Google Analytics, Facebook Pixel, Chat-Widget, Werbescripte – INP direkt über 800 ms.

1. JavaScript-Ausführung optimieren (ROI: ⭐⭐⭐⭐)

a) Code-Splitting

Code-Splitting klingt komplex, bedeutet aber einfach „On-Demand-Laden“ – Code einer Seite wird erst geladen, wenn der Nutzer dorthin navigiert.

// React – Code-Splitting auf Routenebene
import { lazy, Suspense } from 'react'
const Dashboard = lazy(() => import('./Dashboard'))
const Profile = lazy(() => import('./Profile'))
function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <Routes>
        <Route path="/dashboard" element={<Dashboard />} />
        <Route path="/profile" element={<Profile />} />
      </Routes>
    </Suspense>
  )
}
// Vue 3 – asynchrone Komponenten
const Dashboard = defineAsyncComponent(() => import('./Dashboard.vue'))

Praxiswirkung: Admin-Backend von 1,2 MB auf 200 KB im First View, INP von 450 ms auf 180 ms – die Seite öffnet sich mehr als doppelt so schnell.

b) Lange Tasks aufteilen

Blockiert der Main Thread länger als 50 ms, entsteht ein Long Task – INP steigt.

// ❌ Long Task blockiert Main Thread
function processLargeData(data) {
  for (let i = 0; i < 10000; i++) {
    // Komplexe Berechnung, 10.000 Einträge auf einmal
    heavyCalculation(data[i])
  }
}
// ✅ Mit requestIdleCallback in kleine Tasks aufteilen
function processLargeData(data) {
  let index = 0
  function processChunk() {
    const chunkSize = 100 // Jeweils 100 Einträge
    let count = 0
    while (index < data.length && count < chunkSize) {
      heavyCalculation(data[index])
      index++
      count++
    }
    if (index < data.length) {
      // Noch nicht fertig – bei nächster Leerlaufzeit weiter
      requestIdleCallback(processChunk)
    }
  }
  requestIdleCallback(processChunk)
}

c) Web Workers nutzen

Komplexe Berechnungen in Worker auslagern, Main Thread freihalten.

// worker.js
self.onmessage = (e) => {
  const result = complexCalculation(e.data) // Berechnung im Worker
  self.postMessage(result)
}
// main.js
const worker = new Worker('worker.js')
worker.postMessage(data)
worker.onmessage = (e) => {
  console.log('Result:', e.data)
  // Ergebnis erhalten, UI aktualisieren
}

2. Drittanbieter-Skripte optimieren (ROI: ⭐⭐⭐⭐⭐)

Drittanbieter-Skripte sind wie Gäste bei einer Party – je mehr kommen, desto chaotischer wird es. Jedes Skript will Ressourcen.

a) Nicht-kritische Skripte verzögert laden

<!-- ❌ Blockierendes Laden (hält Rendering auf) -->
<script src="analytics.js"></script>
<!-- ✅ Erst nach Seitenladung -->
<script defer src="analytics.js"></script>
<!-- ✅ Oder manuell 3 Sekunden verzögern (aggressiver) -->
<script>
  window.addEventListener('load', () => {
    setTimeout(() => {
      const script = document.createElement('script')
      script.src = 'analytics.js'
      document.body.appendChild(script)
    }, 3000) // Analytics erst nach 3 Sekunden Nutzung laden
  })
</script>

b) Facade-Muster für schwere Komponenten

YouTube-Embed wiegt über 1 MB – direktes Laden bremst INP massiv.

// Leichtes YouTube-Thumbnail, echtes Video erst bei Klick
function VideoFacade({ videoId }) {
  const [showVideo, setShowVideo] = useState(false)
  if (!showVideo) {
    return (
      <div
        className="video-facade"
        style={{
          backgroundImage: `url(https://i.ytimg.com/vi/${videoId}/maxresdefault.jpg)`,
          cursor: 'pointer'
        }}
        onClick={() => setShowVideo(true)}
      >
        <button className="play-button">▶ Video abspielen</button>
      </div>
    )
  }
  return <iframe src={`https://www.youtube.com/embed/${videoId}`} />
}

Praxiswirkung: YouTube-Auto-Embed entfernt, INP von 650 ms auf 220 ms.

3. Event-Handling optimieren (ROI: ⭐⭐⭐)

a) Debounce und Throttle

import { debounce, throttle } from 'lodash'
// Debounce für Suche (300 ms nach letzter Eingabe)
const handleSearch = debounce((value) => {
  fetchSearchResults(value)
}, 300)
// Throttle für Scroll (maximal alle 100 ms)
const handleScroll = throttle(() => {
  updateScrollPosition()
}, 100)

b) Passive Event-Listener

// Scroll-Performance verbessern – Browser weiß, dass preventDefault nicht aufgerufen wird
window.addEventListener('scroll', handleScroll, { passive: true })
window.addEventListener('touchmove', handleTouch, { passive: true })

Kapitel 4: CLS-Optimierung – Layout-Sprünge vermeiden

CLS ist wie jemand, der Ihnen beim Lesen plötzlich das Buch nach oben schiebt – Sie müssen die Zeile neu finden. Die gute Nachricht: CLS ist am leichtesten zu beheben.

1. Bildern und Videos Breite/Höhe geben (ROI: ⭐⭐⭐⭐⭐)

Fehlende Bildabmessungen sind die häufigste CLS-Ursache – und gleichzeitig am einfachsten zu fixen.

<!-- ❌ Ohne Breite/Höhe – Layout springt beim Laden -->
<img src="photo.jpg" alt="Photo">
<!-- ✅ Mit Attributen – Browser reserviert Platz im Voraus -->
<img src="photo.jpg" width="800" height="600" alt="Photo">
<!-- ✅ Oder CSS aspect-ratio (moderne Browser) -->
<style>
  img {
    width: 100%;
    aspect-ratio: 16 / 9;
  }
</style>

Praxisfall: Nachrichtenseite – allen Bildern Breite/Höhe gegeben, CLS von 0,35 auf 0,05. So einfach.

2. Schriftladen optimieren (ROI: ⭐⭐⭐⭐)

a) font-display: swap nutzen

@font-face {
  font-family: 'CustomFont';
  src: url('font.woff2') format('woff2');
  font-display: swap; /* FOIT vermeiden (Weißbildschirm beim Laden) */
}

b) Kritische Schriftarten preloaden

<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>

c) Systemschriften oder Variable Fonts

/* Systemschriften – kein Download, null Latenz */
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
/* Variable Font – eine Datei für alle Schnitte (100–900) */
@font-face {
  font-family: 'Inter';
  src: url('Inter-Variable.woff2') format('woff2-variations');
  font-weight: 100 900;
}

3. Platz für dynamische Inhalte reservieren (ROI: ⭐⭐⭐⭐)

a) Werbeplatz reservieren

.ad-container {
  min-height: 250px; /* Werbehöhe reservieren – kein Sprung vor dem Laden */
  background: #f0f0f0; /* Platzhalter-Hintergrund */
}

b) Skeleton Screen

Skeleton Screens sehen nicht nur gut aus – sie stabilisieren das Layout.

// Vor dem Laden Skeleton anzeigen – kein plötzliches Erscheinen
function ProductCard({ loading, data }) {
  if (loading) {
    return (
      <div className="skeleton">
        <div className="skeleton-image" style={{ width: '100%', height: '200px', background: '#e0e0e0' }} />
        <div className="skeleton-title" style={{ width: '80%', height: '20px', background: '#e0e0e0', margin: '10px 0' }} />
        <div className="skeleton-price" style={{ width: '40%', height: '20px', background: '#e0e0e0' }} />
      </div>
    )
  }
  return (
    <div className="product">
      <img src={data.image} alt={data.title} />
      <h3>{data.title}</h3>
      <p>{data.price}</p>
    </div>
  )
}

4. Keine Inhalte über bestehendem Content einfügen (ROI: ⭐⭐⭐⭐⭐)

// ❌ Banner oben einfügen – Content rutscht nach unten (CLS explodiert)
<div>
  {showBanner && <Banner />}
  <Content />
</div>
// ✅ fixed-Positionierung – Layout bleibt stabil
<div>
  {showBanner && <Banner style={{ position: 'fixed', top: 0, zIndex: 1000 }} />}
  <Content style={{ marginTop: showBanner ? '60px' : '0' }} />
</div>

5. Animationen mit transform statt top/left (ROI: ⭐⭐⭐)

Ich habe gesehen, wie jemand Animationen mit top umsetzte – CLS ging durch die Decke.

/* ❌ Löst Layout aus, CLS steigt */
.element {
  position: relative;
  animation: slideIn 0.3s;
}
@keyframes slideIn {
  from { top: -100px; } /* top-Änderung triggert Reflow */
  to { top: 0; }
}
/* ✅ transform – nur Composite (GPU-beschleunigt) */
.element {
  animation: slideIn 0.3s;
}
@keyframes slideIn {
  from { transform: translateY(-100px); }
  to { transform: translateY(0); }
}

Kapitel 5: Gesamtpraxis – vollständiger Optimierungsprozess

Prioritäten sind entscheidend – nicht gleich mit SSR anfangen, sondern zuerst Bilder optimieren. Beim ersten Durchlauf brachte allein das Setzen von Bildbreite/-höhe 10 Punkte – praktisch geschenkt.

Optimierungsprioritäts-Matrix

OptimierungROISchwierigkeitPriorität
Bildbreite/-höhe setzenSehr hochSehr niedrigP0
Bildformat konvertierenSehr hochNiedrigP0
LCP-Bilder optimierenSehr hochNiedrigP0
Drittanbieter-Skripte verzögernSehr hochNiedrigP0
Schriftarten optimierenHochNiedrigP1
Code-SplittingHochMittelP1
CDNHochNiedrigP1
SSR/SSGMittelHochP2
Web WorkersNiedrigHochP3

Mess-Tools und Befehle

# 1. Lighthouse (Referenzstandard)
# Chrome DevTools > Lighthouse > Generate report
# Inkognito-Modus nutzen – Erweiterungen verfälschen den Score
# 2. WebPageTest (echte Geräte)
# https://webpagetest.org
# Verschiedene Regionen und Netzwerkgeschwindigkeiten wählbar
# 3. Chrome DevTools Performance-Panel
# Ladevorgang aufzeichnen, Engpässe analysieren
# Dauer jedes Tasks sichtbar
# 4. npm-Paketanalyse
npx webpack-bundle-analyzer
# Visualisiert, welches Paket am größten ist
# 5. Bildanalyse
npx sharp-cli info image.jpg
# Bildgröße, Format und Dateigröße anzeigen

Typische Fehler vermeiden

  1. ❌ Lighthouse nicht in der Produktionsumgebung testen (Inkognito oder Erweiterungen deaktivieren)
  2. ❌ Nicht nur einmal testen (mindestens 3 Durchläufe, Mittelwert – Netzwerk schwankt stark)
  3. ❌ Nicht nur Desktop testen (Mobile ist wichtiger – 75 % des Traffics kommt von Mobilgeräten)
  4. ❌ Network Throttling nicht ignorieren (langsames Netz simulieren, z. B. Fast 3G)
  5. ❌ LCP-Bilder niemals lazy laden (klassischer Fehler)

Fazit

Performance-Optimierung ist kein einmaliges Projekt, sondern ein laufender Prozess – wie Fitness braucht es Disziplin. Wenn Lighthouse von 60 auf 90 steigt, ist das ein echtes Erfolgserlebnis.
Performance-Optimierung ist nicht nur Technik, sondern Respekt gegenüber Nutzern. Jede eingesparte Sekunde hält mehr Besucher auf der Seite. Mobile Nutzer haben oft nur 3 Sekunden Geduld – und Sie können diese 3 Sekunden auf 1 reduzieren.
Gemeinsam für ein flüssiges Surferlebnis für jeden Nutzer.

FAQ

Was sind die Standards für die drei Core-Web-Vitals-Metriken?
LCP (Largest Contentful Paint):
• Unter 2,5 s: gut, 2,5–4 s: Verbesserungsbedarf, über 4 s: schlecht

INP (Interaction to Next Paint):
• Unter 200 ms: gut, 200–500 ms: Verbesserungsbedarf, über 500 ms: schlecht
• Seit März 2024 ersetzt INP FID als Kernmetrik

CLS (Cumulative Layout Shift):
• Unter 0,1: gut, 0,1–0,25: Verbesserungsbedarf, über 0,25: schlecht

Wichtige Daten:
• Ladezeit von 3 auf 5 Sekunden: Absprungrate steigt um 38 %
• Mobile Ladezeit über 3 s: 53 % der Nutzer verlassen die Seite
• Optimiertes LCP kann Conversion um 7–15 % steigern
Wie optimiert man LCP (Largest Contentful Paint)?
Bilder verursachen über 70 % der LCP-Probleme:

1) Moderne Bildformate (AVIF 41 % besser als JPEG, WebP 30 % besser)
• Praxisfall: Hero-Bild von 500 KB auf 120 KB, LCP von 4,2 s auf 2,1 s

2) LCP-Bilder brauchen priority, kein Lazy Loading – Above-the-Fold mit eager

3) Responsive Bilder mit srcset sparen bis zu 60 % Traffic

4) CDN und preload für kritische Bilder

5) Server-Antwortzeit (CDN, SSR/SSG, Datenbankabfragen)

Priorität: Bildoptimierung hat den höchsten ROI – wenig Aufwand, schnelle Wirkung.
Wie optimiert man INP (Interaction to Next Paint)?
Wichtige Maßnahmen:

1) Code-Splitting auf Routenebene (React lazy, Vue defineAsyncComponent)
• Praxisfall: von 1,2 MB auf 200 KB im First View, INP von 450 ms auf 180 ms

2) Drittanbieter-Skripte verzögert laden (defer oder 3 s Verzögerung), Facade-Muster für schwere Komponenten

3) Automatische Embeds entfernen (z. B. YouTube-Auto-Embed: INP von 650 ms auf 220 ms)

4) Lange Tasks mit requestIdleCallback aufteilen

5) Web Workers für komplexe Berechnungen

6) Debounce, Throttle und passive Event-Listener
Wie optimiert man CLS (Cumulative Layout Shift)?
CLS ist am leichtesten zu beheben:

1) Bildern Breite/Höhe geben (width/height oder CSS aspect-ratio)
• Praxisfall: CLS von 0,35 auf 0,05

2) Schriftarten (font-display: swap gegen FOIT, preload, Systemschriften oder Variable Fonts)

3) Platz für dynamische Inhalte (min-height für Werbeplätze, Skeleton Screens)

4) Keine Inhalte über bestehendem Content (fixed-Positionierung)

5) Animationen mit transform statt top/left (nur Composite, kein Layout)
Welche Priorität hat Performance-Optimierung?
P0 (sehr hoher ROI, geringer Aufwand):
• Bildbreite/-höhe setzen
• Bildformat konvertieren (AVIF/WebP)
• LCP-Bilder optimieren (priority, kein Lazy Loading)
• Drittanbieter-Skripte verzögert laden

P1 (hoher ROI):
• Schriftarten (font-display: swap)
• Code-Splitting
• CDN

P2 (mittlerer ROI, hoher Aufwand):
• SSR/SSG

P3 (niedriger ROI, hoher Aufwand):
• Web Workers

Empfehlung: Zuerst P0 – allein Bildbreite/-höhe bringt leicht 10 Punkte. Nicht gleich mit SSR starten, zuerst Bilder optimieren.
Dürfen LCP-Bilder lazy geladen werden?
Auf keinen Fall – das ist der häufigste Fehler.

LCP-Bilder (Above-the-Fold-Hero) brauchen priority oder loading="eager", kein Lazy Loading. Lazy Loading ist für Bilder unterhalb des Fold.

Falsch:
<img src="hero.jpg" loading="lazy"> – LCP-Score sinkt

Richtig:
• Above-the-Fold mit eager, Rest mit lazy
• Jedes sichtbare Bild darf nicht lazy geladen werden
Wie misst und testet man Core Web Vitals?
Mess-Tools:

1) Lighthouse (Chrome DevTools, Referenzstandard – Inkognito gegen Erweiterungs-Störungen)

2) WebPageTest (echte Geräte, verschiedene Regionen und Netzwerkgeschwindigkeiten)

3) Chrome DevTools Performance-Panel (Ladevorgang aufzeichnen, Engpässe finden)

4) webpack-bundle-analyzer (größte Pakete visualisieren)

5) sharp-cli info (Bildgröße, Format, Dateigröße)

Typische Fehler:
• Nicht in Produktion testen
• Nicht nur einmal messen (mindestens 3 Durchläufe, Mittelwert)
• Nicht nur Desktop (Mobile: 75 % des Traffics)
• Network Throttling nicht ignorieren (langsames Netz simulieren)

12 Min. Lesezeit · Veröffentlicht am: 24. Nov. 2025 · Aktualisiert am: 14. Juli 2026

Kommentare

Melde dich mit GitHub an, um einen Kommentar zu hinterlassen

Easton BlogEaston Blog