Перейти к содержимому
Войти Регистрация

Лучшие способы ускорить сайт

Лучшие способы ускорить сайт

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

Что вообще значит «быстрый сайт»

Скорость — это не одно число. Пользователь по очереди переживает несколько моментов: когда на пустом экране появилось хоть что-то, когда отрисовался главный блок ради которого он пришёл, когда страница перестала прыгать под пальцами и когда она наконец начала отвечать на нажатия. Каждый из этих моментов ускоряется своими средствами, и «оптимизировать сайт вообще» невозможно.

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

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

Разработчик смотрит на свой сайт с быстрой машины и прогретым кешем — пользователь видит другое.
Разработчик смотрит на свой сайт с быстрой машины и прогретым кешем — пользователь видит другое. Фото: bonheureux · BY.

Топ 7 способов

Сначала измерить

без этого шага вы ускоряете не то, что тормозит

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

Замер в лаборатории и в поле — разные вещи. Синтетический прогон удобен: он повторяем и показывает подробности. Но он говорит только о том, как страница ведёт себя на конкретной машине. Данные от реальных пользователей показывают, что происходит на самом деле, и почти всегда картина там хуже.

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

Проверяйте на медленном. В инструментах разработчика есть замедление процессора и сети. Открыть свой сайт в таком режиме — самое отрезвляющее упражнение из возможных.

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

первый шаг · оценка 9,5

Картинки

самая тяжёлая часть страницы и самая простая для исправления

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

Отдавайте нужный размер. Несколько вариантов одной картинки под разные экраны — и телефон получает маленький файл вместо огромного. Это самая скучная и самая результативная часть работы.

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

Отложенная загрузка. Всё, что ниже первого экрана, грузить сразу не нужно. Атрибут отложенной загрузки поддерживается браузерами штатно и включается одним словом в разметке.

Явные размеры. Указывайте ширину и высоту (или пропорции в стилях) — иначе страница будет прыгать по мере подгрузки картинок, и человек нажмёт не на то, на что целился. Это раздражает сильнее, чем медленная загрузка.

  • Самый большой выигрыш на единицу усилий
  • Не требует трогать логику приложения
  • Отложенная загрузка включается одним атрибутом
  • Нужен конвейер, который готовит варианты картинок автоматически
  • Сильное сжатие заметно на фотографиях с плавными переходами
  • Отложенную загрузку нельзя вешать на главную картинку экрана — станет хуже

быстрый выигрыш · оценка 9,4

Меньше JavaScript

килобайт скрипта дороже килобайта картинки

Картинку браузер просто показывает. Скрипт нужно скачать, разобрать, скомпилировать и выполнить — и всё это на одном потоке, который в это же время должен рисовать страницу и реагировать на нажатия. На слабом телефоне разбор большого пакета скриптов занимает больше времени, чем его загрузка.

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

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

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

  • Прямо влияет на отзывчивость, а не только на загрузку
  • Ревизия пакета часто находит лишние мегабайты за час
  • Разделение по маршрутам поддерживается сборщиками из коробки
  • Выкидывание зависимостей — это уже рефакторинг с риском регрессий
  • Сторонние скрипты обычно требует не разработчик, и убрать их сложно
  • Слишком мелкое дробление даёт много запросов и свои задержки

большой выигрыш · оценка 9,3

Кеширование на всех уровнях

самый быстрый запрос — тот, которого не было

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

Страницы. Здесь срок короткий или условный: браузер спрашивает у сервера, изменилось ли что-то, и получает короткий ответ «нет», если не изменилось. Это дешевле, чем перекачивать страницу целиком.

Сеть доставки содержимого. Копии файлов лежат ближе к пользователю географически. Для аудитории, разбросанной по стране, это заметная разница — скорость света никто не отменял.

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

  • Повторные визиты становятся почти мгновенными
  • Снимает нагрузку с сервера и базы
  • Настраивается один раз на уровне сервера
  • Ошибка в настройке приводит к утечке личных данных чужому человеку
  • Сброс кеша — отдельная нетривиальная задача
  • Пока не настроены отпечатки в именах, пользователи видят старую версию

важно · оценка 9,2

Серверная часть и база

медленный ответ сервера ничем не замаскируешь

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

Чаще всего виновата база. Запросы в цикле вместо одного соединения, отсутствие индекса под условие, выборка всей таблицы вместо страницы. Одна страница, делающая двести обращений к базе, — обычное дело в проекте, где за этим не следили.

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

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

  • Ускоряет вообще всё сразу, включая отдачу страниц
  • Часто одна найденная проблема даёт основной эффект
  • Виден результат в объективных метриках, а не в баллах
  • Требует навыков работы с базой и профилирования
  • Изменения затрагивают логику и требуют тестов
  • Фоновые задачи — ещё один компонент, который надо обслуживать

основа · оценка 9,1

Сжатие, протокол и соединения

почти бесплатные улучшения на уровне настройки сервера

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

Современная версия протокола. Она позволяет забирать много файлов по одному соединению без очереди. На страницах с десятками мелких файлов разница ощутима, особенно на мобильной связи с большими задержками.

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

  • Настраивается на сервере, код не трогаем
  • Работает для всех страниц сразу
  • Ничего не ломает при аккуратной настройке
  • Выигрыш заметно меньше, чем от картинок и скриптов
  • Максимальное сжатие на лету нагружает процессор
  • Часть настроек зависит от хостинга, и не везде до них есть доступ

дёшево · оценка 9,0

Шрифты

маленькая тема с непропорционально заметным эффектом

Пока шрифт не загрузился, браузер по умолчанию может не показывать текст вовсе. Человек видит картинки и пустые места вместо букв — ощущение сломанной страницы. Одно свойство в описании шрифта меняет поведение на «показать системным, потом заменить».

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

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

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

  • Текст появляется сразу, а не после загрузки шрифта
  • Подмножество символов сокращает вес в разы
  • Правится за один вечер и больше не возвращается
  • Подмена шрифта во время загрузки визуально заметна
  • Подготовка подмножеств требует отдельного инструмента
  • Дизайнеры не любят компромиссы по начертаниям

мелочь с эффектом · оценка 8,8

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

Сравнение по главному

СпособВыигрышСложностьРиск сломать
Измеритьориентирнизкаянет
Картинкибольшойнизкаянизкий
Меньше скриптовбольшойвысокаясредний
Кешированиебольшойсредняявысокий
Сервер и базабольшойвысокаясредний
Сжатие и протоколсреднийнизкаянизкий
Шрифтысреднийнизкаянизкий
Диаграмма оценок семи способов ускорить сайт
Оценка — по соотношению реального выигрыша и затраченных усилий.

С чего начать, если есть один вечер

Час первый — замеры. Откройте сайт в инструментах разработчика с замедлением сети и процессора. Запишите три числа: вес страницы, время до первого байта и время появления главного блока. Это точка отсчёта.

Час второй — картинки. Отсортируйте запросы по размеру. Всё, что тяжелее пары сотен килобайт, пережмите и отдайте в подходящем разрешении. Обычно на этом шаге вес страницы падает в разы.

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

Час четвёртый — повторный замер. Сравните с записанными числами. Если выигрыша нет, значит, узкое место в другом месте — скорее всего, в ответе сервера, и это уже задача не на вечер.

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

Частые вопросы

Стоит ли гнаться за сотней баллов в инструментах проверки?

Нет. Баллы — удобный ориентир и хороший чек-лист, но они считаются по синтетическому прогону на условном устройстве. Последние десять баллов обычно стоят непропорционально дорого и почти не влияют на реальных пользователей. Ориентируйтесь на данные из поля и на здравый смысл.

Нужна ли сеть доставки содержимого небольшому сайту?

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

Что делать со сторонними скриптами, которые требует бизнес?

Не спорить, а измерить и показать. Обычно достаточно таблицы «сколько времени добавляет каждый виджет» — часть отваливается сама. Остальное подключайте отложенно, после отрисовки основного содержимого, и обязательно проверьте, что сайт работает, если чужой домен недоступен.

Помогает ли переезд на более мощный сервер?

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

Итог

Порядок, который работает почти всегда: измерить, привести в порядок картинки, затем разобраться со скриптами и временем ответа сервера. На первые два шага уходит вечер, и они дают основную часть выигрыша.

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

0
Оценили 0 читателей

Комментарии

0
Г
Без регистрации можно оставить один комментарий к публикации. Войдите, чтобы участвовать в обсуждении дальше и получать ответы. Ссылки в комментариях скрываются.
Пока нет комментариев

Будьте первым, кто ответит автору.