Ленивые блоки, которые грузятся при прокрутке, экономят окно первой отрисовки. Но у них есть побочный эффект, который в PageSpeed не виден вообще: поисковый робот страницу не прокручивает. Если блок грузится только при приближении к экрану, робот его не увидит никогда — и содержимое блока не попадёт в индекс.

Это одиннадцатая часть цикла «PageSpeed без мифов» — про оборотную сторону ленивой загрузки.

Как мы это обнаружили

На каталоге техники часть контента — подборки, характеристики, отзывы — приходила ленивыми блоками. Посетители видели всё, оценка была хорошей. Мы посмотрели журнал сервера за неделю: 259 заходов Googlebot — и ни одного запроса за содержимым блоков. Робот рендерит страницу с JavaScript, но делает это в высоком окне без прокрутки: наблюдатель за приближением к экрану для дальних блоков просто не срабатывает.

Цена ошибки невидима. Ни PageSpeed, ни браузер, ни посетители не покажут проблему. Тексты блоков просто отсутствуют в поиске, и узнать об этом можно только по журналу сервера или проверкой «глазами робота».

Лечение: второй путь загрузки

Решение то же, что в десятой части: кроме наблюдателя, у блоков должна быть фоновая догрузка, которая после первой отрисовки по очереди загружает все оставшиеся блоки — без всякой прокрутки. Она нужна и быстрым посетителям, и роботу.

После этой правки проверка «глазами робота» на том же каталоге: 8 запросов блоков, все 7 контейнеров на странице заполнены.

Как проверить свой сайт

  1. Журнал сервера. Найдите заходы поискового робота на страницы и посмотрите, идут ли следом запросы за содержимым блоков (обычно это ajax-запросы). Нет запросов — робот блоков не видит.
  2. Проверка «глазами робота». Откройте страницу в браузере под управлением скрипта (например, Puppeteer) с user-agent робота, высоким окном и без прокрутки. Подождите 10–15 секунд и посчитайте заполненные блоки.
  3. Инструменты поисковиков. «Проверка URL» в Search Console и аналог в Яндекс.Вебмастере показывают отрисованный HTML — ищите в нём тексты из блоков.
// Puppeteer: что увидит робот без прокрутки
const page = await browser.newPage();
await page.setUserAgent("Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)");
await page.setViewport({ width: 412, height: 3000 });
await page.goto(url, { waitUntil: "networkidle0" });
await new Promise(r => setTimeout(r, 10000));
const filled = await page.$$eval("[data-lazy-block]", els => els.filter(e => e.children.length).length);
console.log("заполнено блоков:", filled);

Чего делать не надо

  • Не отключайте ленивую загрузку «для роботов» по user-agent. Отдавать роботу и людям разные страницы — путь к проблемам с поиском. Фоновая догрузка решает задачу одинаково для всех.
  • Не грузите все блоки сразу «чтобы робот увидел». Это вернёт их вес в окно первой отрисовки и обрушит оценку. Порядок такой: первый экран → ворота → фоновая догрузка.
А если контент блока нужен поиску особенно сильно?

Тогда лучше выводить его прямо в HTML страницы, а ленивой загрузкой отдавать только тяжёлое — картинки, слайдеры, интерактив. Текст почти ничего не весит и окно первой отрисовки не портит.

Не уверены, что поиск видит ваши блоки?

Пришлите адрес — проверю страницу «глазами робота» и по журналу сервера.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.