Automatische Bildoptimierung

Nicht optimierte Bilder

Mit regulärem HTML haben wir unser Hero-Bild wie folgt hinzugefügt:

<img src="large-image.jpg" alt="Large Image" />

Allerdings bedeutet dies, dass wir einige Dinge manuell optimieren müssen, wie:

  • Sicherstellen, dass unser Bild auf verschiedenen Bildschirmgrößen responsiv ist.
  • Optimieren unserer Bilder mit einem Drittanbieter-Tool oder einer Bibliothek.
  • Lazy-Loading von Bildern, wenn sie in den Viewport gelangen

Die Image-Komponente

Next.js bietet eine Image-Komponente, die diese Optimierungen für uns out-of-the-box übernimmt.

next/image ist eine Erweiterung des HTML-img-Elements, das für das moderne Web weiterentwickelt wurde.

Das bedeutet, dass Größenanpassung, Optimierung und Bereitstellung von Bildern in modernen Formaten wie WebP (wenn der Browser es unterstützt) automatisch mit next/image erfolgen kann.

Die Komponente vermeidet das Ausliefern großer Bilder an Geräte mit kleinerem Viewport und ermöglicht es Next.js, zukünftige Bildformate zu übernehmen und diese Bilder an unterstützende Browser auszuliefern.

Die automatische Bildoptimierung funktioniert mit jeder Bildquelle. Selbst wenn das Bild von einer externen Datenquelle wie einem CMS gehostet wird, kann es dennoch optimiert werden.

Wie funktioniert die automatische Bildoptimierung?

On-Demand-Optimierung

Anstatt Bilder zur Build-Zeit zu optimieren, optimiert Next.js Bilder bei Bedarf, wenn Benutzer sie anfordern. Im Gegensatz zu statischen Site-Generatoren und rein statischen Lösungen erhöhen sich die Build-Zeiten nicht, unabhängig davon, ob zehn oder zehn Millionen Bilder ausgeliefert werden.

Lazy-Loading von Bildern

Bilder werden standardmäßig lazy geladen. Die Seitenleistung wird nicht durch Bilder beeinträchtigt, die sich außerhalb des Viewports befinden. Bilder werden nur geladen, wenn sie in den sichtbaren Bereich gelangen.

Vermeidung von CLS

Bilder werden immer so gerendert, dass Cumulative Layout Shift (CLS) vermieden wird.

Verwendung der Image-Komponente

Aktualisieren wir die App mit next/image, um unser Hero-Bild anzuzeigen. Die Höhen- und Breiten-Props sollten der gewünschten Rendering-Größe entsprechen, mit einem Seitenverhältnis, das dem des Quellbilds entspricht.

Öffnen Sie die Datei pages/index.js und fügen Sie am Anfang der Datei einen Import für Image aus next/image hinzu:

import Image from 'next/image';

Ersetzen Sie dann das Hero-img durch die Image-Komponente:

// Vorher
<img src="large-image.jpg" alt="Large Image" />
 
// Nachher
<Image src="/large-image.jpg" alt="Large Image" width={3048} height={2024} />

Es gibt auch ein Bild in der Fußzeile. Ersetzen wir auch dieses:

// Vorher
<img src="/vercel.svg" alt="Vercel Logo" />
 
// Nachher
<Image src="/vercel.svg" alt="Vercel Logo" width={72} height={16} />

Führen Sie abschließend einen weiteren Lighthouse-Bericht in den Chrome DevTools aus und vergleichen Sie Ihre Ergebnisse.

Weiterführende Literatur

On this page