Как ускорить сайт: что реально влияет на скорость загрузки

Сайты 9 мин чтения

Чтобы ускорить сайт, в первую очередь работают с четырьмя вещами: временем ответа сервера, весом и форматом изображений, объёмом JavaScript (особенно сторонних виджетов) и подключением шрифтов и стилей. На большинстве медленных сайтов 80 % проблемы сидит в одной-двух из этих зон, и исправить их можно без переделки сайта целиком. Минификация HTML, перестановка тегов и погоня за 100 баллами в PageSpeed дают намного меньше, чем кажется. Ниже по порядку: как измерить скорость загрузки, что на неё реально влияет и с чего начинать.

Сначала измерьте: инструменты и метрики

Начинать с исправлений, не измерив, бессмысленно: вы не узнаете, что помогло. Для замеров хватит бесплатных инструментов.

ИнструментЧто показывает
PageSpeed Insightsлабораторный замер и полевые данные реальных посетителей Chrome
Lighthouse в DevToolsтот же лабораторный замер локально, удобно для проверки правок
Вкладка Network в DevToolsчто грузится, сколько весит, в каком порядке
Метрика, отчёт «Время загрузки страниц»скорость у ваших реальных посетителей, включая Яндекс Браузер
WebPageTestподробная водопадная диаграмма загрузки, замеры из разных точек

Главные метрики Core Web Vitals и их пороги:

МетрикаЧто измеряетХорошоПлохо
LCPкогда отрисовался самый крупный элемент первого экранадо 2,5 сбольше 4 с
INPкак быстро страница реагирует на клик или вводдо 200 мсбольше 500 мс
CLSнасколько прыгает вёрстка при загрузкедо 0,1больше 0,25
TTFBчерез сколько сервер начал отдавать страницудо 0,8 сбольше 1,8 с

Замеряйте не только главную. Возьмите три-четыре шаблона: главную, раздел каталога или список услуг, карточку товара, статью. Медленным часто оказывается шаблон, который никто не проверял. И смотрите мобильный результат: PageSpeed эмулирует средний смартфон на медленной сети, именно там проблемы видны лучше всего.

Сервер и время ответа

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

Почему сервер отвечает медленно:

  • Дешёвый виртуальный хостинг с сотнями соседей на одном сервере. В часы пик ваш сайт ждёт очереди.
  • Старая версия PHP. Переход с PHP 7.x на 8.x часто даёт заметный прирост без единой правки кода. Проверьте, что включён OPcache.
  • Нет кеширования страниц. CMS собирает каждую страницу заново: десятки запросов к базе, обработка шаблонов. Для WordPress есть плагины полностраничного кеша, в Webasyst кеширование включается в настройках, на уровне сервера можно настроить кеш в nginx.
  • Тяжёлые запросы к базе. Каталог на десятки тысяч товаров без индексов в таблицах, фильтры, которые пересчитывают всё на лету. Тут нужен разработчик и профилировщик.
  • Сервер далеко от аудитории. Хостинг в Европе для посетителей из Новосибирска добавляет задержку на каждое соединение.

Самый радикальный способ убрать проблему с сервером: не собирать страницы на лету вообще. При статической генерации (Astro, Hugo, Eleventy) все страницы заранее собираются в готовые HTML-файлы, и сервер просто отдаёт файл. TTFB у таких сайтов измеряется десятками миллисекунд.

Изображения

На большинстве сайтов картинки составляют больше половины веса страницы. Типичная история: на главную загрузили фото с фотоаппарата на 5 МБ, а показывается оно в блоке шириной 600 пикселей.

Что делать:

  1. Сжимать и уменьшать. Картинка не должна быть больше, чем её максимальный размер на экране с учётом плотности пикселей. Для блока шириной 600 пикселей хватит файла шириной 1200.
  2. Использовать современные форматы. WebP легче JPEG на 25-35 % при том же качестве, AVIF ещё легче. Все актуальные браузеры их поддерживают.
  3. Отдавать разные размеры под разные экраны через srcset, чтобы смартфон не качал картинку для широкого монитора.
  4. Указывать ширину и высоту. Без width и height браузер не знает, сколько места оставить, и вёрстка прыгает, когда картинка загрузилась. Это прямой путь к плохому CLS.
  5. Откладывать загрузку картинок ниже первого экрана через loading="lazy". Но главное изображение первого экрана откладывать нельзя: наоборот, его стоит загружать с повышенным приоритетом.

Как это выглядит в коде:

<!-- главное фото первого экрана -->
<img src="/img/hero-1200.webp"
     srcset="/img/hero-600.webp 600w, /img/hero-1200.webp 1200w"
     sizes="(max-width: 640px) 100vw, 600px"
     width="1200" height="800"
     fetchpriority="high" alt="Монтаж кондиционера в квартире">

<!-- картинки ниже по странице -->
<img src="/img/work-1.webp" width="800" height="600"
     loading="lazy" alt="Пример работы">

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

JavaScript и сторонние виджеты

Второй по частоте виновник медленного сайта. Причём проблема обычно не в коде самого сайта, а в том, что подключено поверх него: онлайн-чат, виджет обратного звонка, коллтрекинг, квиз, всплывающие окна, пиксели соцсетей, карта, видео с внешнего сервиса. Каждый такой виджет тянет свои скрипты, а в сумме набирается 1-2 МБ JavaScript, который браузер должен скачать и выполнить.

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

Что делать:

  • Провести инвентаризацию. Откройте DevTools, вкладку Network, отфильтруйте по JS и отсортируйте по размеру. Часто находятся виджеты, от которых давно отказались, а код остался.
  • Убрать лишнее. Два чата и три виджета обратного звонка на одной странице не нужны никому.
  • Отложить загрузку. Виджет чата не нужен в первую секунду. Его можно загрузить через несколько секунд после загрузки страницы или по первому движению мыши и прокрутке.
  • Подключать скрипты с defer или async, чтобы они не блокировали отрисовку.
  • Заменить тяжёлые встраивания на заглушки. Вместо видеоплеера показывать картинку-превью и загружать плеер по клику. То же с картами.

CSS и шрифты

Стили блокируют отрисовку: пока браузер не скачал CSS, он не покажет страницу. Если на сайт подключено пять файлов стилей от разных плагинов, общим весом 400 КБ, из которых используется 10 %, первый экран будет ждать их все.

Помогает:

  • собрать стили в один-два файла и убрать неиспользуемые правила;
  • встроить критические стили первого экрана прямо в HTML, а остальные грузить следом.

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

  • Используйте формат WOFF2 и только нужные наборы символов: латиница и кириллица, без греческого и вьетнамского.
  • Ограничьте число начертаний. Переменные шрифты (variable fonts) заменяют несколько файлов одним.
  • Добавьте font-display: swap, чтобы текст показывался сразу системным шрифтом, а не ждал загрузки.
  • Загружайте шрифты со своего домена, а не с внешнего сервиса: это экономит лишнее соединение.
@font-face {
  font-family: "Onest";
  src: url("/fonts/onest-cyrillic.woff2") format("woff2");
  font-weight: 400 700;
  font-display: swap;
}

Кеширование и сжатие

Эти настройки делаются один раз на сервере и ускоряют повторные визиты и переходы между страницами.

  • Сжатие. Текстовые файлы (HTML, CSS, JS, SVG) должны отдаваться сжатыми через gzip или brotli. Без сжатия они весят в 3-5 раз больше.
  • Заголовки кеширования. Статика с версией в имени файла (app.3f2a1c.js) кешируется в браузере на год. HTML кешируется коротко или не кешируется совсем, чтобы изменения сразу были видны.
  • HTTP/2 и HTTP/3. Позволяют грузить много файлов параллельно по одному соединению. На современных серверах включаются одной строкой.
  • CDN. Для сайтов с аудиторией по всей России отдача статики с ближайшего узла сокращает задержку.

Пример настройки nginx для статики:

gzip on;
gzip_types text/css application/javascript image/svg+xml application/json;

location ~* \.(js|css|woff2|webp|avif|png|jpg|svg)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

Что даёт эффект, а что почти нет

ДействиеЭффектСложность
Сжать и перевести изображения в WebPвысокийнизкая
Убрать лишние сторонние виджетывысокийнизкая
Включить кеш страниц и обновить PHPвысокий при медленном TTFBсредняя
Отложить загрузку чатов и видеовысокий для INPсредняя
Настроить шрифтысреднийнизкая
Сжатие и заголовки кешированиясреднийнизкая
Перейти на статическую генерациюочень высокийвысокая, обычно при редизайне
Минифицировать HTMLнизкийнизкая
Добиваться 100 баллов вместо 90почти нулевой для посетителейвысокая

Когда проще пересобрать сайт

Бывает, что сайт на конструкторе или старой CMS упирается в потолок: 30-40 баллов в мобильном PageSpeed, а каждая оптимизация даёт +3 балла и ломает что-то ещё. Тема с десятью слайдерами, двадцать плагинов, которые нельзя отключить, потому что непонятно, что от них зависит.

В такой ситуации дешевле не латать, а сделать редизайн на технологии, которая быстрая изначально. Мы делаем сайты на Astro со статической генерацией: страницы собираются заранее, JavaScript грузится только там, где он реально нужен, и сайты стабильно получают 90+ в PageSpeed Insights без отдельной оптимизации.

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

Влияет ли скорость сайта на позиции в Яндексе?

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

Сколько баллов в PageSpeed Insights достаточно?

Ориентируйтесь не на баллы, а на Core Web Vitals: LCP до 2,5 секунды, INP до 200 мс, CLS до 0,1. Если они в зелёной зоне, разница между 85 и 100 баллами для посетителей незаметна.

Можно ли ускорить сайт на Tilda?

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

Сколько времени занимает ускорение сайта?

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

Если сайт тормозит и непонятно почему, мы проведём замеры и сделаем ускорение сайта с отчётом «до и после» по Core Web Vitals, а дальше можем следить за скоростью в рамках техподдержки.

Заявка

Обсудим вашу задачу

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

  • Ответим в течение рабочего дня
  • Работаем по договору, оплата по счёту
  • Сначала план и смета, потом работа

Или напишите: hello@sitekod.ru

Заявка

Расскажите о задаче

Ответим в течение рабочего дня: уточним детали, назовём срок и цену. Ни к чему не обязывает.