Оптимизация скорости загрузки

Шаг 1. Постановка цели

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

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

Стоит сфокусироваться на тех сайтах или страницах, которые влияют на ваши целевые показатели.

Шаг 2. Сбор статистики и выбор узкого места для оптимизации

Во-первых, обратимся к событиям, вызываевым на разных стадиях загрузки страницы:

Диаграмма времени загрузки

Современные браузеры поддерживают Navigation Timing API, который предоставляет информацию, когда произошло конкретное событие в течение загрузки страницы.

Метрики можно смотреть на локальном компьютере либо собирать их с клиента на сервер и затем делать выводы. У обоих подходов есть плюсы и минусы, давайте их рассмотрим.

Фактор сравнения Отслеживание на локальном компьютере Развёртывание сервера и выводы в дальшейнем
Порог входа Не требует установки дополнительного ПО Требует сервера приёма метрик и их анализа
Реальность значений Только модель, нет конкретных значений Данные собраны с реальных пользователей
Точность результатов Результаты меняются от измерения к измерению Чем больше посещений страниц, тем точнее результат

Возможно применение сервисов, которые позволят собрать реальные данные, не тратя время на равёртывание сервиса сбора метрик. Например, google analytics и её отчёт по скорости.

Субьективно все инструменты делятся на 4 типа:

  • встроенные в браузер (debug панель FireFox, Chrome);
  • одноразовые сервисы - одно измерение, не отражающее действительность в силу их статической незначимости;
  • скрипты сбора статистики, встроенные в счётики (Яндекс Метрика, Google Analytics);
  • управляемый сбор статистики путём имитации клиента sitespeed.io.

Например, google analytics по умолчанию собираются метрики по времени загрузки с 1% пользователей.

При большом количестве просмотров страниц метрики начинают показывать стабильные результаты.

Но как их улучшить?

Шаг 3. Выявление узкого места

В оптимизации важно применить усилие в нужное место.

Вариант “за дёшево”

Заходим в Chromium, запускаем вкладку Audits

Запуск Audit в Chromium

Через несколько секунд получаем результат

Результат Audit в Chromium

Lighthouse, встроенный в инструменты разработчика Chromium, отсортировал для нас факторы оптимизации в порядке приносимых эффектов.

В данном примере рекомендуют минимизировать работу в главном потоке путём минимизации выполнения JS.

Вариант “по статистическим данным”

В google analytics находим отчёт по скорости загрузки страниц.

Для наглядности на основе данных я построил диаграмму Page timings

Видно, что узкое место - время ответа сервера. На втором месте - переадресация.

В таком же порядке стоит начать оптимизировать. Сначала время ответа сервера, затем - уменьшение переадресаций.

Шаг 4. Сама оптимизация

В зависимости от узкого места оптимизировать его ;)

Общие рекомендации для бек-енда:

  • Cчитать данные заранее, клиенту в момент запроса отдавать сразу поготовленные данные;
  • Быть гибким для клиента и выдавать только запрошенные поля / выдавать подготовленные данные, подходящие именно для конкретной страницы;
  • Стремиться отдавать 90% ответов клиенту за 100ms;
  • Исходя из требований времени ответа не допускать запросов при формировании ответов, находящихся на расстоянии больше чем 40-50ms.

Общие рекомендации для фронт-енда:

  • Не пишите JavaScript, который заставляет браузер пересчитывать макет страницы.
  • Не усложняйте свой CSS. Используйте меньше CSS и делайте ваши CSS-селекторы простыми.
  • Исключайте перерисовку где только возможно. Выбирайте CSS, которые не вызывают пересчёт макета страницы целиком.
  • Отрисовка страницы может занять больше времени, чем любая другая активность при рендеринге. Следите за узкими местами отрисовки.

Оптимизация блога кота Тони