sizes, Priority und der Weg zu gutem LCP
Die next/image Komponente generiert automatisch responsive Bildvarianten, moderne Formate und Lazy Loading, löst aber nicht jedes Performanceproblem von selbst. Wer sizes korrekt konfiguriert, Priority gezielt für das Largest-Contentful-Paint-Element setzt und Remote Patterns sauber pflegt, holt aus der Next.js Image Optimierung tatsächlich das volle Potenzial heraus.
Inhaltsverzeichnis
- 1. Warum Bildoptimierung Performance entscheidet
- 2. next/image Komponente: Funktionsweise im Detail
- 3. Responsive Bilder mit sizes und srcset richtig konfigurieren
- 4. Priority, Lazy Loading und Largest Contentful Paint
- 5. Externe Bilder und Remote Patterns konfigurieren
- 6. Eigener Image Loader für CDN Integration
- 7. Placeholder-Strategien: Blur und Shimmer
- 8. Grenzen der next/image Optimierung
- 9. next/image im Vergleich zu klassischem img
- 10. Zusammenfassung
- 11. FAQ
1. Warum Bildoptimierung Performance entscheidet
Bilder sind in den meisten Webseiten die größten einzelnen Ressourcen und beeinflussen damit direkt die wichtigste Core-Web-Vitals-Metrik, den Largest Contentful Paint. Ohne systematische Next.js Image Optimierung lädt der Browser oft ein Bild in voller Auflösung, selbst wenn es nur als kleine Vorschau auf einem Mobilgerät angezeigt wird, was Bandbreite verschwendet und die wahrgenommene Ladezeit unnötig verlängert. Die next/image-Komponente wurde genau für dieses Problem entwickelt: automatische Größenanpassung, moderne Bildformate und eingebautes Lazy Loading, ohne dass Entwickler jede Optimierung manuell implementieren müssen.
Der Kern der Next.js Image Optimierung ist ein serverseitiger Optimierungsprozess, der beim ersten Request ein Bild in der passenden Größe und im passenden Format generiert und anschließend cached. Statt eines einzelnen, immer gleich großen Bildes liefert Next.js abhängig von Viewport-Breite und Pixeldichte des jeweiligen Geräts eine passende Variante aus, generiert über eine interne Bildoptimierungs-API, die entweder von Next.js selbst oder von einem konfigurierten externen Loader übernommen wird.
Wichtig zu verstehen: Next.js Image Optimierung ist kein Selbstläufer. Die Komponente liefert die technische Infrastruktur, aber falsch konfigurierte sizes-Angaben, fehlendes priority auf dem LCP-Element oder unüberlegte Remote-Pattern-Konfiguration können den erwarteten Performancegewinn zunichtemachen. Die folgenden Abschnitte gehen die wichtigsten Konfigurationsentscheidungen im Detail durch.
2. next/image Komponente: Funktionsweise im Detail
Die next/image-Komponente ersetzt das klassische <img>-Tag durch eine Komponente, die zwingend width und height, oder alternativ die fill-Prop, benötigt. Diese Pflichtangabe ist kein bürokratisches Detail, sondern verhindert Layout Shifts: Der Browser reserviert den korrekten Platz für das Bild, bevor es überhaupt geladen ist, was direkt die Cumulative-Layout-Shift-Metrik verbessert, eine der drei zentralen Core-Web-Vitals-Kennzahlen.
Beim Rendern generiert Next.js Image Optimierung automatisch ein srcset-Attribut mit mehreren Bildvarianten in unterschiedlichen Breiten, definiert über die deviceSizes- und imageSizes-Konfiguration in next.config.js. Der Browser wählt anhand der tatsächlichen Darstellungsgröße und Pixeldichte selbstständig die passende Variante aus dem srcset aus, ganz ohne zusätzlichen JavaScript-Code zur Laufzeit. Dieser Mechanismus ist Web-Standard und funktioniert unabhängig von React.
// components/ProductHero.tsx — basic next/image usage with explicit dimensions
import Image from 'next/image';
export function ProductHero({ product }: { product: { imageUrl: string; name: string } }) {
return (
<Image
src={product.imageUrl}
alt={product.name}
width={1200}
height={630}
priority
className="rounded-xl object-cover"
/>
);
}
3. Responsive Bilder mit sizes und srcset richtig konfigurieren
Die sizes-Prop ist der am häufigsten missverstandene Teil der Next.js Image Optimierung. Sie beschreibt nicht die tatsächliche Bildgröße, sondern gibt dem Browser vorab an, wie breit das Bild im Layout bei unterschiedlichen Viewport-Breiten tatsächlich dargestellt wird, damit er schon vor dem vollständigen CSS-Rendering die richtige Variante aus dem srcset auswählen kann. Fehlt sizes bei einem responsiven Bild, wählt der Browser konservativ die größte verfügbare Variante, was unnötig viel Bandbreite verschwendet.
Ein typisches Muster für ein Bild, das auf großen Bildschirmen ein Drittel der Breite einnimmt, auf Tablets die Hälfte und auf Mobilgeräten die volle Breite, sieht folgendermaßen aus: sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw". Jede Regel wird von links nach rechts geprüft, die erste zutreffende Media-Query bestimmt die Breite. Ein häufiger Fehler ist, diese Angabe kopiert zu lassen, obwohl sich das tatsächliche CSS-Layout eines Bildes im Projekt geändert hat, was zu einer stillen Diskrepanz zwischen angegebener und tatsächlicher Darstellungsgröße führt.
// components/ProductGrid.tsx — sizes matches the actual responsive layout
import Image from 'next/image';
export function ProductCard({ product }: { product: { imageUrl: string; name: string } }) {
return (
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
<Image
src={product.imageUrl}
alt={product.name}
width={800}
height={800}
// Full width on mobile, half on tablet, a third on desktop grid
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw"
className="rounded-lg object-cover w-full h-auto"
/>
</div>
);
}
4. Priority, Lazy Loading und Largest Contentful Paint
Standardmäßig lädt next/image jedes Bild mit loading="lazy", was für die meisten Bilder unterhalb des sichtbaren Bereichs sinnvoll ist, weil Bandbreite gespart wird, bis der Nutzer tatsächlich scrollt. Für das Bild, das voraussichtlich das Largest-Contentful-Paint-Element der Seite ist, meist ein Hero-Bild oder ein großes Produktfoto direkt im sichtbaren Bereich, ist genau dieses Lazy Loading jedoch kontraproduktiv: Es verzögert das Laden eines Bildes, das der Nutzer sofort sieht.
Die priority-Prop schaltet für genau dieses Bild das Lazy Loading ab und weist Next.js zusätzlich an, einen <link rel="preload">-Hint in den <head> zu setzen, sodass der Browser das Bild bereits während des initialen HTML-Parsings anfordert, statt erst nach vollständigem CSS- und JavaScript-Laden. Diese Kombination aus fehlendem Lazy Loading und Preload-Hint ist der wichtigste Hebel, um die Next.js Image Optimierung tatsächlich mit einer guten LCP-Zeit zu verbinden. Ein häufiger Fehler ist, priority versehentlich auf mehrere Bilder zu setzen, was den Preload-Mechanismus verwässert und die eigentlich relevante Ressource nicht mehr priorisiert lädt.
5. Externe Bilder und Remote Patterns konfigurieren
Aus Sicherheitsgründen optimiert next/image standardmäßig keine Bilder von beliebigen externen Domains. Jede Domain, von der Bilder über eine URL statt eines lokalen Imports geladen werden, muss explizit über remotePatterns in next.config.js freigegeben werden. Diese Einschränkung verhindert, dass die interne Bildoptimierungs-API von Next.js als offener Proxy für beliebige Bild-URLs missbraucht werden kann, ein reales Sicherheitsrisiko, das ohne diese Kontrolle bestünde.
Ein typisches Setup für einen E-Commerce-Shop mit einem separaten Media-Server oder CDN definiert genau die benötigten Hostnamen und Pfad-Muster, statt pauschal alle HTTPS-Domains zuzulassen. Wichtig: Änderungen an remotePatterns erfordern einen Rebuild der Anwendung, weil die Konfiguration zur Build-Zeit ausgewertet wird. Ein häufiger Produktionsfehler entsteht, wenn ein neuer Bild-Host, etwa nach einem CDN-Wechsel, in der Konfiguration vergessen wird und Bilder dann mit einem 400-Fehler von der internen Optimierungs-API abgelehnt werden.
// next.config.js — explicit remote patterns for external image domains
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'cdn.mironsoft-media.de',
pathname: '/products/**',
},
{
protocol: 'https',
hostname: 'images.unsplash.com',
},
],
deviceSizes: [640, 750, 828, 1080, 1200, 1920],
imageSizes: [16, 32, 48, 64, 96, 128, 256],
},
};
module.exports = nextConfig;
6. Eigener Image Loader für CDN Integration
Wer bereits einen spezialisierten Bild-CDN-Dienst wie Cloudinary, Imgix oder eine eigene Bildoptimierungs-Infrastruktur betreibt, kann die eingebaute Bildoptimierungs-API von Next.js komplett umgehen und stattdessen einen eigenen loader definieren. Diese Funktion erhält src, width und quality als Parameter und muss eine vollständige URL zurückgeben, die auf die entsprechend transformierte Bildvariante beim externen Dienst zeigt. Die restliche Logik der Next.js Image Optimierung, also srcset-Generierung, Lazy Loading und Priority-Handling, bleibt dabei vollständig erhalten.
Ein eigener Loader lohnt sich vor allem, wenn der bestehende CDN-Dienst bereits über eigene Caching-Infrastruktur, Bildtransformationen und globale Verteilung verfügt, sodass die zusätzliche Next.js-eigene Optimierungsschicht redundant wäre oder sogar zu doppelter Verarbeitung führen würde. Für die meisten Projekte ohne bestehenden Bild-CDN-Vertrag ist der eingebaute Next.js-Optimierer allerdings die einfachere und ausreichend performante Wahl.
// lib/cloudinary-loader.ts — custom loader delegating optimization to Cloudinary
export default function cloudinaryLoader({
src,
width,
quality,
}: {
src: string;
width: number;
quality?: number;
}) {
const params = [`w_${width}`, `q_${quality ?? 75}`, 'f_auto', 'c_limit'];
return `https://res.cloudinary.com/mironsoft/image/upload/${params.join(',')}${src}`;
}
// next.config.js
// images: { loader: 'custom', loaderFile: './lib/cloudinary-loader.ts' }
7. Placeholder-Strategien: Blur und Shimmer
Ein leerer, weißer Bereich, während ein Bild lädt, wirkt unfertig und kann bei langsamen Verbindungen wie ein Fehler aussehen. Die placeholder="blur"-Option der Next.js Image Optimierung zeigt stattdessen eine stark verkleinerte, unscharfe Vorschau, die inline als Base64-codiertes Bild direkt im HTML mitgeliefert wird, ganz ohne zusätzlichen Netzwerk-Request. Für lokal importierte Bilder generiert Next.js diesen Blur-Platzhalter automatisch beim Build, für extern geladene Bilder muss blurDataURL manuell bereitgestellt werden, etwa aus einer beim Upload generierten Miniaturversion.
Alternativ lässt sich ein Shimmer-Effekt, ein animierter Gradient-Platzhalter, über eine eigene blurDataURL mit einem SVG-Data-URI realisieren, was insbesondere bei Bildern ohne aussagekräftige Blur-Vorschau, etwa reine Textgrafiken oder Icons, ein konsistenteres visuelles Ergebnis liefert als eine generische graue Fläche. Wichtig ist in beiden Fällen, dass der Platzhalter selbst extrem leichtgewichtig bleibt, meist deutlich unter einem Kilobyte, um selbst kein eigenes Performanceproblem zu erzeugen.
8. Grenzen der next/image Optimierung
Next.js Image Optimierung löst das Problem falscher Bildgrößen und fehlender moderner Formate hervorragend, aber nicht jedes Bildproblem. Animierte GIFs werden von der Optimierungs-API standardmäßig nicht in ihrer Animation transformiert, sie werden unverändert durchgereicht, was bei sehr großen GIF-Dateien weiterhin zu Performanceproblemen führen kann. Für animierte Inhalte ist ein Wechsel zu WebP-Animationen oder Video-Elementen mit autoplay muted loop oft die bessere Alternative als ein klassisches GIF.
Eine zweite Grenze betrifft Hintergrundbilder über CSS, die außerhalb der Kontrolle der next/image-Komponente liegen. Ein per background-image gesetztes CSS-Bild profitiert nicht automatisch von responsiver Größenanpassung oder modernen Formaten, hierfür muss entweder manuell mit image-set() gearbeitet oder die Bildlogik in eine tatsächliche <Image>-Komponente mit fill und passendem object-fit überführt werden.
9. next/image im Vergleich zu klassischem img
Die folgende Tabelle stellt die eingebaute Next.js Image Optimierung dem klassischen <img>-Tag gegenüber.
| Aspekt | Klassisches img | next/image | Vorteil |
|---|---|---|---|
| Responsive Varianten | Manuell mit srcset | Automatisch generiert | Kein manuelles Pflegen mehrerer Dateien |
| Moderne Formate | Manuelle Konvertierung nötig | AVIF/WebP automatisch | Kleinere Dateigrößen ohne Zusatzaufwand |
| Layout Shift Schutz | Nur mit manuellem width/height | Erzwungen durch Pflichtangabe | Bessere CLS-Werte |
| Lazy Loading | loading="lazy" manuell setzen | Standardverhalten | Weniger Boilerplate |
| Externe Domains | Ohne Einschränkung | remotePatterns nötig | img für unkontrollierte externe Quellen einfacher |
Die Tabelle zeigt: Next.js Image Optimierung gewinnt in fast jedem Kriterium, mit Ausnahme der zusätzlichen Konfigurationspflicht für externe Domains, die aus gutem Sicherheitsgrund besteht und mit wenig Aufwand einmalig erledigt ist.
Mironsoft
Next.js Performance und Core Web Vitals Optimierung
Bilder, die schnell laden statt den LCP zu verschlechtern?
Wir konfigurieren next/image mit korrekten sizes-Angaben, gezieltem Priority-Einsatz für das LCP-Element und, wo sinnvoll, einem eigenen Loader für eure bestehende CDN-Infrastruktur.
LCP-Analyse
Identifizieren des LCP-Elements und korrekte Priority-Konfiguration
sizes-Audit
Abgleich von sizes-Angaben mit dem tatsächlichen responsiven Layout
CDN-Integration
Eigener Image Loader für Cloudinary, Imgix oder bestehende Medien-Infrastruktur
10. Zusammenfassung
Next.js Image Optimierung automatisiert responsive Bildgrößen, moderne Formate und Layout-Shift-Schutz über die next/image-Komponente, löst aber nicht jedes Detail ohne bewusste Konfiguration. Eine korrekt gesetzte sizes-Angabe verhindert unnötig große Downloads, priority auf dem tatsächlichen LCP-Element verbessert die wichtigste Core-Web-Vitals-Metrik direkt, und sauber gepflegte remotePatterns verhindern Sicherheitslücken bei extern gehosteten Bildern.
Für Projekte mit bestehender CDN-Infrastruktur bietet ein eigener Loader die Möglichkeit, die Vorteile der next/image-API mit einer bereits etablierten Bildpipeline zu kombinieren. Wer diese Konfigurationsentscheidungen bewusst trifft, statt sich blind auf die Standardeinstellungen zu verlassen, holt aus der Next.js Image Optimierung tatsächlich messbare Verbesserungen bei Ladezeit und Core Web Vitals heraus.
Next.js Image Optimierung: Das Wichtigste auf einen Blick
sizes korrekt setzen
Beschreibt die tatsächliche Darstellungsbreite im Layout, verhindert unnötig große Downloads.
Priority für LCP
Deaktiviert Lazy Loading und setzt Preload-Hint für das sichtbare Hauptbild, verbessert LCP direkt.
Remote Patterns
Explizite Freigabe externer Bild-Domains, verhindert Missbrauch der Optimierungs-API als offener Proxy.
Eigener Loader
Sinnvoll bei bestehender CDN-Infrastruktur, sonst bleibt der eingebaute Optimierer die einfachere Wahl.