Почему мы Услуги Портфолио Блог Технологии Процесс разработки Начать проект →
UA EN RU
← Все статьи
Разработка · 30.10.2019 · 6 мин чтения

Как вернуть сайт в «зелёную зону» Google PageSpeed

С 2017 года Google оценивает не выполнение рекомендаций, а фактическую скорость загрузки. Рассказываем, какие работы вернули сайты заказчиков в «зелёную зону» PageSpeed и сколько баллов дал каждый шаг.
Как вернуть сайт в «зелёную зону» Google PageSpeed

С 2017 года Google изменил политику оценки скорости загрузки страниц. Раньше баллы начисляли за выполнение рекомендаций, которые инструмент показывал после аудита: сжал изображения, CSS и JS, избавился от ресурсов, блокирующих рендеринг, — молодец, пункты выполнены, баллы набраны. Теперь инструмент измеряет фактическую скорость загрузки, момент первого появления контента и то, как быстро пользователь может начать взаимодействовать со страницей. По новым критериям большинство сайтов просело по показателям, поэтому мы провели ряд мероприятий, чтобы вернуть оценки сайтов заказчиков в «зелёную» зону.

Что изменилось в оценке Google

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

Как было до 2017 года

Баллы начисляли за выполнение рекомендаций, которые инструмент показывал после аудита. Сжал изображения, CSS и JS, избавился от ресурсов, блокирующих рендеринг страницы, — пункт закрыт, баллы зачтены. При таком подходе набрать «зелёную зону» было несложно.

Как стало сейчас

Инструмент измеряет актуальную скорость загрузки страницы, первое появление контента и то, как быстро пользователь может начать взаимодействовать со страницей. Формальное выполнение пунктов из отчёта само по себе уже ничего не гарантирует.

Что такое «зелёная зона». Это больше 90 баллов из 100. После изменения критериев оценки большинство сайтов просело по показателям, и возвращение в зелёное превратилось в отдельную техническую работу.

CSS и JS: главные ресурсы, блокирующие отображение

Наибольшую просадку по скорости дают скрипты, изображения и CSS — именно они являются ресурсами, блокирующими отображение страницы.

Хороший прирост производительности дало подключение JS через тег <script> с атрибутами async и defer, когда загрузка скриптов происходит вместе с загрузкой страницы, а разбор и выполнение — после.

Но здесь стоит понимать, с каким именно скриптом мы имеем дело. Прежде чем вешать атрибуты, проверяем три вещи:

  • самодостаточен ли этот скрипт;
  • есть ли у него зависимости от других скриптов;
  • полагается ли он на полностью разобранный DOM.
Осторожно. В случаях, когда скрипт не самодостаточен, подключение с атрибутами async и defer будет вызывать ошибки.

Второй момент — подключение средствами фреймворка

Большинство скриптов подключается методами самого фреймворка: в корпоративных CMS для этого предусмотрена собственная конструкция. При таком подключении мы получаем все «плюшки» — автоматическое объединение скриптов, сжатие и подключение gzip-версии скрипта, если соответствующие опции включены в админпанели, а сервер настроен с возможностью отдавать .gz файлы.

Подключая скрипты через тег <script>, мы этих преимуществ лишаемся. Решение — CompressionWebpackPlugin: он создаст сжатую gzipped-копию JS-сборки рядом с основной. Результат — файлы, сжатые более чем втрое.

Сравнение размера JS-файлов до и после gzip-сжатия сборки
Сжатая gzipped-копия JS-сборки лежит рядом с основной: файлы уменьшаются более чем втрое.

Что ещё стоит сделать с CSS и JS

  • подключать JS и CSS, которые используются только на конкретных страницах, если такая возможность есть;
  • минимизировать CSS и JS — это обязательное условие, а не пожелание;
  • по возможности делать отложенную загрузку внешних скриптов.

В сумме асинхронное подключение скриптов добавило около 15 баллов в PageSpeed, а минимизация CSS и JS — ещё 12.

Подключение только нужных модулей

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

Это может сэкономить до 300 КБ в финальной сборке — вес, который пользователь иначе качал бы впустую.

Шрифты

Google требует, чтобы текст был виден как можно раньше во время загрузки страницы. Поэтому, когда на проекте используются нестандартные шрифты, их нужно загружать отложенно, показывая сначала стандартный.

  1. Подключение. Шрифты подключаем через @font-face.
  2. Асинхронная подгрузка. За неё отвечает свойство font-display.
  3. Выбор значения. У font-display есть разные значения, но лучшие показатели по скорости получаем с font-display: fallback.

Подключение шрифтов таким способом может дать 15–20 баллов.

Изображения

Логично, что чем меньше весит картинка, тем быстрее она загружается. Google продвигает собственный формат изображений .webp, поэтому для изображений на сайте нужно сделать их webp-копии, а подключать в шаблонах через тег <picture>, указав внутри два источника — обычную картинку и картинку .webp. Новый формат работает в большинстве современных браузеров, но не в Safari — именно поэтому второй источник обязателен.

Также можно сделать отложенную загрузку изображений — с помощью плагина jQuery Lazy или через IntersectionObserver.

Отложенная загрузка GTM

Этот пункт мы вынесли отдельно, потому что вместе с GTM может подтягиваться ещё тонна внешних маркетинговых скриптов — и все они способны дать сильную просадку по скорости.

Поэтому подключение GTM можно выполнить через setTimeout, секунды на три, с атрибутами async и defer.

Не в одиночку. Такой вариант подключения стоит предварительно обсудить со специалистами по SEO — решение касается не только скорости.

Сколько баллов дал каждый шаг

90+
баллов из 100 — граница «зелёной зоны»
~15
баллов дало асинхронное подключение скриптов
12
баллов добавила минимизация CSS и JS
15–20
баллов даёт правильное подключение шрифтов
300 КБ
экономии на импорте отдельных компонентов
×3
сжатие JS-сборки gzip-копией

Итог на примере intertop.ua

Вот как все перечисленные меры выглядят вместе на реальном проекте.

Показатели Google PageSpeed для intertop.ua после оптимизации
Показатели Google PageSpeed для intertop.ua после проведённых работ.
Детализация отчёта Google PageSpeed для intertop.ua
Детализация отчёта: скорость загрузки и момент, когда страница становится доступной для взаимодействия.

Чек-лист и что дальше

МераЧто делаемЧто это даёт
CSS и JSasync и defer, минимизация, постраничное подключение, gzipped-копия сборкиоколо 15 баллов за асинхронность и ещё 12 за минимизацию
Модулиимпортируем отдельные компоненты вместо целой библиотекидо 300 КБ экономии в финальной сборке
Шрифты@font-face плюс font-display: fallback15–20 баллов
Изображенияwebp-копии через <picture> и отложенная загрузкаменьший вес страницы и более быстрый показ контента
GTMподключение через setTimeout с async и deferснимает просадку от внешних маркетинговых скриптов

Главный вывод из этой истории простой: догонять показатели постфактум всегда дороже, чем заложить их в проект сразу.

Теперь мы проводим оптимизацию под PageSpeed ещё на этапе создания сайтов, чтобы сразу достигать лучших показателей.Богдан Панасенко / Front-end разработчик