Back

So optimieren Sie Bilder in Next.js für maximale Performance

So optimieren Sie Bilder in Next.js für maximale Performance

Bilder machen oft 50-70% der Gesamtgröße einer Webseite aus und haben direkten Einfluss auf Core Web Vitals-Metriken wie Largest Contentful Paint (LCP) und Cumulative Layout Shift (CLS). Eine schlechte Bildverwaltung kann Ihre Lighthouse-Scores verschlechtern, die Absprungrate erhöhen und Ihr SEO-Ranking beeinträchtigen – selbst wenn Ihr JavaScript perfekt optimiert ist.

Dieser Leitfaden behandelt die Bildoptimierung in Next.js mithilfe der integrierten next/image-Komponente, von der grundlegenden Implementierung bis hin zur fortgeschrittenen CDN-Integration und Caching-Strategien. Sie lernen, wie Sie responsive, schnell ladende Bilder bereitstellen, die sowohl Performance-Metriken als auch die Benutzererfahrung verbessern.

Die wichtigsten Erkenntnisse

  • Die next/image-Komponente konvertiert Bilder automatisch in moderne Formate wie WebP und AVIF und reduziert dadurch die Dateigröße um 25-35%
  • Eine korrekte Bildoptimierung kann den LCP um 50% verbessern und die Bandbreitenkosten um 60% senken
  • Die Verwendung des priority-Props für above-the-fold Bilder und die Konfiguration responsiver Größen verhindert Layout-Verschiebungen
  • Custom Loader ermöglichen die Integration mit spezialisierten Bild-CDNs für Anwendungen mit hohem Traffic

Warum die next/image-Komponente für die Performance wichtig ist

Die next/image-Komponente ist nicht nur ein Wrapper um das HTML-<img>-Tag – sie ist eine automatisierte Optimierungs-Pipeline, die die schwere Arbeit der modernen Bildauslieferung übernimmt.

Zentrale Performance-Features

Automatische Formatkonvertierung: Next.js liefert WebP- und AVIF-Formate aus, wenn Browser diese unterstützen, und reduziert die Dateigröße um 25-35% im Vergleich zu JPEG/PNG ohne Qualitätsverlust.

Responsive Bildgenerierung: Die Komponente erstellt mehrere Bildgrößen zur Build-Zeit oder on-demand und stellt sicher, dass mobile Nutzer keine Desktop-großen Bilder herunterladen.

Integriertes Lazy Loading: Bilder unterhalb des sichtbaren Bereichs laden erst, wenn Nutzer in ihre Nähe scrollen, was das initiale Seitengewicht reduziert und den First Contentful Paint (FCP) verbessert.

Verhinderung von Layout-Verschiebungen: Durch die Anforderung von width- und height-Props (oder die Verwendung des fill-Props) reserviert die Komponente Platz, bevor Bilder geladen werden, und eliminiert so CLS-Probleme.

Grundlegende Implementierung und essenzielle Props

Beginnen Sie mit einer einfachen Implementierung, die 80% der Anwendungsfälle abdeckt:

import Image from 'next/image'

export default function Hero() {
  return (
    <Image
      src="/hero-banner.jpg"
      alt="Product showcase"
      width={1200}
      height={600}
      priority // Sofort laden für LCP-Optimierung
    />
  )
}

Wann Sie wichtige Props verwenden sollten

priority: Fügen Sie dies zu above-the-fold Bildern hinzu, die den LCP beeinflussen. Es deaktiviert Lazy Loading und fügt einen Preload-Link hinzu. Verwenden Sie es sparsam – nur für 1-2 kritische Bilder pro Seite.

sizes: Essenziell für responsive Bilder. Teilt dem Browser mit, welche Bildgröße basierend auf der Viewport-Breite heruntergeladen werden soll:

<Image
  src="/product.jpg"
  alt="Product"
  width={800}
  height={600}
  sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 800px"
/>

placeholder=“blur”: Zeigt einen niedrig aufgelösten Platzhalter an, während das Hauptbild lädt. Bei statischen Imports generiert Next.js die blurDataURL automatisch:

import heroImage from '@/public/hero.jpg'

<Image
  src={heroImage}
  alt="Hero"
  placeholder="blur"
  // blurDataURL wird automatisch für statische Imports generiert
/>

Konfiguration von Remote-Bildern mit remotePatterns

Für Bilder aus externen Quellen konfigurieren Sie remotePatterns in next.config.js (die ältere domains-Einstellung ist veraltet):

// next.config.js
module.exports = {
  images: {
    remotePatterns: [
      {
        protocol: 'https',
        hostname: 'cdn.example.com',
        pathname: '/images/**',
      },
    ],
  },
}

Diese Sicherheitsfunktion verhindert bösartige Bildanfragen und erlaubt gleichzeitig spezifische externe Quellen.

Fortgeschrittene Optimierung mit CDNs und Custom Loadern

Für Anwendungen mit hohem Traffic integrieren Sie spezialisierte Bild-CDNs wie Cloudinary oder Imgix mithilfe von Custom Loadern:

// lib/imageLoader.js
export default function cloudinaryLoader({ src, width, quality }) {
  const params = ['f_auto', 'c_limit', `w_${width}`, `q_${quality || 'auto'}`]
  return `https://res.cloudinary.com/demo/image/upload/${params.join(',')}/${src}`
}

// Verwendung in der Komponente
<Image
  loader={cloudinaryLoader}
  src="product.jpg"
  alt="Product"
  width={400}
  height={300}
/>

Caching-Strategie für optimale Performance

Next.js setzt standardmäßig aggressive Cache-Header:

Cache-Control: public, max-age=31536000, immutable

Für dynamische Inhalte überschreiben Sie diese in next.config.js:

module.exports = {
  async headers() {
    return [
      {
        source: '/_next/image(.*)',
        headers: [
          {
            key: 'Cache-Control',
            value: 'public, max-age=86400, stale-while-revalidate=604800',
          },
        ],
      },
    ]
  },
}

Best Practices für den Produktivbetrieb

Messen Sie die Auswirkungen mit echten Daten: Verwenden Sie Lighthouse und WebPageTest, um LCP-Verbesserungen zu verfolgen. Ein korrekt optimiertes Hero-Bild kann den LCP um 1-2 Sekunden reduzieren.

Balancieren Sie Qualität und Dateigröße: Setzen Sie quality={75} als Ausgangspunkt. Testen Sie die visuelle Qualität gegen Dateigrößeneinsparungen – ein Absenken von 100 auf 75 spart oft 40% bei minimaler visueller Beeinträchtigung.

Behandeln Sie verschiedene Bildtypen angemessen: Verwenden Sie unoptimized für SVGs und bereits optimierte Assets:

<Image
  src="/logo.svg"
  alt="Logo"
  width={200}
  height={50}
  unoptimized
/>

TypeScript für Typsicherheit: Importieren Sie Bilder für automatische Dimensionserkennung und Type Checking:

import type { StaticImageData } from 'next/image'
import productImage from '@/public/product.jpg'

interface ProductCardProps {
  image: StaticImageData
  alt: string
}

Häufige Probleme und deren Behebung

Fehler “Invalid src prop”: Stellen Sie sicher, dass Remote-Domains in remotePatterns konfiguriert sind oder verwenden Sie einen Custom Loader.

Verschwommene Bilder auf High-DPI-Displays: Überprüfen Sie, dass Quellbilder mindestens 2x so groß wie die Anzeigegröße sind, und vermeiden Sie aggressive Qualitätseinstellungen unter 70.

Erhöhte Build-Zeiten: Bei Websites mit Hunderten von Bildern sollten Sie On-Demand-Optimierung statt Build-Zeit-Verarbeitung in Betracht ziehen oder einen Custom Loader mit einem externen Service implementieren.

Fazit

Die Bildoptimierung in Next.js durch die next/image-Komponente bietet sofortige Performance-Gewinne mit minimaler Konfiguration. Beginnen Sie mit den Grundlagen – korrekte Dimensionierung, Lazy Loading und Formatkonvertierung – und fügen Sie dann fortgeschrittene Techniken wie CDN-Integration und Custom Loader hinzu, wenn Ihr Traffic skaliert.

Der Schlüssel liegt darin, die realen Auswirkungen zu messen: Korrekt optimierte Bilder können den LCP um 50% verbessern, die Bandbreitenkosten um 60% senken und Ihre Core Web Vitals-Scores signifikant steigern. Konzentrieren Sie sich zuerst auf Ihre above-the-fold Bilder und optimieren Sie dann systematisch den Rest Ihrer Bild-Pipeline.

Häufig gestellte Fragen (FAQs)

Nein, Sie müssen erlaubte Domains in next.config.js mithilfe von remotePatterns aus Sicherheitsgründen konfigurieren. Dies verhindert, dass böswillige Akteure Ihre Anwendung als Bild-Proxy verwenden. Sie können dies auch mit Custom Loadern umgehen.

Quellbilder sollten mindestens 2x so groß wie die Anzeigegröße für High-DPI-Bildschirme sein. Überprüfen Sie auch, ob Ihre Qualitätseinstellung nicht zu niedrig ist. Eine Qualität von 75-85 bietet normalerweise die beste Balance zwischen Dateigröße und visueller Klarheit.

Nein, verwenden Sie priority nur für 1-2 kritische above-the-fold Bilder, die den LCP beeinflussen. Eine übermäßige Verwendung macht den Zweck des Lazy Loadings zunichte und kann die Performance tatsächlich verschlechtern, indem zu viele Bilder gleichzeitig geladen werden.

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay