Was ist progressives Rendering?
Progressives Rendering zeigt nutzbare Teile oder zunehmend vollständige Versionen von Inhalten an, sobald Daten verfügbar werden. So wird das Gesamtergebnis nicht zurückgehalten, bis alle Ressourcen geladen oder alle Verarbeitungsschritte abgeschlossen sind.
So funktioniert progressives Rendering
Progressives Rendering ist eine Strategie, die Encoding, Transport, Parsing und Darstellung umfasst; es ist kein einzelnes Medienformat. Auf Dateiebene speichert ein progressives JPEG das Bild als Folge von Scans mit steigender Qualität. Ein Decoder kann daher schon aus dem ersten Scan eine grobe Version des gesamten Bildes anzeigen und sie mit jedem weiteren Scan verfeinern. Ein PNG mit Interlacing überträgt seine Pixel in sieben Durchgängen. Auf Dokumentebene kann ein Server HTML streamen, sodass der Browser die äußere Seitenstruktur und Platzhalter anzeigt, während langsamere Abschnitte noch erzeugt werden. Der Streaming-Server-Renderer von React sendet beispielsweise zuerst den Fallback einer Grenze vom Typ <Suspense> und später den eigentlichen Inhalt. Die beiden Ebenen betreffen unterschiedliche Wartezeiten: Die Aufschlüsselung von Largest Contentful Paint auf web.dev erfasst die Zeit bis zum ersten Byte des HTML-Dokuments und die Ladezeit der Bildressource selbst als separate Teilzeiten. Ein früher gesendetes Dokument verkürzt daher nicht den Download eines darin referenzierten Bildes. Der Browser kann diesen Download jedoch früher beginnen, wenn das früh eintreffende HTML bereits die Bild-URL enthält. In beiden Fällen hilft die frühe Ausgabe nur, wenn sie tatsächlich früh auf dem Bildschirm erscheint. Reservierter Platz für die endgültige Ausgabe verhindert, dass deren Einsetzen das umgebende Layout verschiebt.
Wichtige Fakten
- Welche Bildformate können progressiv gerendert werden? JPEG, wenn es im progressiven Modus codiert ist, PNG und GIF, wenn sie im Interlacing-Verfahren vorliegen, sowie JPEG XL, wobei MDN darauf hinweist, dass Safari JPEG XL erst nach dem vollständigen Download rendert. WebP kann keine Vorschau des gesamten Bildes schrittweise verfeinern: Laut Googles WebP-FAQ bietet es keine progressive Aktualisierung oder Aktualisierung per Interlacing im Sinne von JPEG oder PNG, sondern nur inkrementelles Decodieren, bei dem Zeilen angezeigt werden, sobald deren Bytes eintreffen. Bei AVIF hängt es vom Encoding und vom Anzeigeprogramm ab. Die AVIF-Spezifikation unterstützt progressives Decodieren durch mehrschichtige Bilder, stellt dem Renderer aber frei, nur die höchste Ebene anzuzeigen; das Programm
avifencvon libavif erzeugt mit--progressiveeine solche Datei, und das Änderungsprotokoll von libavif nennt Chrome als Anzeigeprogramm, das die Ebenen progressiv rendert. Der Formatleitfaden von MDN erklärt dagegen, dass AVIF kein progressives Rendering unterstützt und Dateien vor der Anzeige vollständig heruntergeladen werden müssen. Er ergänzt, dass die geringere Größe von AVIF-Dateien dies außer bei größeren Dateien oft ausgleicht. Eine Konvertierung zu WebP oder AVIF erhält daher nicht von sich aus den Effekt einer zunächst groben Darstellung: Prüfen Sie bei AVIF die Encoder-Einstellung und die Zielbrowser; andernfalls muss ein separater Platzhalter diesen Effekt liefern. - Welchen Aufwand verursacht ein progressives JPEG? Vor allem Aufwand beim Decodieren, weniger bei der Dateigröße. Laut libjpeg-Dokumentation sind progressive Dateien oft etwas kleiner als sequenzielle Dateien gleicher Qualität, und das endgültige Bild ist identisch. Sie erklärt außerdem, dass jeder angezeigte Scan beim Decodieren ungefähr so viel Aufwand verursacht wie ein vollständiges Bild gleicher Größe und dass Zwischenscans nur angezeigt werden, wenn die Anwendung den Modus für gepufferte Bilder der Bibliothek nutzt; andernfalls liest der Decoder jeden Scan und gibt nur das endgültige Bild zurück. Ob Betrachter die schrittweise Verfeinerung sehen, hängt daher vom verwendeten Decoder ab, nicht nur von der Datei.
- Warum erscheint eine gestreamte Seite trotzdem auf einmal? Meist hält etwas zwischen Renderer und Browser die Bytes zurück. nginx puffert Proxy-Antworten standardmäßig und leitet Daten nur dann direkt beim Empfang weiter, wenn
proxy_bufferingdeaktiviert ist oder der UpstreamX-Accel-Buffering: nosendet, einen Header, den nginx auf entsprechende Konfiguration mitproxy_ignore_headershin ignorieren kann; der Leitfaden zum Selbsthosting von Next.js ergänzt, dass manche Cloud-Load-Balancer Antworten standardmäßig puffern und dass auch Reverse-Proxys zwischen Load-Balancer und Anwendung Antworten mit Chunked-Übertragung ohne Pufferung weiterleiten müssen. Für eine effiziente Komprimierung wird ein Abschnitt der Ausgabe gepuffert; die README-Datei der Express-Middlewarecompressionbeschreibt dies für Server-Sent Events und bietetres.flush(), um die Übertragung der teilweise komprimierten Antwort an den Client zu erzwingen. Die Anwendung kann den Effekt selbst aufheben: React dokumentiert, dass es kein progressives Laden gibt, wenn der Stream inonAllReadystatt inonShellReadygestartet wird. Selbst wenn Bytes frühzeitig eintreffen, können vorab geladenes CSS oder JavaScript das Rendering weiterhin blockieren. - Verursacht progressives Laden Layoutverschiebungen? Das kann passieren, wenn der Platz für später eintreffende Inhalte nicht reserviert ist. Googles Leitfaden zu Cumulative Layout Shift zählt Bilder ohne Abmessungsangaben und dynamisch eingefügte Inhalte zu den häufigsten Ursachen für einen schlechten Wert. Er empfiehlt, bei Bildern und Videos immer
widthundheightanzugeben oder den Platz mitaspect-ratioin CSS zu reservieren. Ein Bild, das innerhalb eines Bereichs mit bekannter Größe schrittweise verfeinert wird, verschiebt nichts in seiner Umgebung; ein Ersatzbild, dessen Größe vom Platzhalter abweicht, kann die umgebenden Inhalte verschieben, sofern nicht bereits ein Container den Platz reserviert.
Wann progressives Rendering wichtig ist
Planen Sie progressives Rendering ein, wenn wesentliche Seiten- oder Medieninhalte vor nachrangigen Details priorisiert werden können. Instabile Abmessungen oder eine ungünstige Reihenfolge der Aktualisierungen können stattdessen zu Layoutverschiebungen und ablenkenden visuellen Änderungen führen.
So hilft Transloadit beim progressiven Rendering
Der Robot /image/resize von Transloadit verfügt über den Parameter progressive, der Interlacing für die Ausgabe aktiviert, damit Browser zuerst eine niedrig aufgelöste Version des gesamten Bildes anzeigen können; die Funktion ist standardmäßig deaktiviert. Bei Formaten, für die das nicht gilt, kann ein Step, der ein Bild erzeugt, mit output_meta einen BlurHash oder ThumbHash extrahieren, einen kompakten Platzhalter zur Anzeige, während das vollständige Bild lädt. Bildergebnisse im Assembly Status enthalten außerdem width, height und aspect_ratio in ihren Metadaten. Diese Angaben benötigt eine Seite, um den Platz für das Bild zu reservieren, bevor es eintrifft.
Die Robot-Dokumentation nennt eine Zunahme der Dateigröße für progressive, ohne die betroffenen Ausgabeformate anzugeben. Das unterscheidet sich von den obigen Angaben der libjpeg-Dokumentation zu progressiven JPEGs. Messen Sie daher mit Ihren eigenen Bildern und Ihrem Ausgabeformat. Die ThumbHash-Extraktion wird als Metadatengebühr abgerechnet; die aktuellen Konditionen finden Sie in der Robot-Dokumentation.
Quellen
- libjpeg-turbo: Dokumentation der libjpeg-Bibliothek (Unterstützung für progressive JPEGs und Modus für gepufferte Bilder)
- W3C-PNG-Spezifikation, dritte Ausgabe (Interlacing und Extraktion von Durchgängen)
- MDN: Leitfaden zu Bilddateitypen und Bildformaten
- Google: häufig gestellte Fragen zu WebP (progressive Anzeige oder Anzeige per Interlacing)
- Spezifikation zum AV1 Image File Format (AVIF) v1.2.0 (Geltungsbereich und mehrschichtige Bildelemente)
- libavif: avifenc-Handbuch (Optionen --progressive und --layered)
- libavif-Änderungsprotokoll (mehrschichtiges AVIF-Encoding und progressives Rendering in Anzeigeprogrammen)
- React: renderToPipeableStream (Streaming, Shell und Suspense-Fallbacks)
- nginx: ngx_http_proxy_module (proxy_buffering und X-Accel-Buffering)
- Next.js: Leitfaden zum Selbsthosting (Streaming und Proxy-Pufferung)
- README der Express-Middleware compression (res.flush und gepufferte Ausgabe)
- MDN-Glossar: Blockierung des Renderings
- web.dev: Optimierung von Largest Contentful Paint (LCP-Teilbereiche)
- web.dev: Optimierung von Cumulative Layout Shift