Ускорение сайта за счет ленивой загрузки изображений. пример реализации image lazy loading
Содержание:
- Другие отличные плагины для включения ленивой загрузки
- Lazy Loading and CDN
- Как реализовать
- Методы, которые использовались до встроенной ленивой загрузки
- Что такое ленивая загрузка
- General purpose lazy loading
- Какие проблемы могут возникнуть при реализации
- Usage
- Avoid lazy-loading images that are in the first visible viewport #
- ? Notable features
- More than images
- Usage
- Принцип работы атрибута loading
- Как использовать отложенную загрузку в WordPress
Другие отличные плагины для включения ленивой загрузки
Lazy Load Optimizer — это бесплатный WordPress плагин ленивый загрузки изображений. Он поддерживает ленивую загрузку содержимого, вставленного из внешних источников на веб-страницу. Более того, он совместим с WooCommerce.
Из панели администратора WordPress установите и активируйте плагин Lazy Load Optimizer.
Затем перейдите в раздел Настройки > Lazy Load Optimizer
Включите контент, который вы хотите обработать на странице общих настроек и сохраните изменения.
Crazy Lazy — это простой и легкий в использовании плагин WordPress для реализации ленивой загрузки.
Он выполняет все основные функции, ожидаемые от плагина ленивой загрузки.
Все, что вам нужно сделать, это загрузить, установить и активировать плагин. И он готов к использованию.
Этот плагин может лениво загружать изображения, видео и iframes, а также заменяет видео YouTube с помощью миниатюр.
Чтобы использовать этот плагин, вы должны загрузить его из раздела «плагины» на панели администратора WordPress.
Затем перейдите в раздел Настройки> Lazy Load на панели мониторинга.
Проверьте все элементы, которые вы хотите лениво загрузить.
Сохраните внесенные изменения.
Ленивая загрузка для видео работает на встроенных видео Youtube и Vimeo. Он помогает отложить загрузку видео, когда пользователи нажимают на изображение предварительного просмотра. Он также работает с WordPress Multisite и другими плагинами.
Загрузите плагин Lazy Load for Videos с панели администратора WordPress.
Перейдите в Настройки> Lazy Load for Videos на панели мониторинга.
На странице «общие / стиль» вы можете настроить параметры для вашего сайта.
Обязательно проверьте «отзывчивый режим», чтобы улучшить отзывчивость на всех устройствах.
Затем сохраните внесенные изменения.
Этот плагин поддерживает другие настройки, такие как:
- Отключение отложенной загрузки для видео Youtube и Vimeo.
- Отображение заголовков видео на Youtube и Vimeo.
- Добавление пользовательского CSS.
WP YouTube Lyte позволяет добавлять лениво загруженные видео Youtube. Если вы хотите лениво загружать только видео с Youtube, это отличное решение для вас. Этот плагин работает на всех устройствах.
Чтобы использовать WP YouTube Lyte, вам необходимо скачать, установить и активировать его на своем сайте.
Нажмите на Настройки > WP YouTube Lyte на панели управления.
Просмотрите все параметры настройки на странице «основные настройки» и отметьте их соответствующим образом.
Обязательно введите свой ключ API YouTube. Это позволяет плагину функционировать оптимально.
Затем нажмите на кнопку «Сохранить изменения».
Lazy Loading and CDN
Lazy loading and content delivery networks (CDNs), such as Imperva’s CDN, are two ways to improve page load time and optimize the end-user experience. A CDN helps by placing resources on a cache server closer to the user, allowing them to access it much faster.
How does lazy loading compare to a CDN for website performance optimization?
- Lazy loading avoids unnecessary resource downloads or code execution. However it can’t help when the user actually requests large or numerous resources.
- A CDN caches resources and can serve them to users much faster – but it may transmit unnecessary resources which users don’t actually need.
Как реализовать
Рекомендации Google по реализации lazy loading для картинок
Рекомендации Google для картинок зависят от способа реализации медиаконтента на сайте: встроенные или в CSS. Для встроенных в тег в Справке поисковой системы рекомендуется использовать:
- обработчик событий (например, scroll или resize) – он подходит, если важна совместимость браузеров;
- API-интерфейса обозревателя пересечений – не нужно писать свой код, достаточно зарегистрировать наблюдателя, однако работает не на всех браузерах.
Изображения на страницах также могут быть реализованы через CSS. В отличие от тегов, которые загружаются независимо от их видимости, загрузка изображений в CSS выполняется с большим количеством предположений. Прежде чем запрашивать внешние ресурсы, браузер проверяет, как CSS применяется к документу.
Это может быть использовано для отсрочки загрузки изображений в CSS. С помощью JavaScript можно определить, когда элемент находится в области просмотра, и загрузить фоновое изображение.
Готовые решения
В сети есть 5 готовых решений реализации «отложенной загрузки» для изображений:
Lazy loading от David Walsh
Это стандартный и наиболее простой вариант реализации «отложенной загрузки». Действие скрипта заключается в том, что он заменяет атрибут src на data-src в теге . Реализация выглядит следующим образом:
Элементы img, содержащие атрибуты data-src, скрыты в CSS. После того как картинки будут загружены, они плавно отображаются с применением переходов:
Затем JavaScript передаёт всем тегам img атрибут src, которые в итоге получают значение атрибута data-src. После загрузки всех изображений, data-src убирается из img:
Загрузка с прогрессивным улучшением от Robin Osborne
Разработчик предлагает «ленивую загрузку» на основе прогрессивного улучшения. В его решении lazy loading на JS будет считаться улучшением для HTML и CSS.
При этом ленивая загрузка работает посредством скроллинга, а при реализации не нужно использовать фреймворки или плагины. При прогрессивном улучшении пользователь увидит изображение, даже если скрипт отключён или появилась ошибка, блокирующая его работу.
Плагин bLazy.js на простом JS
Стандартная реализация отложенной загрузки этим методом выглядит так:
Среди преимуществ скрипта: он мало весит, работает с несколькими изображениями одновременно, чтобы сэкономить трафик и уменьшить количество запросов на сервер. Также он поддерживает браузеры устаревших версий, в том числе IE 7 и 8 версии.
Плагин Lazy Load XT jQuery
Подойдёт для написания своего скрипта для «ленивой загрузки». Если нужно реализовать lazy loading только для картинок, рекомендуем воспользоваться упрощённой версией.
Для реализации «отложенной загрузки» с помощью этого плагина нужно добавить jQuery-библиотеку перед закрывающимся тегом и указать jquery.lazyloadxt.js.
Есть альтернативный вариант, который позволяет не использовать весь плагин. Это облегчённый скрипт jqlight.lazyloadxt.min.js:
Плагин активируется автоматически или в ручном режиме. В последнем случае нужно ввести:
Размытое изображение от Craig Buckler
Есть несколько вариантов реализации «ленивой загрузки» с эффектом размытости. Наиболее популярный и простой в реализации – Craig Buckler.
У техники высокая производительность: затрачивает немного больше 1 байта JS-кода и 463 байта CSS. Для работы не нужны дополнительные фреймворки или библиотеки. Есть прогрессивное улучшение для поддержки устаревших браузеров или подгрузки картинок при сломанном JavaScript.
Посмотреть код можно в репозитории на GitHub.
3 плагина для WordPress
BJ Lazy Load
Количество установок: более 90 тыс. Последнее обновление: год назад.
С помощью этого плагина можно отложить загрузку картинок в постах, изображений из миниатюр, фотографий пользователей. Контент будет подгружаться по мере приближения к окну браузера при прокрутке страницы.
Lazy Load by WP Rocket
Количество установок: более 20 тыс. Последнее обновление: 17 часов назад.
Плагин работает с миниатюрами, всеми изображениями. Подгружает контент только тогда, когда он становится видимым пользователю. Вес скрипта – 10 КБ. Не использует JavaScript библиотеку jQuery.
Loading Page with Loading Screen
Количество установок: более 10 тыс. Последнее обновление: 2 дня назад.
Бесплатный плагин, который выполняет предварительную загрузку изображения на сайт и отображает экран загрузки с процентом завершения. Как только всё загружено, экран пропадает.
Методы, которые использовались до встроенной ленивой загрузки
До сегодняшнего дня нам приходилось использовать JavaScript, чтобы реализовать ленивую загрузку. Большинство JavaScript-библиотек работает следующим образом:
Первоначальный ответ HTML на стороне сервера содержит элемент img без атрибута src поэтому браузер не загружает никаких данных. Вместо этого URL-адрес изображения передается с другим. Например, data-src.
HTML
<img data-src="https://tiny.pictures/example1.jpg" alt="...">
Затем загружается и выполняется библиотека ленивой загрузки.
HTML
<script src="LazyLoadingLibrary.js"></script> <script>LazyLoadingLibrary.run()</script>
Библиотека отслеживает поведение пользователя при прокрутке и заставляет браузер загрузить изображение, когда оно вот-вот появится в окне просмотра. Это реализуется путем копирования значения атрибута data-src в ранее пустой атрибут
HTML
<img src="https://tiny.pictures/example1.jpg" data-src="https://tiny.pictures/example1.jpg" alt="...">
Данный способ работает успешно. Но он не идеален. Главная его проблема многоэтапность. Реализация способа состоит из трех этапов:
- Загрузка первоначального ответа HTML.
- Загрузка библиотеки.
- Загрузка файл изображения.
Если использовать данный метод для изображений, расположенных выше сгиба, сайт станет мерцать во время загрузки. Так как первоначально сайт загружается без изображения (после первого или второго шага, в зависимости от того, какой режим использует скрипт – defer или async). И только потом подгружается изображение. Это будет восприниматься пользователями как медленная загрузка.
Кроме этого использование библиотека ленивой загрузки требует дополнительных ресурсов. И как насчет сайтов, которые используют RSS для распространения контента? Если в исходном рендеринге нет изображений, то их не будет и в RSS-версии контента.
Что такое ленивая загрузка
Lazy Load – метод, предназначенный для отложенной загрузки изображений. Фактически, изображения загружаются только тогда, когда пользователь до них долистал. Ну, или почти долистал.
Без плагинов такой тип загрузки можно подключить только с помощью написания довольно сложной структуры из смеси php/js/css. Также можно использовать готовые решения. Например, jquery.lazyload.js. Но практически все плагины с данной функцией так или иначе используют данную библиотеку. Потому, в данном случае гораздо целесообразнее использовать готовое решение.
Итак, я решил протестировать несколько плагинов, реализующих отложенную загрузку изображений. Давайте сначала посмотрим результаты без использования данной функции.
Итак, обратите внимание на вес страницы и скорость, про количество запросов тоже не забудьте. Чем их больше, тем серьезнее нагрузка на сервер
А вот здесь указан суммарный вес изображений. Тестировать все буду на одной и той же странице. Обозревать будем от худшего плагина к лучшему.
Условия таковы:
-
только бесплатные плагины;
-
доступны в репозитории WordPress;
-
обновлялись не позднее, чем пол года назад.
Поехали!
Lazy Load by WP Rocket
Довольно популярный плагин. Но его результаты не впечатлили. Вес страницы сократил минимально, зато длительность загрузки увеличил многократно. Настроить под себя невозможно, только включить интересующие функции и все.
Посмотрите на эти цифры! Это попросту кошмар. Объяснить, почему такое происходит, я так и не смог. Но затестировал даже на нескольких сайтах. Результат аналогичный. Куда смотрят тем, кто его юзает, крайне интересно.
Вес картинок сократился минимально. Фактически, никакого профита от использования данного поделия не вижу. Можете, конечно, попробовать, но если что, я предупреждал.
Smush
Популярный плагин для оптимизации медиафайлов. Предназначен для сжатия JPEG, PNG и других форматов. Но в режиме бета-тестирования запустили функцию ленивой загрузки картинок. Итак, смотрим на результат.
Я провел несколько тестирований, в итоге результат был примерно такой же.
А вот вес изображений сократился гораздо лучше. Считай на треть. Неплохой результат. Ну, функция пока что еще в разработке, так что стоит подождать, возможно, в скором будущем станет работать заметно лучше. Пока что выкладываю актуальные результаты.
WordPress Infinite Scroll — Ajax Load More
Вылезает по запросу в списке плагинов для WordPress. Ну, просто смотрите на скрины.
По-моему, отношения к нужному функционалу никакого не имеет, такие результаты уже видели в начале. Самое смешное, они все равно лучше, чем у предложенных выше вариантов.
Lazy Load Optimizer
Тут уже более менее, работает плагин на ура. Ничего не рушит, все прекрасно. Правда, чуть подтормаживает сайт, но все в пределах погрешности. Так что, претензий особо не будет.
Вес изображений сократился незначительно, так что свою функцию выполняет не лучшим образом. Игрища с настройками не помогли.
В общем, применять можно, плагин довольно мягко реализует отложенную загрузку медиафайлов. По крайней мере, вероятность конфликта не кажется высокой.
PageSpeed Ninja
О данном плагине уже рассказывал в отдельном обзоре. Можете посмотреть и познакомиться с многофункциональным и полезным плагином для ускорения сайта на WordPress. Функция ленивой загрузки у него также есть. Причем, реализована достаточно хорошо. Смотрите на результаты.
Как видите, вес страницы неплохо сократился. К тому же, количество запросов оказалось также урезано. Неплохой результат.
Тут как раз-таки наглядно видно, насколько сократился вес изображений на странице. Считай втрое. Это позволяет затрачивать меньше времени на загрузку и быстрее выдавать пользователю результат.
A3 Lazy Load
Безусловный лидер, который не сдружился сходу с некоторыми слайдерами. Но если покопаться в настройках плагина, то с проблемой можно разобраться. Фактически, по результатам — лучший вариант.
С ним получается максимальная производительность, на ресурсах, где много изображений.
Видите, насколько сильно сократился вес изображений? Крайне серьезный результат. В целом, это один из самых лучших плагинов для реализации ленивой загрузки, более крутой альтернативы так и не нашел.
Сделайте сайт быстрым
Как видите, реализовать ленивую загрузку изображений на WordPress с помощью плагинов довольно легко, выбирайте, какой вам подойдет лучше и вперед, покорять вершины скорости загрузки сайта!
General purpose lazy loading
UI-Router provides basic lazy loading capabilities using the property on a state definition.
Before the state is entered, its function is invoked.
The router waits until the promise returned by the function succeeds.
After the successful promise has resolved, the state is entered as usual.
Load moment.js before activating the `messages` state
The general purpose property has the following behavior:
- The function is invoked when the state it belongs to is being entered.
- The function receives the current and the state object ().
- The transition waits until the promise returned by the function is successful.
- The transition fails if the promise is rejected.
- Once the promise returned by is successful, the function will not be invoked again, even when the state is entered a second time.
- If the promise is not complete, but the state is about to entered a second time, the function is not invoked again.
The existing promise is used instead.
This avoids lazy loading the same code multiple times when, e.g., the user double clicks a link and starts two Transitions to the same state.
Какие проблемы могут возникнуть при реализации
Если ленивая загрузка выполнена неправильно, техника может непреднамеренно скрыть контент от Google. Это приводит к тому, что медиаконтент не может участвовать в поиске по картинкам. Сейчас Google в своей Справке рассказал, что их бот может видеть такие элементы, однако просит проверять реализацию.
Как проверить, видит ли Googlebot изображение
В руководстве Google есть рекомендации о том, как убедиться, что ПС может индексировать контент, который грузится в технике «ленивой загрузки».
Для локального тестирования можно использовать скрипт Puppeteer. Чтобы проверить скрипт и запустить его, используйте следующие команды:
После запуска проверки посмотрите скриншоты, сделанные скриптом, и убедитесь, что они содержат весь контент, который должен проиндексировать Googlebot.
Usage
First of all it’s necessary to load jQuery and Lazy Load XT script. There are two versions of Lazy Load XT:
-
, standard version for lazy loading of images only.
-
, version with included video addon for lazy loading of both images and videos.
To make media elements (, , , ) to be lazy loaded, rename attribute to .
It is highly recommended to set and attributes. Optionally you can add a placeholder to bypass
HTML validators:
<scriptsrc="jquery.js"><script><scriptsrc="jquery.lazyloadxt.js"><script><imgdata-src="lazy.jpg"width="100"height="100">
PS. In directory you can found , it is initial LazyLoadXT version of minimal size
with excluded support of on* handlers, lazy* events, option and addons.
Avoid lazy-loading images that are in the first visible viewport #
You should avoid setting for any images that are in the first visible viewport.
It is recommended to only add to images which are positioned below the fold, if possible. Images that are eagerly loaded can be fetched right away, while images which are loaded lazily the browser currently needs to wait until it knows where the image is positioned on the page, which relies on the IntersectionObserver to be available.
In Chromium, the impact of images in the initial viewport being marked with on Largest Contentful Paint is fairly small, with a regression of <1% at the 75th and 99th percentiles compared to eagerly loaded images.
Generally, any images within the viewport should be loaded eagerly using the browser’s defaults. You do not need to specify for this to be the case for in-viewport images.
? Notable features
It works with your favourite library or framework
As LazyLoad doesn’t rely on jQuery, you can use it in web applications using Angular, React or Vue.js without the need to include jQuery.
Intersection Observer API for optimized CPU usage
Instead of listening to the and events, LazyLoad uses the Intersection Observer API which is a new, blazing fast method to detect if an element is inside the browser viewport. Your users will see the difference in slow and even in fast devices or computers.
Flaky connections supported
If your users lose the internet connection causing errors on images loading, this script tries and loads those images again when the connection is restored.
Support for single and background images, and HiDPI displays
LazyLoad supports single and multiple lazy background images, with standard resolution or HiDPI (retina) displays.
More than images
Images are not the only page elements that may be lazy loaded. Though default value for is
, you can append it by to use lazy-loading for iframes, for videos,
etc. Full list of supported tags include all tags with attribute: , , ,
, , , .
We distribute special «extra» version of the plugin with additional code for lazyloading of elements and
ed YouTube videos. To use this version, it’s necessary to just load instead of
.
Most of video hostings allow to embed videos as elements (e.g. Youtube, Vimeo, DailyMotion, and even KickStarter)
and they may be lazy loaded in the way similar to images (by replacing attribute by ):
<scriptsrc="jquery.lazyloadxt.extra.js"><script>
<iframewidth="420"height="315"data-src="//www.youtube.com/embed/uOzO9O15gwI?rel=0"frameborder=""allowfullscreen><iframe>
It is easy too, just replace attribute by and by (if exists).
<scriptsrc="jquery.lazyloadxt.extra.js"><script>
<videodata-poster="/path/to/poster.jpg"width="320"height="240"controls><sourcedata-src="/path/to/video.mp4"type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'><sourcedata-src="/path/to/video.ogv"type='video/ogg; codecs="theora, vorbis"'></video><videodata-src="/path/to/video2.mp4"width="320"height="240"controls><video>
Usage
import React from 'react'; import ReactDOM from 'react-dom'; import LazyLoad from 'react-lazyload'; import MyComponent from './MyComponent'; const App = () => { return ( <div className="list"> <LazyLoad height={200}> <img src="tiger.jpg" > /* Lazy loading images is supported out of box, no extra config needed, set `height` for better experience */ <LazyLoad> <LazyLoad height={200} once > /* Once this component is loaded, LazyLoad will not care about it anymore, set this to `true` if you're concerned about improving performance */ <MyComponent > <LazyLoad> <LazyLoad height={200} offset={100}> /* This component will be loaded when it's top edge is 100px from viewport. It's useful to make user ignorant about lazy load effect. */ <MyComponent > <LazyLoad> <LazyLoad> <MyComponent > <LazyLoad> <div> ); }; ReactDOM.render(<App >, document.body);
If you want to have your component lazyloaded by default, try this handy decorator:
import { lazyload } from 'react-lazyload'; @lazyload({ height: 200, once: true, offset: 100 }) class MyComponent extends React.Component { render() { return <div>this component is lazyloaded by default!<div>; } }
Принцип работы атрибута loading
В отличие от JavaScript-библиотек, встроенная ленивая загрузка использует предварительный запрос для получения первых 2048 байт файла изображения. С их помощью браузер пытается определить размеры изображения, чтобы вставить невидимый заполнитель для полного изображения и предотвратить скачок контента во время загрузки.
Событие load запускается, как только загружается полное изображение после первого запроса (для изображений размером менее 2 КБ) или после второго. Это событие может не запускаться для определенных изображений, из-за того, что не выполняется второй запрос.
Возможно, в будущем браузеры будут делать в два раза больше запросов на изображения. Сначала запрос Range, затем запрос целиком.
Убедитесь, что ваши серверы поддерживают HTTP-заголовок Range: 0-2047 и ответьте кодом состояния 206 («Частичный контент»), чтобы исключить доставку полноразмерного изображения дважды.
Поговорим об отложенном контенте. Движок рендеринга Chrome Blink определяет, загрузку какого контента и на какой срок следует отложить. Полный список требований можно найти в документации. Ниже приводится краткое описание ресурсов, загрузка которых может быть отложена:
- Изображения и фреймы на всех платформах, на которых установлено loading=»lazy».
- Изображения на Chrome для Android, где включен Data Saver и которые удовлетворяют следующим требованиям:
- loading=»auto» или значение unset;
- атрибуты width и height больше 10px;
- не созданы программно с помощью JavaScript.
- Фреймы, которые удовлетворяют следующим требованиям:
- loading=»auto» или значение unset;
- из стороннего источника (домен или протокол, который отличается от тех, что были на странице встраивания);
- если высота и ширина превышает 4 пикселя (чтобы предотвратить отложенную загрузку небольших следящих фреймов);
- если для фреймов не установлено display: none или visibility: hidden (чтобы предотвратить отложенную загрузку небольших следящих фреймов);
- если они не расположены за границами экрана из-за отрицательных координат x или
Как использовать отложенную загрузку в WordPress
Можно добавить ленивую загрузку на WordPress- сайт с помощью плагинов или Javascript. Оба варианта дают схожие результаты.
Вариант 2. Использование JavaScript-библиотеки ленивой загрузки
Если вы хотите использовать JavaScript- библиотеку, есть много вариантов:
- react-lazyload – библиотека отложенной загрузки React, не использует Intersection Observer.
- js – использует только Intersection Observer, суперлегкая.
- blazy – тоже легкая, но не использует Intersection Observer.
- js – использует Intersection Observer и обработчики событий.
- lazysizes – подходит для ленивой загрузки видео и фреймов.
Также можно использовать jQuery, так как эта библиотека уже содержится в ядре WordPress.
Вариант 3. Использование плагина отложенной загрузки
Самый простой способ добавить ленивую загрузку на свой сайт – это использовать специализированный WordPress- плагин. Большинство платных плагинов для оптимизации изображений (например, Smush Pro) имеют встроенный функционал ленивой загрузки. Также мы добавили ее в бесплатную версию Smush, размещенную на WordPress.org.
Мы сделали процесс активации ленивой загрузки в плагине Smush предельно простым. Все, что нужно сделать, это перейти в раздел «Ленивая загрузка» плагина Smush Pro и нажать кнопку «Активировать».
Установите Smush Pro и активируйте ленивую загрузку меньше, чем за две минуты