Zum Inhalt springen

Website Performance optimieren – Core Web Vitals verbessern (2025)

· von

Core Web Vitals sind seit 2021 ein offizieller Google Ranking-Faktor. Langsame Websites verlieren nicht nur Besucher, sondern auch Sichtbarkeit in den Suchergebnissen. In diesem umfassenden Guide zeige ich, wie Sie LCP, FID und CLS systematisch optimieren – mit praktischen Tools, Code-Beispielen und messbaren Erfolgen.

Core Web Vitals Performance – Symbolbild

~9 Min. Lesezeit · Veröffentlicht am

⚡ Wichtig für SEO 2025:

Google bewertet Websites zunehmend nach User Experience. Schlechte Core Web Vitals können Rankings drastisch verschlechtern – besonders bei kommerziellen Keywords. Eine Optimierung um nur 0,5 Sekunden kann den Unterschied zwischen Platz 3 und Platz 15 ausmachen.

Was sind Core Web Vitals?

Core Web Vitals sind drei spezifische Metriken, die Google als entscheidend für eine gute User Experience einstuft. Sie messen reale Nutzererfahrungen und sind seit Mai 2021 ein offizieller Ranking-Faktor.

Die drei Core Web Vitals im Detail:

  • LCP (Largest Contentful Paint): Ladezeit des größten sichtbaren Elements (< 2,5 Sek.)
  • FID (First Input Delay): Zeit bis zur ersten Nutzerinteraktion (< 100ms)
  • CLS (Cumulative Layout Shift): Unerwartete Layout-Verschiebungen (< 0,1)

Warum Core Web Vitals entscheidend sind

LCP optimieren (Largest Contentful Paint)

LCP misst, wann das größte Element im sichtbaren Bereich vollständig geladen ist. Das können Bilder, Videos oder große Textblöcke sein.

LCP-Probleme identifizieren

// LCP im Browser messen
new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    console.log('LCP candidate:', entry.startTime, entry.element);
  }
}).observe({type: 'largest-contentful-paint', buffered: true});

Häufige LCP-Bremsen

LCP-Optimierungsstrategien

1. Bilder optimieren

<!-- Modernes responsive Bild mit Priority-Hint -->
<img src="hero.webp" 
     alt="Hero Bild"
     width="800" 
     height="400"
     fetchpriority="high"
     sizes="(max-width: 768px) 100vw, 800px"
     srcset="hero-400.webp 400w, hero-800.webp 800w, hero-1200.webp 1200w" />

2. Critical CSS inline

<!-- Critical CSS direkt im HTML -->
<style>
/* Above-the-fold CSS */
.hero { background: linear-gradient(...); height: 100vh; }
.nav { position: fixed; top: 0; z-index: 100; }
</style>

<!-- Non-critical CSS asynchron laden -->
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>

3. Preload wichtiger Ressourcen

<!-- Wichtige Ressourcen vorladen -->
<link rel="preload" href="hero.webp" as="image">
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="dns-prefetch" href="https://analytics.google.com">

✅ LCP-Zielwerte:

  • Gut: < 2,5 Sekunden
  • Verbesserungsbedarf: 2,5 - 4,0 Sekunden
  • Schlecht: > 4,0 Sekunden

FID optimieren (First Input Delay)

FID misst die Zeit zwischen der ersten Nutzerinteraktion (Klick, Touch) und der Browser-Antwort. Lange JavaScript-Ausführungszeiten sind der Hauptverursacher.

FID-Probleme erkennen

// FID im Browser überwachen
new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    const FID = entry.processingStart - entry.startTime;
    console.log('FID:', FID);
  }
}).observe({type: 'first-input', buffered: true});

Häufige FID-Verursacher

FID-Optimierungsstrategien

1. JavaScript Code-Splitting

// Dynamische Imports für bessere Performance
const loadModule = async () => {
  const { heavyFunction } = await import('./heavy-module.js');
  return heavyFunction();
};

// Intersection Observer für Lazy Loading
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      import('./feature-module.js').then(module => {
        module.initialize(entry.target);
      });
    }
  });
});

2. Web Workers für schwere Tasks

// main.js - Main Thread entlasten
const worker = new Worker('heavy-computation.js');
worker.postMessage({data: largeDataset});
worker.onmessage = (e) => {
  console.log('Ergebnis:', e.data);
  updateUI(e.data);
};

// heavy-computation.js - Web Worker
self.onmessage = function(e) {
  const result = performHeavyCalculation(e.data.data);
  self.postMessage(result);
};

3. Event-Handler optimieren

// Schlecht: Synchrone, schwere Berechnung
button.addEventListener('click', () => {
  const result = heavyCalculation(); // Blockiert Main Thread
  updateUI(result);
});

// Besser: Async mit RequestIdleCallback
button.addEventListener('click', () => {
  requestIdleCallback(() => {
    const result = heavyCalculation();
    updateUI(result);
  });
});

CLS optimieren (Cumulative Layout Shift)

CLS misst unerwartete Layout-Verschiebungen, die Nutzer frustrieren. Bilder ohne Dimensionen und nachladende Inhalte sind häufige Ursachen.

CLS-Probleme aufspüren

// Layout Shifts im Browser tracken
new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    if (!entry.hadRecentInput) {
      console.log('Layout Shift:', entry.value, entry.sources);
    }
  }
}).observe({type: 'layout-shift', buffered: true});

Häufige CLS-Verursacher

CLS-Optimierungsstrategien

1. Aspect-Ratio für Medien

/* CSS: Platz für Bilder reservieren */
.image-container {
  aspect-ratio: 16 / 9;
  width: 100%;
}

.image-container img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

2. Font-Loading optimieren

<!-- Preload wichtiger Fonts -->
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>

<style>
@font-face {
  font-family: 'MainFont';
  src: url('font.woff2') format('woff2');
  font-display: swap; /* FOUT statt FOIT */
}

body {
  font-family: 'MainFont', Arial, sans-serif;
}
</style>

3. Container für dynamische Inhalte

<!-- Feste Container für nachladende Inhalte -->
<div class="ad-container" style="height: 250px; background: #f0f0f0;">
  <!-- Ad wird hier geladen -->
</div>

<div class="cookie-banner-space" style="height: 80px;">
  <!-- Cookie-Banner reserviert Platz -->
</div>

Mess-Tools & Monitoring

Google-Tools

PageSpeed Insights

Zweck: Schnelle Core Web Vitals-Analyse
URL: pagespeed.web.dev
Vorteile: Real User Data + Lab Data

Lighthouse

Zweck: Detaillierte Performance-Audits
Zugang: Chrome DevTools (F12)
Vorteile: Konkrete Optimierungsvorschläge

Search Console

Zweck: Core Web Vitals-Report
URL: search.google.com/search-console
Vorteile: Real User Data für alle URLs

Erweiterte Monitoring-Tools

Web Vitals Extension

Browser: Chrome Extension
Zweck: Live-Monitoring beim Surfen
Ideal für: Kontinuierliche Überwachung

WebPageTest

URL: webpagetest.org
Zweck: Detaillierte Wasserfall-Analysen
Ideal für: Technische Deep-Dives

GTmetrix

URL: gtmetrix.com
Zweck: Performance + SEO-Analyse
Ideal für: Regelmäßige Überwachung

Real User Monitoring (RUM) implementieren

// Web Vitals Library einbinden
import {getLCP, getFID, getCLS} from 'web-vitals';

// Metriken an Analytics senden
function sendToAnalytics(metric) {
  gtag('event', metric.name, {
    value: Math.round(metric.name === 'CLS' ? metric.value * 1000 : metric.value),
    event_category: 'Web Vitals',
    event_label: metric.id,
    non_interaction: true,
  });
}

getLCP(sendToAnalytics);
getFID(sendToAnalytics);
getCLS(sendToAnalytics);

Technische Optimierungen

HTML-Optimierungen

<!DOCTYPE html>
<html lang="de">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  
  <!-- Critical CSS inline -->
  <style>/* Critical CSS hier */</style>
  
  <!-- Resource Hints -->
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="dns-prefetch" href="https://analytics.google.com">
  
  <!-- Preload wichtiger Assets -->
  <link rel="preload" href="hero.webp" as="image">
  <link rel="preload" href="main.woff2" as="font" type="font/woff2" crossorigin>
</head>

CSS-Performance

/* CSS-Container Queries für bessere Performance */
@container (min-width: 400px) {
  .card { 
    display: grid; 
    grid-template-columns: 1fr 1fr; 
  }
}

/* Contain für Layout-Isolation */
.article {
  contain: layout style paint;
}

/* Content-visibility für Offscreen-Inhalte */
.below-fold {
  content-visibility: auto;
  contain-intrinsic-size: 1000px;
}

JavaScript-Performance

// Moderne ES6+ Features nutzen
// Intersection Observer statt Scroll-Events
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // Element ist sichtbar - Aktion ausführen
      loadComponent(entry.target);
    }
  });
}, { threshold: 0.1 });

// RequestIdleCallback für non-kritische Tasks
requestIdleCallback(() => {
  // Schwere Berechnungen in idle Zeit
  preloadNextPage();
});

Bilder & Assets optimieren

Moderne Bildformate nutzen

<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg" alt="Hero Bild" width="800" height="400" loading="lazy">
</picture>

Responsive Images

<img src="image-800.webp"
     srcset="image-400.webp 400w,
             image-800.webp 800w,
             image-1200.webp 1200w"
     sizes="(max-width: 480px) 100vw,
            (max-width: 800px) 50vw,
            400px"
     alt="Produktbild"
     width="800"
     height="600"
     loading="lazy">

Asset-Optimierung Workflow

Empfohlener Build-Process:

  1. Bilder: Komprimierung mit imagemin oder squoosh
  2. CSS: Minification + Purging mit PurgeCSS
  3. JavaScript: Tree-shaking + Code-splitting
  4. Fonts: Subsetting auf verwendete Zeichen
  5. Gzip/Brotli: Server-Komprimierung aktivieren

Server-Performance verbessern

Caching-Strategien

# .htaccess - Apache Caching Headers
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType text/css "access plus 1 year"
  ExpiresByType application/javascript "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType image/webp "access plus 1 year"
  ExpiresByType text/html "access plus 1 hour"
</IfModule>

# Cache-Control Headers
<IfModule mod_headers.c>
  <FilesMatch "\.(css|js|png|jpg|webp|woff2)$">
    Header set Cache-Control "public, max-age=31536000, immutable"
  </FilesMatch>
</IfModule>

HTTP/2 & HTTP/3

CDN-Optimierung

Cloudflare

Vorteile: Auto-Minification, Polish, Rocket Loader
Performance: Global Edge-Network

AWS CloudFront

Vorteile: Lambda@Edge, Custom Headers
Integration: Perfekt für AWS-Stack

Performance-Checklist

✅ Core Web Vitals Checklist

LCP-Optimierung

  • □ Hero-Bilder in WebP/AVIF konvertiert
  • □ Critical CSS inline implementiert
  • □ Wichtige Ressourcen per rel="preload" geladen
  • □ Server Response Time < 200ms (TTFB)
  • □ Render-blocking CSS eliminiert

FID-Optimierung

  • □ JavaScript Code-Splitting implementiert
  • □ Third-Party-Scripts asynchron geladen
  • □ Web Workers für schwere Berechnungen
  • □ Event-Handler optimiert
  • □ Main Thread Blocking Time < 300ms

CLS-Optimierung

  • □ Aspect-Ratio für alle Bilder/Videos gesetzt
  • □ Font-Display: swap aktiviert
  • □ Reservierte Plätze für dynamische Inhalte
  • □ Keine DOM-Manipulation nach DOMContentLoaded
  • □ Layout-Shifts mit DevTools überprüft

Allgemeine Performance

  • □ Gzip/Brotli-Komprimierung aktiviert
  • □ HTTP/2 oder HTTP/3 konfiguriert
  • □ CDN für statische Assets
  • □ Browser-Caching optimiert
  • □ Real User Monitoring implementiert

🎯 Zielwerte für 2025

  • LCP: < 2,0 Sekunden (Mobile: < 2,5 Sek.)
  • FID: < 50ms (bald INP: < 200ms)
  • CLS: < 0,05 (Visual Stability)
  • Performance Score: > 90 (Lighthouse)
  • TTFB: < 200ms (Server Response)

"Performance ist kein Feature – es ist die Grundlage für alle anderen Features. Eine Website, die nicht schnell lädt, wird nicht genutzt."

– Addy Osmani, Google Chrome Team

Benötigen Sie Hilfe bei der Performance-Optimierung Ihrer Website? Kontaktieren Sie mich für eine professionelle Core Web Vitals-Analyse und Umsetzung.