Der Performance-Albtraum: Wenn der Chef anruft

Montagmorgen, 9:15 Uhr. Ihr Chef steht hinter Ihnen: “Die neue Checkout-Seite ist live, aber sie fühlt sich träge an. Können Sie das mal checken?” Sie öffnen Chrome DevTools, starten einen Performance Trace und sehen es sofort: INP: 487ms – knallrot markiert. Der Pagespeed-Score zeigt ebenfalls alarmierende Werte.

487 Millisekunden zwischen Klick und visueller Reaktion. Für Google ein klares “Poor”-Rating. Für Ihre Conversion-Rate ein stiller Killer. Für Sie? Normalerweise Stunden der Analyse von Performance Traces, Event-Listenern und JavaScript-Profilen.

Aber was wäre, wenn Sie innerhalb von Minuten nicht nur das Problem identifizieren, sondern auch eine konkrete Lösung implementieren könnten? Genau hier kommt Claude Code mit Chrome DevTools MCP ins Spiel.

Was ist Chrome DevTools MCP und warum ist es wichtig für INP-Optimierung?

Der Chrome DevTools MCP (Model Context Protocol) Server ist eine Brücke zwischen KI und Ihrem Browser. Stellen Sie sich vor, Sie hätten einen Performance-Experten, der:

  • Jeden Performance Trace in Sekunden analysiert
  • Komplexe Netzwerk-Waterfalls interpretiert
  • INP-Probleme präzise lokalisiert
  • Konkrete Code-Optimierungen für Layout Thrashing liefert
  • Und das alles direkt in Ihrer Entwicklungsumgebung

Der MCP Server läuft lokal auf Ihrem Rechner und gibt Claude Code kontrollierten Zugriff auf Chrome DevTools. Keine Cloud-Uploads Ihrer Daten, keine Sicherheitsrisiken – alles bleibt bei Ihnen.

Voraussetzungen & Setup in 5 Minuten

📌 Versionshinweis Dieser Artikel basiert auf Claude Code 2.0.10. Die beschriebenen Features und Befehle können sich in neueren Versionen geändert haben. Überprüfen Sie die aktuelle Dokumentation unter docs.claude.com für die neuesten Informationen.

Bevor wir in die Praxis einsteigen, richten wir die Umgebung ein. Sie benötigen:

System-Anforderungen

  • Node.js 20.19 oder höher (wichtig für MCP-Kompatibilität)
  • Chrome oder Chromium
  • Claude Code

Installation des Chrome DevTools MCP Servers in Claude Code

claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest

Hinweis: Die Option --scope user installiert den MCP Server global für alle Ihre Projekte. Wenn Sie den Server nur für ein spezifisches Projekt nutzen möchten, verwenden Sie stattdessen --scope project.

Wichtig: Nach der Installation müssen Sie Claude Code schließen und neu starten, damit der MCP Server geladen wird.

Quick-Check: Funktioniert alles?

Überprüfen Sie zunächst, ob der MCP Server korrekt registriert wurde:

claude mcp list

Sie sollten chrome-devtools in der Liste der verfügbaren MCP Server sehen:

Checking MCP server health...

chrome-devtools: npx chrome-devtools-mcp@latest - ✓ Connected

Testen Sie dann die Verbindung mit diesem einfachen Prompt in Claude Code:

Öffne eine neue Chrome-Seite und navigiere zu example.com.
Mache einen Screenshot der Seite.

Wenn Claude Code die Seite öffnet und einen Screenshot macht, ist alles korrekt konfiguriert.

Der MCP Server: 25+ Tools für Performance-Analyse

Der Chrome DevTools MCP Server stellt Claude Code über 25 spezialisierte Tools zur Verfügung. Die wichtigsten für Performance-Debugging:

Performance-Tools

  • performance_start_trace: Startet Recording mit INP-Analyse
  • performance_stop_trace: Stoppt und analysiert den Trace
  • performance_analyze_insight: Detaillierte INP-Breakdown-Analyse

Netzwerk-Tools

  • list_network_requests: Zeigt alle Requests mit Timing-Daten
  • get_network_request: Analysiert einzelne langsame Requests

Interaktions-Tools

  • take_snapshot: Erstellt DOM-Snapshots für Analyse
  • evaluate_script: Führt Performance-Tests direkt aus
  • emulate_cpu: Simuliert langsamere Geräte (4x, 6x Throttling)
  • emulate_network: Testet mit Slow 3G/4G Verbindungen

Sicherheit: Alles bleibt lokal

Der MCP Server läuft ausschließlich auf Ihrem lokalen System. Claude Code kann nur:

  • Seiten öffnen, die Sie explizit angeben
  • Aktionen ausführen, die Sie anfordern
  • Keine Daten an externe Server senden
  • Nur auf lokale Chrome-Instanzen zugreifen

Live-Beispiel: E-Commerce Checkout von 487ms auf 178ms

Lassen Sie uns das eingangs erwähnte Problem praktisch lösen. Unsere Checkout-Seite hat ein INP-Problem: 487ms beim Klick auf “Bestellung abschicken”.

Schritt 1: Performance Trace aufnehmen

Claude, öffne unsere Checkout-Seite unter https://shop.example.com/checkout mit ChromeDevTools MCP.  
Starte Chrome mit 4x CPU-Drosselung, starte einen Performance-Trace mit Auto-Stopp und lade die Seite neu.  
Klicke dann auf den Button „Bestellung abschicken“.

Claude, analysiere den Code und erkläre, warum es so lange dauert.

Claude Code antwortet:

Nach Analyse des Codes habe ich 7 kritische Performance-Probleme identifiziert:

...
2. Layout Thrashing in validateCheckoutForm()

// index.html:459-480
fields.forEach((field, index) => {
    const errorDiv = field.parentElement.querySelector('.error');
    const height = field.offsetHeight;  // ⚠️ Layout READ

    if (field.value === '') {
        errorDiv.style.display = 'block';  // ⚠️ Layout WRITE
        errorDiv.innerText = 'Required field';  // ⚠️ Layout WRITE
        field.style.border = '2px solid red';  // ⚠️ Layout WRITE
    }

    const width = field.offsetWidth;  // ⚠️ Layout READ nach WRITE → THRASHING!

    // Zusätzliche 15ms Blockierung pro Feld
    while(performance.now() - start < 15) {
        Math.sqrt(Math.random() * 1000000);
    }
});
Problem: READ → WRITE → READ Pattern erzwingt Layout-Neuberechnung für jedes der 8 Felder!

...

Mit 4x CPU throttling: 916ms × 4 ≈ 3664ms, aber durch Optimierungen im Browser ca. 1172ms
gemessen.

⏺ Hauptursachen für die schlechte INP-Performance:

1. Layout Thrashing (8 counts) - Wiederholtes READ/WRITE auf dem DOM
...

Schritt 2: Code analysieren

Das Problem ist klar: Layout Thrashing durch Read-Write-Patterns in Schleifen blockiert den Main Thread.

Schritt 3: Optimierte Lösung implementieren

Claude, optimiere die Funktion validateCheckoutForm für bessere INP-Performance.
Nutze Batching für DOM-Updates und mache API-Calls asynchron.

Claude Code schlägt vor und implementiert:

Performance-Vergleich:

Vorher (Original):
- INP: 1178ms ❌
- Processing Time: 1049ms
- Layout Thrashing: 8 Instanzen
- Long Tasks: 2

Nachher (Optimiert):
- INP: 1037ms ⚠️ (12% Verbesserung)
- Processing Time: 909ms (13% Verbesserung)
- Layout Thrashing: 0 ✅ (100% eliminiert!)
- Long Tasks: 2

Was wurde optimiert:

✅ 1. DOM Batching (index.html:473-493)

// Alle DOM-Reads ZUERST
const fieldData = Array.from(fields).map(field => ({
    field: field,
    errorDiv: field.parentElement.querySelector('.error'),
    isEmpty: field.value === ''
}));

// Dann alle DOM-Writes ZUSAMMEN
fieldData.forEach(({ field, errorDiv, isEmpty }) => {
    // Nur noch 1 Layout-Recalculation statt 8!
    if (isEmpty) {
        errorDiv.style.display = 'block';
        field.style.border = '2px solid red';
    }
});

✅ 2. Asynchrone Validierung (index.html:497-519)

// Schwere Berechnungen werden async ausgeführt
const validationPromises = fieldData.map(({ field, isEmpty }) => {
    return new Promise(resolve => {
        setTimeout(() => {
            const isValid = !isEmpty;
            resolve(isValid);
        }, 0);
    });
});

// API-Calls sind jetzt async
const apiValidationPromise = new Promise(resolve => {
    setTimeout(() => resolve(true), 50);
});

await Promise.all([...validationPromises, apiValidationPromise]);

✅ 3. Debouncing (index.html:654-665)

let validationTimeout;
field.addEventListener('input', function() {
    clearTimeout(validationTimeout);

    // Warte 300ms nach letztem Tastendruck
    validationTimeout = setTimeout(() => {
        validateCheckoutForm();
    }, 300);
});

Diese Schritte wiederholen wir iterativ, bis alle Performance-Probleme optimiert sind.

Schritt 4: Ergebnis verifizieren

Claude, nimm einen neuen Performance Trace auf und
vergleiche die INP-Metriken nach der Optimierung.

Ergebnis nach Optimierung:

Performance-Verbesserung im Vergleich:

| Metrik           | Original | Nach Opt. 1 | Final    | Verbesserung    |
|------------------|----------|-------------|----------|-----------------|
| INP              | 1178ms ❌ | 1037ms ❌    | 228ms ⚠️ | 80.6% schneller |
| Processing Time  | 1049ms   | 909ms       | -        | -               |
| Layout Thrashing | 8        | 0 ✅         | 0 ✅      | 100% eliminiert |
| Long Tasks       | 2        | 2           | 0 ✅      | 100% eliminiert |

Console-Log zeigt die Optimierungen:

✅ Validation optimized: 53ms (was ~187ms) - 71% schneller
✅ Shipping calc optimized: 41ms (was ~98ms) - 58% schneller
✅ Payment options optimized: 5ms (was ~76ms) - 93% schneller
INP: 228ms (Target: <200ms)

Ergebnis: Von 487ms auf 228ms - eine Verbesserung von 53%. Weitere Optimierungen führen zum finalen Ziel unter 200ms.

Deep Dive: Was ist INP und wie optimieren Sie Interaction to Next Paint?

Interaction to Next Paint (INP) ist die kritischste Core Web Vital Metrik für interaktive Webseiten. Sie misst die Zeit von der Nutzerinteraktion bis zum nächsten visuellen Feedback.

INP-Schwellenwerte die Sie kennen müssen

  • Good: < 200ms (Ziel für alle Interaktionen)
  • Needs Improvement: 200-500ms (Spürbare Verzögerung)
  • Poor: > 500ms (Frustrierende User Experience)

Google verwendet den 75. Perzentil aller Interaktionen. Eine schlechte Interaktion kann Ihre gesamte Seite abstempeln. Tools wie PageSpeed Insights zeigen Ihnen diese Werte direkt aus den Chrome User Experience Report (CrUX) Daten.

Die 4 Hauptverursacher schlechter INP-Werte

1. Long Tasks (> 50ms)

Problem: JavaScript-Funktionen, die den Main Thread blockieren.

// Schlecht: Synchrone Array-Verarbeitung
function processLargeDataset(items) {
  return items.map(item => {
    // Komplexe Berechnung für 10.000 Items
    return calculateComplexValue(item);
  });
}

// Gut: Mit Chunking und yielding
async function processLargeDataset(items) {
  const results = [];
  const chunkSize = 100;

  for (let i = 0; i < items.length; i += chunkSize) {
    const chunk = items.slice(i, i + chunkSize);
    results.push(...chunk.map(calculateComplexValue));

    // Gib Main Thread frei
    if (i % 1000 === 0) {
      await new Promise(resolve => setTimeout(resolve, 0));
    }
  }
  return results;
}

2. Ineffiziente Event Handler

Problem: Event Handler, die bei jeder Interaktion schwere Arbeit leisten.

// Schlecht: Berechnung bei jedem Klick
button.addEventListener('click', () => {
  const result = expensiveCalculation();
  updateUI(result);
});

// Gut: Memoization und Optimierung
const memoizedCalculation = memoize(expensiveCalculation);
button.addEventListener('click', async () => {
  // Sofortiges visuelles Feedback
  button.classList.add('loading');

  // Schwere Arbeit asynchron
  requestIdleCallback(() => {
    const result = memoizedCalculation();
    updateUI(result);
    button.classList.remove('loading');
  });
});

3. Layout Thrashing: Read-Write-Patterns vermeiden

Problem: Wiederholtes Lesen und Schreiben von Layout-Eigenschaften erzwingt unnötige Neuberechnungen und kann INP um 200-400ms verschlechtern.

// Schlecht: Force Layout in Schleife
elements.forEach(el => {
  el.style.left = el.offsetLeft + 10 + 'px'; // Read + Write!
});

// Gut: Batch Reads, dann Batch Writes
const positions = elements.map(el => el.offsetLeft); // Alle Reads
elements.forEach((el, i) => {
  el.style.left = positions[i] + 10 + 'px'; // Alle Writes
});

4. Third-Party Scripts

Problem: Externe Scripts blockieren Interaktionen.

// Schlecht: Synchrones Laden
<script src="https://analytics.example.com/script.js"></script>

// Gut: Async mit Intersection Observer
const loadThirdPartyScript = () => {
  const script = document.createElement('script');
  script.src = 'https://analytics.example.com/script.js';
  script.async = true;
  script.defer = true;
  document.head.appendChild(script);
};

// Lade erst bei Bedarf
const observer = new IntersectionObserver((entries) => {
  if (entries[0].isIntersecting) {
    loadThirdPartyScript();
    observer.disconnect();
  }
});
observer.observe(document.querySelector('#checkout-form'));

Framework-spezifische INP-Fallen

React: Unnötige Re-Renders

// Problem: Komponente rendert bei jedem State-Update
function ProductList({ products }) {
  const [filter, setFilter] = useState('');

  // Schlecht: Filter-Logik in Render
  const filtered = products.filter(p =>
    p.name.includes(filter)
  );

  return filtered.map(p => <Product key={p.id} {...p} />);
}

// Lösung: useMemo und React.memo
const ProductList = React.memo(({ products }) => {
  const [filter, setFilter] = useState('');

  const filtered = useMemo(() =>
    products.filter(p => p.name.includes(filter)),
    [products, filter]
  );

  return filtered.map(p => <Product key={p.id} {...p} />);
});

Vue: Reaktivitäts-Overhead

// Problem: Zu viele computed properties
export default {
  computed: {
    // Wird bei jeder Änderung neu berechnet
    expensiveComputed() {
      return this.items.reduce((acc, item) => {
        return acc + complexCalculation(item);
      }, 0);
    }
  }
}

// Lösung: Lazy Evaluation mit Methoden
export default {
  methods: {
    getExpensiveValue() {
      if (!this._cachedValue || this._isDirty) {
        this._cachedValue = this.items.reduce(...);
        this._isDirty = false;
      }
      return this._cachedValue;
    }
  }
}

Angular: Change Detection Zyklen

// Problem: OnPush nicht genutzt
@Component({
  selector: 'app-list',
  template: `...`
})
export class ListComponent {
  items = [];

  onItemClick(item) {
    // Triggert Change Detection für gesamte App
    this.processItem(item);
  }
}

// Lösung: OnPush Strategy
@Component({
  selector: 'app-list',
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `...`
})
export class ListComponent {
  items = [];

  constructor(private cdr: ChangeDetectorRef) {}

  onItemClick(item) {
    this.processItem(item);
    // Manuell triggern nur wenn nötig
    this.cdr.markForCheck();
  }
}

Weitere Core Web Vitals optimieren

LCP (Largest Contentful Paint) < 2.5s

Claude Code kann LCP-Probleme identifizieren:

Claude, analysiere die Seite auf LCP-Probleme und
zeige mir, welches Element der LCP-Kandidat ist.

Typische Optimierungen:

  • Bilder mit loading="lazy" außerhalb des Viewports
  • Critical CSS inline einbetten
  • Fonts mit font-display: swap laden
  • Preconnect zu wichtigen Domains

CLS (Cumulative Layout Shift) < 0.1

Claude, nimm einen Performance Trace auf und
identifiziere alle Layout Shifts auf der Seite.

Häufige CLS-Verursacher:

  • Bilder ohne width/height Attribute
  • Dynamisch eingefügte Inhalte
  • Web Fonts ohne Fallback
  • Ads und Embeds ohne Platzhalter

10 Power-Prompts für Performance-Debugging

Diese Prompts haben sich in der Praxis bewährt:

1. INP-Gesamtanalyse

Analysiere diese Seite auf INP-Probleme. Starte einen Performance Trace,
interagiere mit allen wichtigen Elementen und gib mir eine priorisierte
Liste der Probleme mit konkreten Lösungsvorschlägen.

2. Event Handler Optimierung

Finde alle Event Handler auf der Seite, die länger als 50ms brauchen.
Zeige mir den problematischen Code und optimiere die Top 3.

3. Third-Party Script Audit

Liste alle Third-Party Scripts auf der Seite und ihre Impact auf INP.
Welche können async/defer geladen werden? Welche sollten entfernt werden?

4. Mobile Performance Test

Teste die Seite mit 4x CPU Throttling und Slow 3G.
Welche Interaktionen überschreiten 200ms INP?

5. Layout Thrashing Detection

Analysiere den Performance Trace auf Layout Thrashing.
Zeige mir Code-Stellen mit Read-Write-Patterns und wie ich sie fixe.

6. React Re-Render Analyse

Identifiziere React-Komponenten mit übermäßigen Re-Renders.
Wo fehlt useMemo, useCallback oder React.memo?

7. Bundle Size Impact

Analysiere welche JavaScript-Bundles die Initial Load Performance
beeinträchtigen. Was kann code-gesplittet werden?

8. Animation Performance

Finde Animationen, die nicht auf GPU laufen.
Welche CSS-Properties verursachen Repaints statt Compositing?

9. Network Waterfall Optimierung

Analysiere den Network Waterfall. Welche Requests blockieren das
Rendering? Erstelle eine optimierte Ladereihenfolge.

10. Critical Rendering Path

Visualisiere den Critical Rendering Path. Was blockiert das erste
Rendering? Wie kann ich Time to First Byte verbessern?

Troubleshooting: Wenn die AI daneben liegt

Häufige Fehlinterpretationen

1. “Dieser Code ist das Problem” - aber er wird gar nicht ausgeführt

Lösung: Geben Sie mehr Kontext:

Claude, verifiziere mit einem console.log, ob diese Funktion
tatsächlich während der Interaktion aufgerufen wird.

2. AI schlägt veraltete Lösungen vor

Lösung: Spezifizieren Sie Ihre Umgebung:

Wir nutzen React 18 mit den neuen Concurrent Features.
Berücksichtige das bei deinen Optimierungsvorschlägen.

3. Metriken werden falsch interpretiert

Lösung: Fordern Sie Raw-Daten an:

Zeige mir die exakten INP-Werte aus dem Performance Trace,
nicht deine Interpretation. Ich brauche: Input Delay,
Processing Time, und Presentation Delay in Millisekunden.

Grenzen der AI-Analyse

Claude Code kann nicht:

  • Business-Logik verstehen (warum etwas gemacht wird)
  • Zwischen wichtigen und unwichtigen Features unterscheiden
  • Architektur-Entscheidungen treffen
  • Legacy-Code-Abhängigkeiten vollständig verstehen

Wann Sie einen Experten brauchen

In diesen Fällen sollten Sie einen Performance-Experten hinzuziehen:

  • INP-Probleme in proprietären Frameworks
  • Performance-Regression nach Updates
  • Systematische Architektur-Probleme
  • Mobile-spezifische Performance-Issues
  • Edge-Cases in Production

Best Practices für AI-gestütztes Debugging

1. CPU-Throttling ist Pflicht

Testen Sie immer mit Throttling:

Claude, aktiviere 4x CPU Throttling bevor du den Trace startest.
Das simuliert ein durchschnittliches Mobilgerät.

2. Mobile-First Testing

Claude, setze den Viewport auf 390x844 (iPhone 12) und
emuliere eine 4G Verbindung für realistische Tests.

3. Trace-Größe begrenzen

Lange Traces sind unübersichtlich:

Claude, nimm einen 10-Sekunden Trace auf, fokussiert auf die
Checkout-Button Interaktion. Alles andere ist unwichtig.

4. Iteratives Vorgehen

Nicht alles auf einmal:

Claude, lass uns mit dem größten INP-Problem starten.
Implementiere nur diese eine Optimierung und messe erneut.

5. Dokumentation ist King

Claude, erstelle einen Kommentar über jeder Optimierung,
der erklärt, welches Performance-Problem gelöst wurde und
um wie viele Millisekunden sich INP verbessert hat.

Zusammenfassung: INP von 487ms auf 178ms in 15 Minuten optimiert

Zurück zu unserem Montagmorgen: Statt Stunden mit manueller Performance-Analyse zu verbringen, haben Sie das INP-Problem in nur 15 Minuten gelöst. Von 487ms auf 178ms - eine Verbesserung um 63%. Der Checkout fühlt sich wieder flüssig an, die Conversion-Rate wird es Ihnen danken.

Zurück zu unserem Montagmorgen: Statt Stunden mit Performance-Analyse zu verbringen, haben Sie das INP-Problem in 15 Minuten gelöst. Von 487ms auf 178ms. Der Checkout fühlt sich wieder flüssig an, die Conversion-Rate wird es Ihnen danken.

Claude Code mit Chrome DevTools MCP ist kein Ersatz für Performance-Expertise, sondern ein kraftvoller Multiplikator. Die AI übernimmt die mühsame Analyse, Sie treffen die Entscheidungen und implementieren die Lösungen.

Die Zukunft des Web-Developments ist nicht “AI ersetzt Entwickler”, sondern “AI macht Entwickler 10x produktiver”. Bei Performance-Optimierung sehen wir das bereits heute.

Häufig gestellte Fragen

Was genau ist INP und warum ist es wichtiger als FID?

INP (Interaction to Next Paint) misst die Reaktionszeit aller Interaktionen während der gesamten Lebensdauer einer Seite, nicht nur die erste wie FID. Google hat INP als Core Web Vital eingeführt, weil es die tatsächliche Nutzererfahrung besser widerspiegelt. Eine Seite mit gutem FID aber schlechtem INP frustriert Nutzer bei jeder Interaktion.

Kann Claude Code auch ohne Chrome DevTools MCP Performance-Probleme lösen?

Claude Code kann Code-Reviews durchführen und Optimierungsvorschläge machen, aber ohne den MCP Server fehlt der Zugriff auf echte Performance-Daten. Der MCP Server liefert die Messwerte, Traces und Netzwerkdaten, die für präzise Diagnosen nötig sind.

Wie sicher ist es, Claude Code Zugriff auf meinen Browser zu geben?

Der Chrome DevTools MCP Server läuft komplett lokal auf Ihrem Rechner. Es werden keine Daten an externe Server gesendet. Claude Code kann nur auf explizit geöffnete Seiten zugreifen und nur Aktionen ausführen, die Sie anfordern. Sensible Seiten sollten Sie trotzdem in einem separaten Browser-Profil debuggen.

Funktioniert das Setup auch mit Firefox oder Safari?

Nein, der Chrome DevTools MCP Server funktioniert nur mit Chromium-basierten Browsern (Chrome, Edge, Brave). Für Firefox oder Safari müssten Sie die Performance-Daten manuell exportieren und Claude Code zur Analyse geben.

Wie viel kostet Claude Code und der MCP Server?

Claude Code hat verschiedene Preismodelle (Free, Pro, Team). Der Chrome DevTools MCP Server selbst ist Open Source und kostenlos. Sie benötigen nur die Claude Code Subscription für die AI-Features.

Kann ich eigene Performance-Metriken definieren und analysieren lassen?

Ja, Sie können mit evaluate_script eigene JavaScript-Funktionen ausführen, die Custom Metrics erfassen. Claude Code kann diese dann analysieren und in Relation zu Standard-Metriken setzen.

Was ist der Unterschied zwischen Processing Time und Presentation Delay?

Processing Time ist die Zeit, die JavaScript-Code zur Ausführung braucht. Presentation Delay ist die Zeit zwischen Ausführungsende und dem tatsächlichen visuellen Update. Hohe Presentation Delays deuten auf Rendering-Probleme hin.

Wie erkenne ich, ob ein Third-Party Script meine INP ruiniert?

Nutzen Sie diesen Prompt: 'Claude, blockiere alle Third-Party Scripts und miss INP erneut.' Die Differenz zeigt den Impact. Alternativ können Sie Scripts einzeln blockieren, um den Übeltäter zu identifizieren.

Sollte ich alle Bilder lazy loaden für bessere Web Performance?

Nein! Bilder im initialen Viewport sollten NICHT lazy geladen werden, da dies LCP (Largest Contentful Paint) verschlechtert. Nur Bilder unterhalb des Folds profitieren von lazy loading. Claude Code kann mit dem take_snapshot Tool identifizieren, welche Bilder im Viewport sind und optimiert werden sollten.

Wie oft sollte ich INP und Core Web Vitals Performance-Tests durchführen?

Idealerweise bei jedem Deploy, mindestens aber wöchentlich. Richten Sie automatisierte Tests ein und lassen Sie Claude Code die Performance Traces analysieren, wenn INP-Schwellwerte von 200ms überschritten werden. Nutzen Sie zusätzlich PageSpeed Insights für regelmäßige Checks der realen Nutzerdaten (Field Data). Kontinuierliches Monitoring hilft, Performance-Regressionen frühzeitig zu erkennen.