Google PageSpeed Insights: «Удалите код JavaScript и CSS, блокирующий отображение верхней части страницы»

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

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

Хочу обратить внимание – каждый сайт индивидуален. И если для одного сайта некоторые решения будут полезны, то для другого могут оказать негативное влияние.

Суть проблемы

Данное предупреждение срабатывает, когда в коде документа между тегами <head>…</head> обнаружены ссылки на внешние файлы javascript и css. И пока они не будут загружены, дальнейший рендеринг страницы не будет выполняться. Таким образом они блокируют вывод контента на странице.

Как удалить JavaScript, препятствующий отображению верхней части страницы

Большинство рекомендаций в Интернете сводятся к тому, чтобы перенести все скрипты в подвал сайта. Однако не стоит слепо выполнять эту рекомендацию - есть большая вероятность того, что функционал сайта будет нарушен:

  •  Для начала мы должны убедиться, что JavaScript не участвует в процессе отображения страницы.
  •  
  •  Скрипты небольшого размера размещаем в самом содержимом HTML страницы. Например:
  • <?php echo '<script>' . file_get_contents($_SERVER['DOCUMENT_ROOT'] .'/smallscript.js') . '</script>'; ?>
  •  
  •  Проверяем скрипты на зависимости и очередность загрузки. Если ни того, ни другого не имеется, то добавляем к ним атрибут «async»:
  • <script async src="script.js"></script>
  •  Благодаря этому атрибуту такие скрипты будут загружаться асинхронно.
  •  

Данную инструкцию нельзя применять к библиотеке JQuery, которая используется в подавляющем большинстве сайтов. Далее рассмотрим правильное решение для JQuery.

Если поместить jquery.js перед закрывающим тегом </body> или попытаться загрузить его асинхронно, то зависимые скрипты попросту перестанут работать и многие функции сайта «отвалятся». Правильным решением в данном случае может послужить использование события onload:

<script> 
function asyncjs() {
 … 
}
</script> 
<script src="jquery.js" async onload="asyncjs()"></script>

На популярных cms для решения таких задач используются плагины. Их принцип несколько отличается от описанного выше. Рассмотрим на примере Autoptimize для Wordpress:

  •  Плагин объединяет все *.js и инлайновые скрипты в один файл. При этом очередность загрузки сохраняется.
  •  
  •  Единый файл подключается в подвале страницы с атрибутом async.
  •  

Вы так же можете использовать данный метод для самописных cms или сайтов на чистом HTML:

<script src="allscripts.js" async></script>

Блокирующие css – варианты решения

На данный момент самым новым способом решить эту проблему является использование стандартизированной директивы preload. Она позволяет браузерам получать style.css не блокируя рендеринг.

Первооткрывателем этого способа был Scott Jehl, дизайнер и разработчик из The Filament Group.

<link rel="preload" as="style" href="async_style.css" onload="this.rel='stylesheet'">

Несомненно, будущее за этим решением. Но, к сожалению, в настоящее время еще не все браузеры поддерживают preload.

Поэтому мы не будем сейчас обсуждать этот метод более подробно, а рассмотрим консервативный способ.

Смысл этого метода заключается в том, чтобы поместить в секцию head самые важные фрагменты стилей (critical css), которые необходимы для первоначальной отрисовки страницы. В свою очередь, основные файлы css будут загружаться после загрузки контента. Большинство новичков допускают серьезную ошибку на этом этапе, и вставляют все имеющиеся стили в документ. Это не только не решает ситуацию, но и усугубляет ее.

Правильное решение:
<html>
<head>
<style>
/*Критический css*/
h1 {text-align: center; color: #ccc }
</style>
</head>
<body>
<h1>Контент страницы</h1>
...
<!-- Подключаем основные файлы стилей при помощи JQuery -->
<script src="jquery.js"></script>
<script>
$(document).ready(function() {
$("head").append("<link rel='stylesheet' href='styles.css' />");
});
</script>
</body>
</html>

Еще одной распространенной ошибкой является создание большого количества правил для критического css. Это характерно для сайтов с большим количеством контента на странице – разнообразные слайдеры, виджеты и прочее. Если мы уменьшим количество правил, страница будет дергаться. Если увеличим – получим предупреждение «Оптимизируйте загрузку видимого контента». В этом случае я бы рекомендовал объединить все стили в один файл и подключить традиционным способом.

В заключение хочу добавить, что Google PageSpeed – хороший инструмент для выявления проблемных мест вашего сайта. Но при анализе он не учитывает его индивидуальных особенностей. Поэтому самый главный совет: подходите обдуманно к выполнению его рекомендаций!