Благодаря кешированию пользователи, повторно посещающие ваш сайт, тратят меньше времени на загрузку страниц. Заголовки кеширования должны применяться ко всем кешируемым статическим ресурсам, а не только к некоторым из них (например, изображениям). Кешируемые ресурсы включают файлы JavaScript и CSS, графические и другие файлы (мультимедийное содержание, файлы PDF и т. д.). Обычно код HTML не является статическим ресурсом и по умолчанию не считается кешируемым. Подумайте, какой тип кеширования лучше подходит для кода HTML вашего сайта.
Включите для своего сервера кеширование в браузере. Продолжительность хранения статических ресурсов в кеше должна составлять не менее недели. Внешние ресурсы (объявления, виджеты и др.) должны храниться не менее 1 дня. Рекомендуется использовать следующие установки для всех кешируемых ресурсов:
Expires
следует указать период от недели (минимум) до года (рекомендуется). Лучше использовать Expires
, чем Cache-Control: max-age
, так как он более широко поддерживается. Не устанавливайте срок больше одного года: это является нарушением правил RFC.Эти заголовки указывают, в течение какого периода браузер может использовать кешированные ресурсы, не запрашивая на веб-сервере их возможные обновления. Эти "сильные" заголовки действуют в обязательном порядке. После их установки и загрузки ресурса браузер не будет отправлять запросы GET на веб-сервер до истечения срока действия или очистки кеша пользователем.
Эти заголовки указывают, как браузер должен устанавливать тождественность файлов при кешировании. В заголовке Last-Modified
для этого используется дата. Заголовок ETag
использует любой уникальный идентификатор ресурса (чаще всего это версия файла или хеш контента). Last-Modified
– "слабый" заголовок, так как браузер применяет эвристические алгоритмы, чтобы определить, запрашивать ли элемент из кеша.
Эти заголовки позволяют браузеру эффективно обновлять кешированные ресурсы, отправляя запросы GET каждый раз, когда пользователь явным образом перезагружает страницу. Условные запросы GET не возвращают полный ответ, если ресурс не изменился на сервере, и таким образом обеспечивают меньшую задержку, чем полные запросы.
Expires
и Cache-Control max-age
, а также один заголовок из пары Last-Modified
и ETag
. Использовать и Expires
, и Cache-Control: max-age
излишне, как и указывать Last-Modified
и ETag
одновременно. Если ресурс время от времени изменяется, браузер может кешировать его до момента изменения, о чем сервер автоматически сообщит браузеру. Для этого каждой версии ресурса присваивается уникальный URL. Например, у вас есть ресурс под названием my_stylesheet.css. Мы можем переименовать этот файл, назвав его my_stylesheet_fingerprint.css. При изменении ресурса изменяется и его цифровой отпечаток, и, следовательно, его URL. Как только URL изменился, браузер повторно загружает ресурс. Цифровые отпечатки позволяют использовать длительные сроки действия, даже если ресурс часто изменяется.
Чаще всего для создания цифровых отпечатков используется 128-битное шестнадцатеричное число, представляющее собой закодированный хеш содержимого файла.
Другой способ – создавать отдельный каталог для каждой версии приложения и размещать в нем все объекты. Недостаток такого подхода заключается в том, что если объект не изменился при переходе к новой версии, его URL все равно обновится, что приведет к необходимости повторной загрузки. Использование хеша контента позволяет избежать этой проблемы, но представляет чуть большую сложность.
При переадресации выполняется запрос к серверу, что приводит к дополнительной задержке, поэтому количество переадресаций следует свести к минимуму. Чем меньше переадресаций, тем быстрее загружается страница. Рекомендуем вам внимательно изучить дизайн сайта и выполнить его оптимизацию для ускорения загрузки.
В примере ниже показано, какая переадресация допустима, а какая – нет:
В соответствии с рекомендациями Google по разработке адаптивного веб-дизайна, переадресации следует избегать.
Если же это необходимо, соблюдайте следующие требования:<link rel="alternate">
. GZIP
, используя собственные процедуры или сторонние модули. Это позволяет ускорить загрузку ресурсов, необходимых для отображения веб-сайта. Необходимо включить сжатие на веб-сервере. Чтобы узнать, как это сделать, перейдите по ссылкам ниже:
Время ответа сервера определяет, сколько занимает загрузка кода HTML для отображения страницы. Задержка сети между нашим и вашим сервером не учитывается. Это время может варьироваться в незначительном диапазоне. Если время ответа сервера колеблется слишком сильно, возможно, это связано с проблемами производительности.
Уменьшите время ответа сервера, чтобы оно составляло не более 200 мс. Большое время ответа может быть связано с десятками факторов: логика приложения, медленная работа с базой данных, маршрутизация, программная платформа, библиотеки, нехватка процессорной мощности или памяти. Все эти обстоятельства следует учитывать при оптимизации. Первым делом необходимо измерить время ответа сервера. Затем, обладая нужными сведениями, нужно обратиться к соответствующим руководствам. Решив проблему, продолжайте измерять время ответа и принимать необходимые меры.
Размер ресурса можно уменьшить, удалив ненужные байты, например лишние пробелы, переносы строки и отступы. Сократив код HTML, CSS и JavaScript, вы ускорите загрузку, синтаксический анализ и отображение страницы. Кроме того, размер CSS и JavaScript можно уменьшить, переименовав переменные (при условии корректного обновления HTML и работы селекторов).
Уменьшите объем HTML, CSS и JavaScript.
Чтобы оптимизировать код HTML, можно использовать расширение PageSpeed Insights для браузера Chrome. Выполните анализ страницы и перейдите к правилу "Сократите HTML". Чтобы оптимизировать код HTML, нажмите "Просмотреть оптимизированное содержание".
Чтобы уменьшить объем CSS, используйте инструменты YUI Compressor и cssmin.js.
Для оптимизации JavaScript можно использовать Closure Compiler, JSMin или YUI Compressor. Вы можете разработать программу, которая будет использовать эти инструменты, переименовывать файлы и сохранять их в рабочий каталог.
Если внешние скрипты имеют небольшой размер, их можно включить в документ HTML. Подобное встраивание позволяет браузеру продолжать загрузку страницы. Например, если HTML выглядит следующим образом:
<html> <head> <script type="text/javascript" src="small.js"></script> </head> <body> <div> Hello, world! </div> </body> </html>
а ресурс small.js
выглядит так:
/* contents of a small JavaScript file */
то этот скрипт можно встроить, как показано ниже:
<html> <head> <script type="text/javascript"> /* contents of a small JavaScript file */ </script> </head> <body> <div> Hello, world! </div> </body> </html>
Это избавит от необходимости выполнять внешний запрос small.js
, так как он располагается внутри документа HTML.
Чтобы код JavaScript не блокировал загрузку страницы, используйте атрибут async. Например:
<script async src="my.js">
Если в ресурсах JavaScript используется метод document.write, использовать асинхронную загрузку небезопасно. Рекомендуется переписать скрипты с использованием других средств.
Кроме того, если на странице используются взаимозависимые скрипты, при асинхронной загрузке JavaScript убедитесь, что скрипты загружаются в правильном порядке.
Если внешние ресурсы CSS имеют малый объем, их можно вставить непосредственно в документ HTML. Подобное встраивание позволяет браузеру продолжать загрузку страницы. Обратите внимание: если файл CSS слишком велик, после его встраивания PageSpeed Insights может вас предупредить, что верхняя часть страницы имеет слишком большой объем (правило приоритета видимого контента). Если файл CSS слишком велик, вам необходимо найти код CSS, отвечающий за контент в верхней части страницы и встроить его в HTML, отложив загрузку остальных стилей.
<html> <head> <link rel="stylesheet" href="small.css"> </head> <body> <div class="blue"> Hello, world! </div> </body> </html>
а ресурс small.css
имеет вид
.yellow {background-color: yellow;} .blue {color: blue;} .big { font-size: 8em; } .bold { font-weight: bold; }
то вы можете встроить необходимый код CSS следующим образом:
<html> <head> <style> .blue{color:blue;} </style> </head> <body> <div class="blue"> Hello, world! </div> </body> </html> <link rel="stylesheet" href="small.css">
Оригинальный файл small.css загружается после загрузки страницы. Порядок применения правил CSS определяется путем внедрения всех элементов <style>
и <link>
в документ с помощью JavaScript.
Будьте осторожны при встраивании URI данных в файлы CSS. В то время как использование URI небольших объемов данных иногда имеет смысл, при встраивании URI, ссылающихся на объемные файлы, код CSS верхней части страницы может увеличиться, что замедлит загрузку страницы.
Не следует встраивать атрибуты CSS в элементы HTML (например, < p style=...>
), так как это приводит к излишнему дублированию кода. Кроме того, подобное встраивание по умолчанию блокируется правилами по безопасности контента.
Следует проводить базовую и расширенную оптимизацию всех изображений. В рамках базовой оптимизации обрезаются ненужные поля, уменьшается глубина цвета (до минимально приемлемого значения), удаляются комментарии и изображение сохраняется в подходящем формате. Базовую оптимизацию можно выполнить с помощью любой программы для редактирования изображений, например GIMP. При расширенной оптимизации проводится сжатие файлов JPEG и PNG (без потерь).
Используйте инструменты сжатия изображений
Существуют инструменты, выполняющие дополнительное сжатие файлов JPEG и PNG без потерь и снижения качества. Для файлов JPEG рекомендуется использовать jpegtran или jpegoptim (доступно только для Linux, выполнять с параметром --strip-all
). Для PNG лучше использовать OptiPNG или PNGOUT.
Выберите подходящий формат файла изображения
Проверьте, какой формат лучше всего подходит вашему изображению. Вот несколько общих рекомендаций:
Если количество необходимых данных вверху страницы слишком велико, браузер пользователя будет отправлять дополнительные запросы на сервер. В среде с большой задержкой (например, в мобильных сетях) это может существенно замедлить загрузку страницы.
Сначала загружайте основное содержание страницы. Измените структуру страницы так, чтобы в первоначальном ответе сервера содержалась необходимая информация для отображения наиболее важной части страницы. Остальное можно загрузить позже. Возможно, вам придется разделить код CSS на две части: встроенная часть, отвечающая за стили в верхней части страницы, и часть, загрузку которой можно отложить.
Изучите рекомендации по ускорению загрузки в примерах ниже: