Faules Laden von Bildern mit Browser-Tools

Der Autor des Materials, dessen Übersetzung wir heute veröffentlichen, Eddie Osmani von Google, sagt, dass bereits in Chrome 75 die Unterstützung für das neue Attribut der <img> und <iframe> möglicherweise erscheint. Dies bedeutet, dass diese Elemente Standardfunktionen für das sogenannte "verzögerte Laden" von Daten unterstützen.

Bild

Wenn Sie herausfinden möchten, wie die Verwendung des neuen Attributs im Code aussieht, sehen Sie sich dieses Beispiel an:

 <img align="center" src="celebration.jpg" loading="lazy" alt="..." /> <iframe src="video-player.html" loading="lazy"></iframe> 

Jetzt werden wir darüber sprechen, wie das loading funktioniert.

Vorläufige Informationen


Webseiten enthalten häufig viele Bilder, was sich auf die Größe der Seiten auswirkt, zu einer übermäßigen Zunahme führt und die Geschwindigkeit beim Laden von Seiten beeinflusst. Viele der auf den Seiten angezeigten Bilder befinden sich außerhalb ihres sichtbaren Bereichs. Um solche Bilder zu sehen, muss der Benutzer die Seite scrollen.

In der Vergangenheit mussten Programmierer JavaScript-Bibliotheken (wie LazySizes ) verwenden, um die Auswirkungen von Bildern außerhalb des sichtbaren Bereichs der Seiten auf die Ladezeit zu begrenzen. Mit diesen Bibliotheken können Sie das Laden solcher Bilder verzögern, bis der Benutzer beim Scrollen durch die Seite nicht mehr nahe genug an sie heranrückt.


Seitenladen 211 Bilder. Eine Seitenversion, die nicht zum verzögerten Laden von Bildern verwendet wird, lädt sofort 10 MB Grafikdaten. Auf derselben Seite, die beim verzögerten Laden (mit LazySizes) verwendet wird, werden nur 250 KB Grafikinformationen vorgeladen. Alles andere wird geladen, wenn sich der Benutzer auf der Seite bewegt. Details zu diesem Experiment finden Sie unter webpagetest.org .

Was wäre, wenn der Browser dem Programmierer helfen könnte, das Laden von Bildern zu vermeiden, die sich außerhalb des sichtbaren Bereichs der Seiten befinden? Dies würde sich günstig auf die Geschwindigkeit des Ladens von Daten im sichtbaren Bereich der Seite auswirken, würde bei Geräten mit geringem Stromverbrauch die Gesamtmenge der über das Netzwerk übertragenen Daten verringern und den Speicherverbrauch verringern. All dies wird dank des neuen Attributs der <img> und <iframe> bald möglich sein.

Attribut wird geladen


Mit dem loading kann der Browser das Laden des Inhalts der Elemente <img> und <iframe> , die sich außerhalb des sichtbaren Bereichs der Seite befinden, verzögern, bis der Benutzer die Seite nahe genug an diese Elemente gescrollt hat. Dieses Attribut unterstützt drei Werte:

  • lazy : verweist auf Materialien, die sich gut für faules Laden eignen.
  • eager : Materialien in Elementen mit diesem Attributwert müssen sofort geladen werden.
  • auto : Der Browser entscheidet, ob Materialien mit diesem Attributwert verzögert geladen werden sollen.

Wenn Sie den Wert des loading nicht angeben, entspricht dies der Einstellung auf auto .


Derzeit liegt das Ladeattribut für die Elemente <img> und <iframe> unter dem HTML-Standard

Beispiele


Das srcset funktioniert mit <img> -Elementen (einschließlich des srcset Attributs und innerhalb des <picture> -Elements) sowie mit <iframe> -Elementen.

 <!--    ,      ,   ,         --> <img align="center" src="unicorn.jpg" loading="lazy" alt=".."/> <!--    ,    --> <img align="center" src="unicorn.jpg" loading="eager" alt=".."/> <!--   ,        ,   --> <img align="center" src="unicorn.jpg" loading="auto" alt=".."/> <!--      <picture>.      <img>,    <picture>   srcset     --> <picture> <source media="(min-width: 40em)" srcset="big.jpg 1x, big-hd.jpg 2x"> <source srcset="small.jpg 1x, small-hd.jpg 2x"> <img align="center" src="fallback.jpg" loading="lazy"> </picture> <!--    ,     srcset --> <img align="center" src="small.jpg"    srcset="large.jpg 1024w, medium.jpg 640w, small.jpg 320w"    sizes="(min-width: 36em) 33.3vw, 100vw"    alt="A rad wolf" loading="lazy"> <!--      <iframe>   ,     ,          --> <iframe src="video-player.html" loading="lazy"></iframe> 

Es ist zu beachten, dass wir hier Formulierungen wie die folgenden verwenden: „Wenn der Benutzer die Seite so scrollt, dass sich ihr sichtbarer Bereich in der Nähe des Elements befindet“. Der Browser ermittelt den genauen Zeitpunkt, zu dem das Bild geladen wird. Im Allgemeinen können wir hoffen, dass der Browser mit dem Herunterladen von Materialien beginnt, deren Download sich verzögert hat, einige Zeit bevor der Bereich der Seite, der sie enthält, für den Benutzer sichtbar ist. Dies erhöht die Wahrscheinlichkeit, dass das Herunterladen und Ausgeben relevanter Materialien abgeschlossen ist, sobald der Benutzer sie sieht.

Bitte beachten Sie, dass ich vorgeschlagen habe , das betreffende Attribut als loading , da dieser Ansatz zur Benennung dem entspricht, der bei der Auswahl eines Namens für das Dekodierungsattribut verwendet wird. Frühere Sätze wie lazyload funktionierten nicht, da dieses Attribut mehrere Werte unterstützen musste ( lazy , eager und auto ).

Überprüfen Sie die Browserunterstützung für das Laden von Attributen


Wir haben die Bedeutung der Möglichkeit berücksichtigt, JavaScript-Bibliotheken zum Organisieren des verzögerten Ladens von Materialien zu verwenden (für die browserübergreifende Unterstützung dieser Funktion). Sie können überprüfen, ob der Browser das Ladeattribut unterstützt, indem Sie:

 <script> if ('loading' in HTMLImageElement.prototype) {   //   `loading`. } else {  //  -      JavaScript-   //    . } </script> 

Beachten Sie, dass das loading verwendet werden kann, um die Funktionen der Seite schrittweise zu erweitern. Browser, die dieses Attribut unterstützen, können das verzögerte Laden von Materialien mit loading=lazy , und Browser, die diese Funktion nicht unterstützen, laden diese Materialien einfach wie zuvor herunter.

Browserübergreifendes verzögertes Laden von Bildern


Wenn die browserübergreifende Unterstützung für das verzögerte Laden von Bildern wichtig ist, reicht es nicht aus, nur festzustellen, ob der Browser diese Funktion unterstützt. Wenn dies nicht der Fall ist, verwenden Sie die entsprechende Bibliothek, wenn Sie ein Design wie <img align="center" src=unicorn.jpg loading=lazy /> , um das Bild im Markup zu beschreiben <img align="center" src=unicorn.jpg loading=lazy /> .

Im Markup müssen Sie <img data-src=unicorn.jpg /> (anstelle von src , srcset oder <source> ) verwenden, um das normale Laden des Bildes durch Browser zu vermeiden, die das neue Attribut nicht unterstützen. Um solche Attribute in solche zu ändern, die mit Unterstützung des loading des Browsers verwendet werden müssen, oder um die entsprechende Bibliothek herunterzuladen, wenn dieses Attribut nicht unterstützt wird, können Sie JavaScript verwenden.

Hier ist ein Beispiel, wie dies aussehen könnte:

 <!--   ,     ,   --> <img align="center" src="hero.jpg" alt=".."/> <!--    ,     --> <img data-src="unicorn.jpg" loading="lazy" alt=".." class="lazyload"/> <img data-src="cats.jpg" loading="lazy" alt=".." class="lazyload"/> <img data-src="dogs.jpg" loading="lazy" alt=".." class="lazyload"/> <script> (async () => {   if ('loading' in HTMLImageElement.prototype) {       const images = document.querySelectorAll("img.lazyload");       images.forEach(img => {           img.src = img.dataset.src;       });   } else {       //    LazySizes       const lazySizesLib = await import('/lazysizes.min.js');       //  LazySizes ( data-src & class=lazyload)       lazySizes.init(); // lazySizes    ,   .   } })(); </script> 

Betrachten Sie einige der Funktionen dieses Codes:

  • Bilder, die für den Benutzer unmittelbar nach dem <img> der Seite sichtbar sind, werden mit regulären <img> -Tags beschrieben. Wenn Sie das Attribut data-src ohne src werden Bilder nicht sofort nach dem Laden der Seite angezeigt. Wenn Sie also die Bilder src , die unmittelbar nach dem Laden der Seite sichtbar sein sollen, müssen Sie das Attribut src angeben.
  • Bei der Beschreibung von Bildern, die nach dem Laden der Seite für den Benutzer nicht sofort sichtbar sind, verwenden wir das Attribut data-src . Dies geschieht, um zu verhindern, dass sie in Browsern, die das Ladeattribut nicht unterstützen, normal geladen werden. Wenn der Browser dieses Attribut unterstützt, ändern wir data-src in src .
  • Wenn das Ladeattribut nicht unterstützt wird, laden wir die Hilfsbibliothek (lazySizes) und initialisieren sie. Hier verwenden wir class=lazyload , um die LazySizes-Bibliothek auf die Bilder zu verweisen, mit denen wir mithilfe der Lazy-Loading-Technik arbeiten möchten.

Demo


Hier können Sie sich ein Beispiel einer Seite ansehen, auf der 100 Bilder von Katzen verzögert geladen werden. Aber bei Interesse die Video-Downloads dieser Seite.

Implementierungsfunktionen zum Laden der Attributunterstützung in Chrome


Wir empfehlen dringend, vor der Verwendung des loading in der Produktion zu warten, bis die Unterstützung in der stabilen Version von Chrome angezeigt wird. Wenn Sie diese Gelegenheit nutzen möchten, interessiert Sie vielleicht, worüber wir sprechen werden.

Attributtest wird geladen


Um das neue Attribut jetzt zu erhalten, rufen Sie die Seite mit den Einstellungen für Chrome-Flags ( chrome://flags ) auf, aktivieren Sie die chrome://flags Enable lazy frame loading aktivieren und zum Enable lazy frame loading Enable lazy image loading aktivieren und starten Sie den Browser neu.

Browsereinstellungen


Die Implementierung der Methode zum verzögerten Laden von Materialien in Chrome basiert nicht nur darauf, wie nahe der sichtbare Bereich der Seite an diesen Materialien liegt, sondern auch auf der Verbindungsgeschwindigkeit. Schwellenwerte zum Auslösen eines verzögerten Ladens von Materialien für unterschiedliche Verbindungsgeschwindigkeiten sind im Code fest codiert. Diese Werte können jedoch über die Befehlszeile überschrieben werden. Hier ist ein Beispiel für das Überschreiben von Einstellungen für Bilder:

 canary --user-data-dir="$(mktemp -d)" --enable-features=LazyImageLoading --blink-settings=lazyImageLoadingDistanceThresholdPxUnknown=5000,lazyImageLoadingDistanceThresholdPxOffline=8000,lazyImageLoadingDistanceThresholdPxSlow2G=8000,lazyImageLoadingDistanceThresholdPx2G=6000,lazyImageLoadingDistanceThresholdPx3G=4000,lazyImageLoadingDistanceThresholdPx4G=3000 'https://mathiasbynens.be/demo/img-loading-lazy' 

Der obige Befehl entspricht den aktuellen Standardeinstellungen. Damit das Laden von Bildern beginnt, wenn die Bildlaufposition der Seite 400 Pixel vom Bild entfernt ist, müssen alle Werte in diesem Befehl in 400 geändert werden. Das Folgende ist ein Beispiel für eine 1-Pixel-Variation dieses Befehls (diese Einstellung wird im obigen Video verwendet )

 canary --user-data-dir="$(mktemp -d)" --enable-features=LazyImageLoading --blink-settings=lazyImageLoadingDistanceThresholdPxUnknown=1,lazyImageLoadingDistanceThresholdPxOffline=1,lazyImageLoadingDistanceThresholdPxSlow2G=1,lazyImageLoadingDistanceThresholdPx2G=1,lazyImageLoadingDistanceThresholdPx3G=1,lazyImageLoadingDistanceThresholdPx4G=1 'https://mathiasbynens.be/demo/img-loading-lazy' 

Es ist sehr wahrscheinlich, dass sich die Standardkonfiguration für das verzögerte Laden in Chrome ändert, da sich die Implementierung dieser Funktion in den kommenden Wochen stabilisiert.

Entwicklertools


Merkmale der Implementierung der Unterstützung für das loading in Chrome sind, dass der Browser beim Laden der Seite die ersten 2 KB Bilder vom Server anfordert, wenn er die Bereichsanforderungstechnologie unterstützt. Die ersten 2-KB-Bilder enthalten wahrscheinlich Informationen zu ihrer Größe. Auf diese Weise kann der Browser Platzhalter mit Größen generieren, die den Größen der Bilder entsprechen. Wenn wir in diesen 2K über kleine Bilder wie Symbole sprechen, ist es außerdem sehr wahrscheinlich, dass das gesamte Bild enthalten ist.


Laden von Fragmenten von Grafikdateien

Chrome lädt die verbleibenden Bilddaten herunter, sobald der Benutzer kurz davor ist, sie zu sehen. Wenn Sie mit Entwicklertools arbeiten, kann dies dazu führen, dass Informationen zu zwei Bilddownloads im Netzwerkfenster angezeigt werden und Informationen zu zwei Anforderungen, die zum Herunterladen jedes Bilds ausgeführt werden, im Ressourcenzeitfenster angezeigt werden.

Browser-Support-Server, der das Ladeattribut definiert


Wenn wir in einer perfekten Welt leben, können Sie sich nicht auf die Browseranalyse mit clientseitigem JavaScript verlassen, um herauszufinden, ob Sie die Hilfsbibliothek für die korrekte Seitenausgabe in einem Browser verwenden müssen. Bei diesem Ansatz würde der Server, der im Voraus weiß, ob eine solche Bibliothek benötigt wird oder nicht, diese in die an den Browser gesendete Seite aufnehmen (oder nicht einschließen). Eine solche Überprüfung kann mithilfe der HTTP-Client-Hinweis- Technologie ermöglicht werden, mit der der Client „Hinweise“ zu seinen Funktionen an den Server senden kann.

Der entsprechende „Hinweis“ zur Unterstützung des loading befindet sich derzeit in einem frühen Stadium.

Zusammenfassung


Der Autor dieses Materials lädt alle ein, die daran interessiert sind, das loading bei der Arbeit mit den Elementen <img> und <iframe> verwenden, um es auszuprobieren und ihre Eindrücke damit zu teilen. Er ist besonders daran interessiert zu erfahren, wie aus Sicht der Entwickler die hier vorgeschlagenen browserübergreifenden Unterstützungsmechanismen für das verzögerte Laden von Daten aussehen und ob er einige Grenzfälle übersehen hat, wenn er über solche Mechanismen spricht.

Liebe Leser! Planen Sie, das loading in Ihren Projekten zu verwenden?

Source: https://habr.com/ru/post/de448914/


All Articles