Wie die Bildoptimierung in Next.js tatsächlich funktioniert_
Was `next/image` verbessert, wo die Optimierungsarbeit stattfindet und die Kompromisse, die Sie verstehen sollten, bevor Sie sich stark darauf verlassen.
next/image ist eines dieser Features, die man leicht als eine Art Glaubenssatz übernehmen kann.
Die Leute hören "verwende <Image /> anstelle von <img>" und bleiben dabei stehen. Das ist genug, um einen gewissen Nutzen zu ziehen, aber nicht genug, um gute Leistungsentscheidungen zu treffen.
Es hilft, zu verstehen, was die Komponente tatsächlich für Sie tut.
Der erste Gewinn ist die Layout-Stabilität
Ein einfaches <img> ist nicht von Natur aus schlecht. Das Problem beginnt, wenn der Browser nicht weiß, wie viel Platz er reservieren soll, bevor das Bild geladen wird.
So kommt es, dass sich der Inhalt nach unten verschiebt, sobald das Bild endlich erscheint.
Mit next/image werden Sie dazu angehalten, explizite Größenangaben oder ein füllbasiertes Layoutmodell zu verwenden:
import Image from "next/image";
export function Hero() {
return (
<Image
src="/hero.jpg"
alt="Produkt Screenshot"
width={1600}
height={900}
priority
/>
);
}
Diese Dimensionen geben dem Browser ausreichend Informationen, um frühzeitig Platz zu reservieren, was hilft, den Layout-Versatz zu reduzieren.
Der zweite Gewinn ist Format- und Größenverhandlung
Wenn die Bildoptimierung aktiviert ist, wird die Anfrage durch die Bildoptimierungspipeline von Next.js geleitet, anstatt das originale Asset immer unverändert auszuliefern.
Diese Pipeline kann:
- das Bild auf eine angemessenere Breite verkleinern
- es in einem Format kodieren, das vom anfordernden Browser unterstützt wird
- die optimierte Variante für spätere Anfragen cachen
Das ist nützlich, da ein 2000-Pixel-Quellbild für ein mobilesViewport oft unnötig ist und moderne Formate wie WebP oder AVIF die Übertragungsgröße erheblich reduzieren können, abhängig vom Bildinhalt.
Was auf dem Server passiert
Der häufige Irrtum ist, dass <Image /> nur eine praktische React-Komponente ist.
Es ist auch ein Optimierungsfeature auf der Serverseite.
In der Standardkonfiguration generiert Next.js optimierte Varianten über seinen Bildpfad. Das bedeutet, dass an einem Ort in Ihrer Bereitstellung echte Arbeit durchgeführt wird:
- das ursprüngliche Bild dekodieren
- es verkleinern
- es erneut kodieren
- die Ausgabe cachen
Wenn Sie auf Vercel sind, wird ein großer Teil dieser operationellen Belastung für Sie verborgen. Wenn Sie self-hosted sind, hängt es von Ihrem CPU-Budget und Ihrem Cache-Verhalten ab.
Diese Unterscheidung ist wichtig, sobald der Traffic wächst.
Der Kompromiss
Bildoptimierung ist nicht kostenlos.
Sie tauschen effektiv Laufzeitberechnungen gegen bessere Payloads und besseres Renderverhalten ein.
Das ist oft ein guter Tausch, aber es bleibt ein Tausch.
Schwere Bildlasten können teuer oder langsam werden, wenn:
- viele unique Größen angefordert werden
- die Cache-Trefferquote schlecht ist
- die Quellbilder zu groß sind
- Ihre self-hosted Bereitstellung eine begrenzte CPU hat
Wenn eine Seite hauptsächlich statische Assets mit bekannten Dimensionen liefert, können Sie bessere Ergebnisse erzielen, indem Sie Bilder während des Builds oder in Ihrer Asset-Pipeline vorab verarbeiten, anstatt sich auf eine bedarfsgerechte Größenänderung für alles zu verlassen.
Wo Teams es häufig missbrauchen
Die Fehler sind vorhersehbar:
- übergroße Originale hochladen und annehmen, dass die Laufzeitoptimierung sie retten wird
sizesbei responsiven Bildern ignorierenfillverwenden, ohne den Layout-Container zu steuern- annehmen, dass jedes Bild hohe Priorität haben sollte
Dies ist ein besseres responsives Muster:
<Image
src="/dashboard.png"
alt="Analytics-Dashboard"
fill
sizes="(max-width: 768px) 100vw, 50vw"
style={{ objectFit: "cover" }}
/>
Ohne einen korrekten sizes-Wert könnte der Browser dennoch eine größere Ressource wählen, als das Layout tatsächlich benötigt.
Eine bessere Faustregel
Verwenden Sie next/image, wenn:
- Sie automatisches responsives Bildmanagement wünschen
- Sie sich um die Core Web Vitals kümmern
- Sie keine eigene Bildpipeline entwickeln möchten
Seien Sie sorgfältiger, wenn:
- Bilder bereits upstream verarbeitet sind
- Sie self-hosted mit begrenztem Rechenvermögen sind
- die Assets kein bedeutendes Leistungsengpass darstellen
Die Komponente ist nützlich, weil sie Ihnen gute Voreinstellungen bietet. Sie ist nicht nützlich, wenn sie Sie daran hindert, darüber nachzudenken, wie Bilder durch Ihr System fließen.
Weiterführende Literatur
Verwandte Artikel.
Weiterlesen mit eng verwandten Artikeln zu Software Engineering, Architektur und Implementierungs-Trade-offs.
Next.js Server-Aktionen sind großartig für UI-nahe Mutationen
Server-Aktionen reduzieren Boilerplate für Formular- und Mutationsabläufe im App-Router, sind jedoch kein Grund, jeden expliziten API-Vertrag zu löschen.
Kontext und Zustand lösen verschiedene React-Probleme
Kontext eignet sich gut zur Weitergabe von Werten durch den Baum. Zustand ist nützlich, wenn Sie einen externen Store mit gezielteren Abonnements und weniger Provider-Verkabelung wünschen.