HTML и CSS фичи, советы для 10-кратного ускорения загрузки страниц

Мы все терпеть не можем, когда наша страница загружается так медленно!

Фактически, коэффициент конверсии сайта падает в среднем на 4,42% с увеличением времени загрузки на каждую секунду (от 0 до 5 секунд). Первые пять секунд времени загрузки страницы оказывают наибольшее влияние на коэффициент конверсии. (Portent, 2019)

Но вы можете увеличить скорость загрузки страниц вашего сайта, внеся изменения в ваши HTML и CSS файлы, не прибегая к услугам ведущих хостинговых служб!

(В этой статье мы будем рассматривать ускорение работы страницы только с помощью файлов HTML и CSS).


1. Ленивая загрузка

Ленивая загрузка - это стратегия сокращения длины критического пути рендеринга, что приводит к сокращению времени загрузки страницы.

a) Разделение CSS-файла 

CSS должен быть тонким, доставляться как можно быстрее, а для разблокировки рендеринга рекомендуется использовать медиатипы и запросы. Что я имею в виду под "тонким"? Разделите ваш CSS-файл так, чтобы CSS полностью не выполнялся подряд на всех экранах.

<!-- Loading and parsing styles.css is render-blocking -->
<link rel="stylesheet" href="styles.css" />

???? Для использования в печатной (Print) версии-

<!-- Loading and parsing print.css is not render-blocking -->
<link rel="stylesheet" href="print.css" media="print" />

???? Для использования на мобильных (Mobile) экранах-

<!-- Loading and parsing mobile.css is not render-blocking on large screens -->
<link
  rel="stylesheet"
  href="mobile.css"
  media="screen and (max-width: 480px)" />

???? Для использования экранов планшетов (Tablet)-

<!-- Loading and parsing tablet.css is not render-blocking on large screens -->
<link
  rel="stylesheet"
  href="tablet.css"
  media="screen and (max-width: 1080px)" />

???? Для мобильных экранов с разной ориентацией (orientation) используйте разные CSS-файлы 

<!-- Loading and parsing portrait.css is not render-blocking on landscape screens -->
<link href="portrait.css" rel="stylesheet" media="(orientation:portrait)" />

При разделении CSS на несколько файлов, основной блокирующий рендеринг файл, в данном случае styles.css, становится намного меньше, уменьшая время блокировки рендеринга, что значительно увеличивает скорость загрузки страницы.

б) Свойство font-display в CSS

Применяемое к правилу @font-face, свойство font-display определяет, как файлы шрифтов загружаются и отображаются браузером, позволяя тексту проявляться с fallback (резервным) шрифтом, пока тот загружается или нет. Это повышает производительность, делая текст видимым, вместо пустого экрана, а в качестве компромисса - нестилизованный текст в данный момент мигает.

@font-face {
  font-family: "nunito", sans-serif;
  font-weight: 400;
  font-style: normal;
  font-display: fallback;
}

c) Изображения в HTML-файле

В первую секунду пользователь видит (должен видеть) сначала только изображения. Зачем тогда заставлять ждать, пока изображение загрузится до конца? Используйте loading="lazy", чтобы изображение загружалось только тогда, когда это необходимо. Это значительно снижает скорость загрузки страницы.

<img src="my-logo.png" alt="KOUSTAV" loading="lazy" />

2. Выбор правильного формата изображения

Создавайте свои изображения в формате .webp. Он рекомендован в качестве стандарта формата изображений для интернета.

Изображения WebP без сжатия (без потерь) по размеру на 26% меньше по сравнению с PNG. Сжатые (с потерями) изображения WebP на 25-34% меньше, чем аналогичные изображения JPEG при эквивалентном индексе качества SSIM. Анимированные WebP-изображения поддерживаются с потерями, без потерь и прозрачностью, что позволяет уменьшить их размеры по сравнению с GIF и APNG.

Формат изображения WebP по сравнению с PNG

Изображения отсортированы по степени сжатия

Формат изображения WebP в сравнении с JPEG

С помощью всех этих тестов было доказано, что webp-изображения сжимаются гораздо сильнее, даже если они с потерями, что значительно снижает скорость загрузки страницы!

Вы также можете проверить формат изображения .avif, который в некоторых случаях лучше, чем .webp. Но он является новым для рынка (выпущен в 2019 году), поэтому еще не многие браузеры поддерживают формат .avif!

???? Используйте элемент <picture> для изображений

a) Для обрезки или модификации изображений под различные условия media например, загрузка более простой версии изображения, которое имеет слишком много деталей, на небольших дисплеях).

b) Предоставление альтернативных форматов изображения в случаях, когда формат webp не поддерживается.

c) Cохрание пропускной способности и ускорение загрузки страниц за счет использования наиболее подходящего изображения для зрительского дисплея.

Если вы предоставляете версии изображения большей плотности для отображения на дисплее с высоким разрешением (Retina), используйте srcset для элемента <img>. Это позволит браузерам выбирать версии меньшей плотности в режимах экономии данных, и вам не придется прописывать явные условия media.

<picture>
  <source srcset="my-logo-wide.webp" type="image/webp" media="(min-width: 600px)" />
  <source srcset="my-logo-wide.jpeg" type="image/jpeg" type="image/jpeg" media="(min-width: 600px)" />
  <source srcset="my-logo-narrow.webp" type="image/webp" /> 
  <img src="my-logo-narrow.png" alt="KOUSTAV" loading="lazy" />
</picture>

3. Рендеринг изображений

Поскольку изображения загружаются асинхронно и после первого наброска (paint)  продолжают загрузку. Если перед этим их размеры не определены, они могут стать причиной изменения содержимого страницы, например, когда текст сдвигается вниз из-за загрузки изображений. По этой причине очень важно задать атрибуты width и height, чтобы браузер смог зарезервировать под них место на макете.

Для любого background-image (фонового изображения) необходимо задать значение background-color (цвет фона), чтобы любой наложенный на него контент оставался читаемым до окончания загрузки изображения.

4. Минификация файлов HTML и CSS

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

Используйте такие инструменты минификации, как CodeBeautify, CSS Minifier и многие другие для того, чтобы уменьшить ваши HTML и CSS файлы. Это поможет увеличить скорость загрузки страниц вашего сайта.


И, наконец, у нас - все сделано и закончено!

Благодаря этим изменениям скорость загрузки страниц вашего сайта теперь будет в 10 раз выше!

Материал подготовлен в преддверии специализации Fullstack Developer. Узнать подробнее о специализации, а также зарегистрироваться на бесплатный вебинар можно по ссылке ниже.

Комментарии (13)


  1. sunnybear
    13.12.2022 20:37
    +1

    Браузеры грузят все css файлы для отображения, поэтому первый совет - антисовет


    1. dom1n1k
      13.12.2022 22:29

      Нет, там ограничения медиа-атрибутами заданы.
      Хотя подход всё равно на любителя.


      1. Dartess
        13.12.2022 23:20

        Ограничения ограничениями, а загрузка загрузкой. Хоть они и не будут работать, грузиться они всё равно будут, просто с низким приоритетом (что теоретически в сумме, наверное, должно дать плюс, а не минус такого подхода).


        1. sunnybear
          14.12.2022 16:46

          оно грузится ровно с тем же приоритетом, вот в чем проблема. Совет здесь - все в один файл. Или HTTP/2 + Server Push
          Пример: сайт rbc.ru


  1. ShefEr
    13.12.2022 20:52

    С помощью всех этих тестов было доказано, что webp-изображения сжимаются
    гораздо сильнее, даже если они с потерями, что значительно снижает
    скорость загрузки страницы!

    Снижает?


    1. Lazytech
      14.12.2022 07:04

      Оригинал тоже, мягко говоря, кривоват.


  1. s_f1
    14.12.2022 10:37
    +1

    А заглавие такое:
    — Ну-да, ну-да… Конечно…


  1. sunUnderShadow
    14.12.2022 13:44

    Используйте loading="lazy", чтобы изображение загружалось только тогда, когда это необходимо. Это значительно снижает скорость загрузки страницы.

    Хорошая фича, буду использовать


  1. whoiam_frontend
    14.12.2022 13:44

    Мне кажется, ты с гифками немного переборщил... Но это даже хорошо :)


  1. UMenyaNeudobnieVoprosiki
    14.12.2022 13:45
    +1

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


    1. alexnozer
      16.12.2022 12:06

      К сожалению, JAMStack не снискал на просторах СНГ такой популярности.

      Да и вопросики к нему есть в плане форм, личных кабинетов, поиска и тд. Нужно что-то из этого? Ищешь SaaS решение и интегрируешь его, а потом ещё n$/мес платишь за подписку. А оно может не работать из-за геолокации. Потом к этому всему ещё нужно какой-нибудь strapi прикрутить, чтоб заказчик мог редактировать контент.

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

      А так согласен, SSG крутая штука, жаль не сильно популярная у нас


  1. fc1e5380d7
    14.12.2022 13:45
    -1

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


    1. Metotron0
      15.12.2022 21:52

      Может быть, просто поставить себе смотрелку картинок, которая понимает webp? Зачем конвертировать?

      Если докапываться до картинок, то я бы сказал, что проблема кроется в том, как их загружать через админку. Можно сколько угодно media-правил написать и использовать <pictures>, но когда в админке будет 4 поля для одной картинки (webp на весь экран и на мобилки, плюс то же, но в jpeg), контентщик взвоет это грузить. Или же придётся бэкендера заставить генерировать webp из jpeg, но для маленьких картинок jpeg обычно лучше по размеру, тут соревнование разве что с png идёт, да и то, нужно смотреть по ситуации, иногда он всё равно проигрывает.