Оптимизация сайта для Человека
ВНИМАНИЕ Данная статья на этапе написания, будет пополняться и изменяться.
Дата начала написания: 28.06.2017
Дата последнего дополнения: 05.07.2017
Рано или поздно специалисты по оптимизации сайтов столкнутся с так называемой "сетевой оптимизацией сайта". Это несомненно важный этап в оптимизации, так как быстрое отображение/загрузка страниц сайта положительно влияет как на поисковых роботов, так и на самое главное - пользователя. Для выполнения сетевой оптимизации и предоставления "развернутой картины" взаимодействия клиент-сервер я использую сервис Google, именуемый "WebPageTest".
Об использовании данного сервиса и пойдет речь, будут рассмотрены основные показатели, всё "расшифровано" на понятном языке (по крайней мере я к этому стремился).
Для примера я рассмотрю анализ главной страницы моего текущего сайта seo.klimin-viktor.com. Конечно это достаточно "легкая" страница, особо без изображений и "тяжелых скриптов". Главное понять суть больших возможностей данного сервиса, который поможет ускорить сайт и выполнить сетевую оптимизацию.
Колонки в таблице для других сайтов могут отличаться, ниже я укажу описание к существующей странице: https://seo.klimin-viktor.com/
Общее время загрузки и отображения страницы. По сути это основное мерило времени загрузки страницы. Чем ниже показатель, тем быстрее загружается страница в браузере. К примеру наша страница загружалась почти 3 секунды.
Сколько потребовалось времени, чтобы получить первый байт информации от сервера, на котором находится сайт. На данном этапе, иногда, находится основная проблема в скорости загрузки сайта. Например мы запрашиваем страницу, а она около 3-5 секунд "пустая" и лишь спустя это время начинается прогрузка основного контента и графики. В описанном примере проблему стоит искать на самом сервере или исполняемом скрипте - в это время сервер обрабатывает полученный запрос от клиента, потом формирует ответ и отправляет клиенту. О том, что входит в этот показатель я напишу далее.
Сколько потребовалось времени, чтобы браузер инициировал визуальное отображение содержимого страницы. Таким образом, в данном примере, с 2,5 секунды мы можем наблюдать в браузере визуальные манипуляции, отрисовку содержимого страницы.
Сколько потребовалось времени, чтобы браузер завершил визуальную отрисовку содержимого страницы. Сюда входит загрузка всех визуальных элементов и того, что необходимо для их отрисовки.
Самая интересная относительная оценка скорости страницы, в ней стоит помнить, чем меньше число показателя индекса скорости - тем лучше. Если коротко, то это числовой индекс скорости готовности страницы для просмотра пользователем для взаимодействия с контентом (о как, коротко). Понять пользу этой оценки можно сравнивая две версии одной страницы. Например взяли мы одну и ту же страницу (А и Б) и на странице "Б" изменили последовательность загрузки элементов или способ отображения. Страницы А и Б будут иметь одинаковое время полной загрузки страницы, но страница "Б" при ее визуальном просмотре будет "быстрее" отображаться, т.е. последовательность отрисовки будет начинаться раньше и элементы будут появляться последовательно без замедлений и зависания. Так вот, значение скорости индекса (Speed Index) у страницы "Б" будет ниже, тем самым эта страница будет для пользователя восприниматься как более быстрая, хотя скорость полной загрузки и отрисовки страниц А и Б будет фактически одинаковой. Стоит отметить, что не для всех типов сайтов этот показатель будет считаться приоритетным, например если просматривать сайт со статьей или новостью, то загрузка картинок будет занимать второстепенную роль и для того, чтобы пользоваться контентом не обязательно дожидаться полной загрузки страницы а читать статью, например.
На момент написания данного мини-справочника этот показатель находился на этапе предварительного тестирования (beta). Указывается приблизительное время, необходимое для обеспечения взаимодействия пользователя с контентом. Исходя из показателя "> 2.334s" при загрузке страницы необходимо около 2,5 секунд, чтобы можно было взаимодействовать с содержимым страницы. Данный показатель рассчитывается, если тест страницы запущен под Chrome в настройках перед анализом. Чем меньше секунд, тем меньше ждать загрузки перед использованием страницы человеком.
Коды ошибок сервера, которые получил клиент от сервера во время проведения теста. Данный показатель не часто появляется в таблице за мою практику, видимо от того, что показать больше нечего в рамках теста (или у Вас все хорошо с сайтом).
В этой группе колонок отображаются показатели измерений для основного содержимого сайта. Образно это время загрузки основного содержимого страницы (в то же время это время не считается загрузкой всех элементов на странице, окончательной загрузкой).
Это значение "Load Time"
Количество HTTP-запросов до начала события загрузки (load event). На графике "Waterfall View" это событие показано под маркером "On Load" (светло-сиреневый цвет, если я не дальтоник).
Общий объем загружаемых данных для текущего показателя (Document Complete).
В этой группе колонок отображаются показатели измерений для полного содержимого сайта. По сути это конечные и полные показатели и означают, что по мнению сервиса WebPagetest загрузка страницы полностью завершена со всеми дополнительными элементами.
Суммируется время "Load Time" и время, затраченное на загрузку дополнительных запросов, после наступления события "Document Complete" из предыдущей группы показателей. Вроде как эти показатели и должны считаться конечными и основными. Но всеже первая колонка "Load Time" считается эталоном, что считать скоростью загрузки страницы.
Указывается сумма запросов Requests в группе "Document Complete" и остальных запросов, необходимых для окончательной загрузки страницы.
Окончательная сумма загружаемых файлов для окончательного отображения страницы.
Еще известен как "Certificate Bytes". Общий размер TLS сертификатов, который вернул сервер клиенту.
Объяснение каждого этапа загрузки страницы, всего их шесть и расположены они в определенной последовательности.
На данном промежутке времени браузер завершил анализ документа и создал модель DOM. После наступления этого события сразу же начинается новое событие - "DOM Content Loaded" (если в документе отсутствует встроенный код JS).
После завершения предыдущего действия (модели DOM и CSSOM уже готовы) браузер приступает к созданию модели визуализации. На этом этапе создается древо рендеринга (прорисовки) и все готово к визуализации в браузере пользователя. В данном событии изображения и CSS могут быть еще не загружены.
Содержимое страницы начинает отображаться пользователю. По сути это означает время начала отрисовки содержимого страницы.
Это собственная метрика WebPagetest, которая отслеживает визуальное изменение на загружаемой станице и указывает время, когда появляется первый пиксель для отображения на экране.
Документ находится в процессе завершения загрузки основных элементов для взаимодействия со страницей. Не иначе как "почти готов, еще чуток...". Время, потраченное на это событие более детально указано в второстепенной таблице, в колонке "loadEvent".
Загрузка и обработка документа завершена и документ готов к использованию.
Но мало знать теоритически, опишу на данном примере какие события происходят на графике, чтобы Вы смогли это применить в своей работе более продуктивно. Для более детальной расшифровки нам поможет вторичная таблица, которая отображается сразу под основной таблицей:
При инициализации загрузки анализируемой страницы в первую очередь возникает событие "DOM Interactive" на 1.624s. После этого в моем случае сразу же началось событие "DOM Content Loaded" продолжительностью 0.400s (с 1.624s по 2.024s). Далее наступает событие "msFirstPaint" на 2.038s, которое начинает прорисовку обработанного содержимого. Минуя этот этап переходим к событию "Start Render" на 2.585s, которое фиксирует визуальное изменение при загрузке страницы. Следущим этапом возникает событие "On Load" продолжительностью 0.018s (с 2.937s по 2.955s). Сразу же после предыдущего события возникает "Document Complete" на 2.954s и документ считается готовым к дальнейшим манипуляциям пользователя, хотя и после него может происходить загрузка/подгрузка файлов.
Отмечу, что событие "DOM Content Loaded" можно (а иногда и нужно) оптимизировать для уменьшения скорости обработки, это самый продолжительный из всех перечисленных.
Основные элементы, которые чаще всего оптимизируют:
Переходим к детальному анализу графика "Waterfall View". Каждый запрос пользователя к странице сайта состоит из пяти этапов, далее рассмотрим их подробнее:
При запросе URI адреса происходит запрос к DNS серверу у которого есть информация о запрашиваемом домене и запрос перенаправляется в необходимом направлении. На выполнение данной операции могут влиять кол-во цепей сертификатов или высокая задержка на DNS серверах.
Инициализация подключения браузера клиента с сервером запрашиваемого источника.
Период времени когда клиент и сервер согласовывают безопасный способ передачи данных. Данный этап не инициализируется если анализируемый сайт или источник используют протокол HTTP, только для протоколов HTTPS и SPDY.
Важный этап, анализируя который можно найти и исправить основные проблемы обработки запросов сервером. На рафике указывается промежуток времени, которое необходимо серверу для подготовки ответа на поступивший запрос. Данный этап актуален для запросов каждого ресурса на странице: таблицы стилей, скрипты, изображения и т.д. Если на этом этапе Вы видите аномальную продолжительность, то это сигнал к тому, что нужно оптимизировать исполняемые скрипты на сервере, подключение к БД, скорость запросов и т.п.
Завершающий этап запроса, когда сервер в ответ на запрос клиента возвращает содержимое ответа. Затраченное время это сумма размера ответа и скорости соединения.
Этапы 4 и 5 в графике "Waterfall View" отображены для каждого типа файлов разной насыщенностью цвета. Например на рисунке выше есть тип "css" окрашенный в 2 оттенка - светло-зеленый и зеленый. Смотря на график "Waterfall View" для файла этого типа можно увидеть такую ситуацию:
На этой картинке светло-зеленая полоса это тот самый TTFB (запрос 4), а зеленая полоса это Content download (запрос 5). Исходя из этого можно сказать, что размер файла не маленький, возможно требующий оптимизации (сжатия, чистки). Если Вы заметили, что файл требует оптимизации, то можно более детально узнать сколкьо времени затрачивается на каждый этап. Для этого нужно кликнуть по строке с файлом в граике "Waterfall View" и откроется модальное окно с детализацией:
Исходя из приведенных данных видно, что запрос и обработка файла "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" (CDN) заняло 251 ms. Из чего складывается время: DNS Lookup (38 ms) + Initial Connection (34 ms) + SSL Negotiation (55 ms) + Time to First Byte (84 ms) + Content Download (40 ms). Скачиваемый файл "весит" 22.9 KB (Bytes In (downloaded): 22.9 KB). Самым очеидным для оптимизации является сжатие файла, но так как это CDN в моем случае, то это не актуально.
Случаи с большими CSS файлами к сожалению не редкость, так как не все разработчики заботятся о чистоте кода, актуальности стилей и вообще размером заружаемых файлов (сетевой оптимизации в целом). Самые очевидные возможности уменьшения CSS файла:
В последствии анализа Вас может заинтересовать события, когда JS скрипт будет выполняться не сразу, а на протяжении всего этапа загрузки страницы. Для визульного отображения на графике "Waterfall View" для этого есть индикация:
В графике загрузки файлов это будет выглядеть так:
В моем случае это выполняется JS счётчика Яндекс.Метрика, который взаимодействует со страницей с момента его загрузки до наступления события "Fully Loaded" (3.403s). С помощью данного маркера хорошо видно, когда работает Java Script на странице. Возможно найдутся случаи, когда активность JS будет излишней, что "даст сигнал" для его оптимизации.
В отличии от графика "Waterfall View" в этом графике показываются соединения установленные по TCP, через которые выполняются запросы. Для одного домена может быть несколько соединений и они могут работать параллельно.
С помощью данного графика можно в целом определить менее оптимизированные подключения для дальнейшего детального анализа.
Как и в предыдущем графике (Waterfall View) здесь можно найти знакомые визуальные маркеры по типам файлов и этапах загрузки страницы. К примеру исходя из приведенных данных можно предположить, что данный участок требует оптимизации:
Для выяснения причины такой задержки TTFB (светло-сиреневый маркер) и больших загружаемых данных (сиреневый маркер) мы можем обратиться к графику "Waterfall View" и расследовать какие файлы нужно оптимизировать.
В моем случае данная проблема нашлась без труда, сразу обращаешь внимание на файл изображения:
Для подробного фильтра происходящих запросов нам поможет эта таблица, в которой расположены все загружаемые файлы (скрипты, стили, изображения и т.д.). В этой таблице удобно фильтровать по самому "тяжелому" файлу, который скорее всего можно оптимизировать. Можно отфильтровать по типу файла и посмотреть все js файлы, возможно найдутся лишние или не актуальные.
Строки таблицы окрашены в несколько основных цветов, постоянных цветовв таблице три: светло-зеленый, светло-фиолетовый, светло-серый.
Цвет: светло-зеленый. Элементы, помеченные данным маркиром выполняются перед началом рендеринга. В графике "Waterfall View" это все загрузки до этапа "Start Render" (зеленая линия).
Цвет: светло-сиреневый. Элементы, помеченные данным маркиром выполняются начиная с этапа "Start Render" до этапа "On Load" (светло-голубая линия).
Цвет: светло-серый. Элементы, помеченные данным маркиром выполняются после этапа "On Load" (светло-голубая линия) и длится до полного завершения обработки и загрузки (в основной таблице это "Fully Loaded->Time" на 3.403s).
Цвет: светло-желтый. Если загружаемые файлы имеют HTTP-статус 301 или 302. Для поисковой оптимизации эти два кода имеют значение, поэтому иногда можно увидеть неверный редирект, который не предполагалось использовать.
Цвет: светло-красный. Это хороший сигнал для исправления самых серьезных ошибок, коды 404 и 500. Наличие данного кода ответа для поисковых систем и пользователя имеет важное значение, а для оптимизатора это возможность исправить ненайденные ранее ошибки.
С помощью данной таблице также хорошо смотреть у какого файла самое высокое время получения первого байта информации, колонка "Time to First Byte". Отсортировав от большего к меньшему можно поэтапно проанализировать какой файл, возможно, дольше обрабатывается сервером и исправить код исполняемого скрипта, подключение к БД, большую выборку данных и т.п.
На этой странице можно увидеть итоговую информацию о загружаемых MIME типам контента. Показана информация по кол-ву запросов (колонка "Requests") и по объему загружаемой информации (колонка "Bytes").
Ниже графиков, в табличном формате, расположена детальная информация по количеству (Requests) и размеру в байтах (Bytes). Особо описывать этот отчет не имеет смысла, по-моему все развернуть и перевода не требует.
Например в моем случае видно, что основной объем загружаемой информации это файлы JS и CSS. Глядя на эти данные стоит проверить объем загружаемых файлов, оптимизировать их объем и по возможно сократить до минимума. По сути поисковым роботам, в основном, будут полезны только MIME типы image и html.