Lazy loading — паттерн оптимизации веб-страниц: ресурсы (изображения, видео, скрипты) загружаются не при открытии страницы, а при необходимости — когда элемент приближается к видимой области экрана (viewport). Сокращает начальное время загрузки и экономит трафик для пользователей, которые не долистывают страницу до конца.
Как работает
Нативный lazy loading в HTML5 (с 2019–2020 года): атрибут loading="lazy" для <img> и <iframe>. Браузер сам определяет, когда загружать ресурс (обычно за 1250 пикселей до viewport). Поддерживается Chrome 77+ (2019), Firefox 75+ (2020), Safari 15.4 (2022).
Intersection Observer API — JavaScript-механизм для кастомного lazy loading. Позволяет наблюдать за видимостью элемента и загружать ресурс при пересечении с viewport: new IntersectionObserver(callback, {rootMargin: '500px'}). Более гибко, чем нативный loading="lazy".
SEO-аспект: Google с 2021 года полностью поддерживает нативный lazy loading — Googlebot ждёт прокрутки и загружает lazy-изображения при индексировании. Ключевое изображение «above the fold» (выше линии прокрутки) не должно быть lazy — это замедлит LCP (Largest Contentful Paint).
История
Концепция lazy loading применялась в программировании задолго до веба (Lazy initialization, Gang of Four, 1994). В вебе jQuery-плагины (lazyload.js, 2007) реализовывали паттерн через событие scroll. В 2019 году Chrome 77 добавил нативную поддержку через атрибут loading. В 2020 году этот атрибут стандартизирован в HTML Living Standard (WHATWG).
Lazy loading: реализация и инструменты
Нативный lazy loading в HTML5: и
Intersection Observer API — современный способ реализации lazy loading через JS: observer срабатывает когда элемент входит в viewport, минимальное влияние на производительность. lazysizes (GitHub, 3.5К звёзд) — библиотека с поддержкой адаптивных изображений (srcset), LQIP (Low Quality Image Placeholder), автодетектом расстояния. WordrPress плагины: WP Rocket (платный, включает lazy load), a3 Lazy Load (бесплатный). LCP (Largest Contentful Paint) — критичный для Core Web Vitals: hero image НЕ должна иметь loading="lazy".
На что обращать внимание
Ошибка: установить lazy loading на все изображения, включая «above the fold». Hero-изображение в заголовке с loading="lazy" ухудшает LCP на 0.5–2 секунды. Правило: первые 1–3 изображения на странице — без lazy loading, остальные — с. Приоритизация: добавить fetchpriority="high" для LCP-изображения. Интеграция с CDN: lazy loading и CDN — взаимодополняющие техники; CDN снижает latency при загрузке, lazy loading снижает число загрузок.
Lazy loading и производительность хостинга
Lazy loading снижает нагрузку на origin-сервер и на nginx: браузер не запрашивает изображения ниже fold'а при первой загрузке страницы. Для WordPress: плагин Smush, WP Rocket или нативный атрибут loading=lazy (с WordPress 5.5). При 100 изображений на странице без lazy loading — все 100 запросов уходят на сервер при открытии. С lazy loading — только 3-5 видимых изображений. CDN обрабатывает запросы к изображениям эффективнее origin-сервера. Влияние на Core Web Vitals: lazy loading улучшает LCP (Largest Contentful Paint) за счёт освобождения пропускной способности. HTML5 атрибут loading="lazy" поддерживается всеми современными браузерами без JS. Для видео используйте <video preload="none">. HTTPS обязателен для Service Worker, который управляет lazy loading и кэшированием ресурсов. На VPS: настройте кэширование статики в nginx для снижения числа запросов к origin.