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

Как сократить время загрузки страниц на сайте книжного магазина

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

Раздел: Разработка — статьи о сайтах

У книжного магазина сайт тяжёлый по своей природе: сотни картинок-обложек, длинные списки товаров, фильтры по автору, издательству и жанру, поиск по названию и ISBN. Медленная страница здесь чаще всего складывается из нескольких понятных причин, и каждую можно проверить отдельно.

Что именно тормозит: сервер или браузер

Сначала разделите две задачи. Первая: как быстро сервер отдаёт саму HTML-страницу. Вторая: сколько времени уходит на картинки, стили и скрипты. Откройте страницу каталога во вкладке «Сеть» (Network) в Chrome или в Firebug и посмотрите на первую строку списка. Если HTML приходит несколько секунд, проблема в коде и базе данных. Если HTML быстрый, а страница достраивается долго, виноваты ресурсы. Дополнительно запустите Google PageSpeed или YSlow: они покажут типовые нарушения, но порядок работ определяйте по своим замерам.

Обложки: почему список книг весит как архив

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

<!-- плохо: файл большой, уменьшен только на экране -->
<img src="/upload/58213_original.jpg" width="120" height="180" alt="Обложка книги">

<!-- лучше: отдельная миниатюра нужного размера -->
<img src="/covers/s/58213.jpg" width="120" height="180" alt="Обложка книги">

Если на странице 40 книг, а каждая обложка по условию весит 150 КБ вместо 8, разница составит около шести мегабайт против трёхсот килобайт. Подставьте реальные размеры своих файлов. Делайте миниатюры при загрузке товара, а не на лету при каждом запросе. Для фотографий подбирайте умеренное JPEG-сжатие, а для плоской графики вроде логотипов и значков подойдёт PNG. Всегда указывайте width и height, чтобы текст не прыгал, пока грузятся картинки.

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

Сколько запросов делает страница и что в них лишнее

Каждый файл — отдельный запрос. Типичная картина: десять CSS и JS файлов, несколько копий jQuery от разных плагинов, слайдер на главной, кнопки «Мне нравится» от соцсетей, счётчики, виджет онлайн-консультанта. Что можно сделать:

  • объединить и сжать свои CSS и JS, убрать дубли библиотек;
  • мелкие значки (корзина, рейтинг, «в наличии») собрать в один CSS-спрайт;
  • скрипты, не нужные для первого отображения, подключать в конце страницы или асинхронно;
  • виджеты соцсетей показывать только на карточке книги и только если вы реально их используете;
  • слайдер на главной ограничить несколькими баннерами нужного размера.

Сторонние виджеты особенно опасны: их скорость от вас не зависит, а зависшая внешняя загрузка может задерживать вашу страницу.

Каталог, фильтры и поиск: медленные запросы к базе

Если HTML приходит долго, смотрите запросы к базе данных. В книжном магазине типичные причины такие:

  • нет индексов по полям, по которым идёт выборка и сортировка: автор, издательство, жанр, цена, ISBN;
  • подсчёт общего числа товаров для каждой комбинации фильтров выполняется при каждом открытии страницы;
  • поиск по названию ведётся через LIKE по всей таблице;
  • на странице списка для каждой книги выполняется отдельный запрос за автором и ценой, вместо одного общего;
  • наличие и цены обновляются из учётной системы прямо во время показа страницы.

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

Кэш браузера и сжатие: чтобы повторный визит был быстрым

Покупатель книг обычно заходит на сайт не один раз и просматривает много страниц. Если стили, скрипты, логотип и значки не меняются, разрешите браузеру хранить их: настройте заголовки Expires или Cache-Control и меняйте имя файла при обновлении. Включите gzip-сжатие для HTML, CSS и JS. Картинки уже сжаты, и повторно сжимать их не нужно. Для статических файлов подумайте об отдельном домене или CDN, если у вас много посетителей из разных регионов.

Проверочный список перед запуском правок

  • Замерено время ответа HTML на главной, в каталоге, на карточке книги и в поиске.
  • В списках используются миниатюры, а не исходные обложки.
  • У всех картинок заданы width, height и alt.
  • Число CSS и JS файлов сокращено, дубли библиотек удалены.
  • Скрипты, не нужные сразу, подключаются в конце страницы или асинхронно.
  • Для полей фильтров и поиска есть индексы, тяжёлые запросы найдены.
  • Списки каталога и счётчики кэшируются, порядок обновления цен и остатков определён.
  • Включены gzip и долгое хранение статических файлов.
  • Страницы проверены после изменений: корзина, фильтры и оформление заказа работают.

Меняйте по одному пункту и замеряйте результат. Так будет видно, что действительно ускорило сайт, а что только усложнило его.

Все статьи блога

Заявка

Расскажите о проекте

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

Форма обратной связи

Отвечаем в рабочие дни с 10:00 до 19:00

Написать в Telegram