Ленивые блоки, которые грузятся при прокрутке, экономят окно первой отрисовки. Но у них есть побочный эффект, который в PageSpeed не виден вообще: поисковый робот страницу не прокручивает. Если блок грузится только при приближении к экрану, робот его не увидит никогда — и содержимое блока не попадёт в индекс.
Это одиннадцатая часть цикла «PageSpeed без мифов» — про оборотную сторону ленивой загрузки.
Как мы это обнаружили
На каталоге техники часть контента — подборки, характеристики, отзывы — приходила ленивыми блоками. Посетители видели всё, оценка была хорошей. Мы посмотрели журнал сервера за неделю: 259 заходов Googlebot — и ни одного запроса за содержимым блоков. Робот рендерит страницу с JavaScript, но делает это в высоком окне без прокрутки: наблюдатель за приближением к экрану для дальних блоков просто не срабатывает.
Цена ошибки невидима. Ни PageSpeed, ни браузер, ни посетители не покажут проблему. Тексты блоков просто отсутствуют в поиске, и узнать об этом можно только по журналу сервера или проверкой «глазами робота».
Лечение: второй путь загрузки
Решение то же, что в десятой части: кроме наблюдателя, у блоков должна быть фоновая догрузка, которая после первой отрисовки по очереди загружает все оставшиеся блоки — без всякой прокрутки. Она нужна и быстрым посетителям, и роботу.
После этой правки проверка «глазами робота» на том же каталоге: 8 запросов блоков, все 7 контейнеров на странице заполнены.
Как проверить свой сайт
- Журнал сервера. Найдите заходы поискового робота на страницы и посмотрите, идут ли следом запросы за содержимым блоков (обычно это ajax-запросы). Нет запросов — робот блоков не видит.
- Проверка «глазами робота». Откройте страницу в браузере под управлением скрипта (например, Puppeteer) с user-agent робота, высоким окном и без прокрутки. Подождите 10–15 секунд и посчитайте заполненные блоки.
- Инструменты поисковиков. «Проверка 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 страницы, а ленивой загрузкой отдавать только тяжёлое — картинки, слайдеры, интерактив. Текст почти ничего не весит и окно первой отрисовки не портит.
Не уверены, что поиск видит ваши блоки?
Пришлите адрес — проверю страницу «глазами робота» и по журналу сервера.
// загружаю комментарии…