«Устранить CSS, блокирующий рендеринг, в верхнем содержании»


153

Я использовал аналитические данные Google PageSpeed, чтобы попытаться улучшить производительность своего сайта, и до сих пор он оказался чрезвычайно успешным. Такие вещи, как отсрочка скриптов, работали прекрасно, так как у меня уже была собственная версия jQuery .ready()для отсрочки скриптов до полной загрузки страницы, все, что мне нужно было сделать, это вставить эту конкретную функцию и переместить полные скрипты в конец страницы. Это сработало отлично.

Но теперь я обнаружил, что смотрю на одну оставшуюся желтую точку в контрольном списке: «Устранить блокирующий рендеринг CSS в содержимом выше сгиба».

Мой CSS настроен так, чтобы иметь один глобальный _.cssфайл, содержащий стили, которые применяются к общей структуре страницы или используются более чем в одном или двух местах на сайте. Большинство страниц тогда имеют связанный файл CSS (например, party.phpимеет party.css), содержащий стили, специфичные для этой конкретной страницы. Все CSS-файлы кэшируются на неопределенный срок, так как я добавляю /t=FILEMTIMEимена файлов (а затем удаляю их с помощью .htaccess), чтобы гарантировать, что файлы обновляются при их изменении.

Так или иначе, Google рекомендует встраивать критические стили, необходимые для превосходного контента. Проблема в том ... ну, взгляните на этот скриншот: http://prntscr.com/1qt49e

Как вы можете видеть ... ВСЕ содержание выше! Люди ненавидят прокрутку, особенно в игре, которая включает в себя загрузку многих страниц. Поэтому я спроектировал сайт так, чтобы он помещался на одном экране (при условии достаточно хорошего разрешения). Так что это означает ... ВСЕ стили применимы к содержанию выше всяких похвал! Итак ... есть ли решение? Или я застрял с этой желтой отметкой на почти идеальном счете?


ирония в том, что загрузка этого скриншота занимает много времени :) На самом деле, для меня скриншот так и не загрузился
— Anupam

@ Anupam Вероятно, был удален. Prntscr не совсем предназначен для постоянству, и я не ожидал , что этот вопрос будет довольно так популярен.
— Niet the Dark Absol

да, все хорошо, был только легкий комментарий
— Anupam

Ответы:


182

Ранее был задан связанный вопрос: что такое «содержание выше всех» в Google Pagespeed?

Во-первых, вы должны заметить, что это все о « мобильных страницах ».
Поэтому, когда я правильно истолковал ваш вопрос и скриншот, то это не для вашего сайта!

Напротив, выполнение некоторых вещей, рекомендованных Google в своих рекомендациях, будет хуже, чем лучше для «обычных» веб-сайтов.
И не все, что исходит от Google, является «святым Граалем» только потому, что оно исходит от Google. И сами они не являются хорошим примером для подражания, если вы посмотрите на их HTML-разметку.

Лучший совет, который я могу вам дать:

  • Установите ширину и высоту заменяемых элементов в вашем CSS, чтобы браузер мог размещать элементы без необходимости ждать замененного содержимого!

Кроме того, почему вы используете разные файлы CSS, а не только один?
Дополнительный запрос хуже, чем небольшой объем данных. И после первого запроса файл CSS все равно кэшируется.

Вещи, о которых всегда нужно заботиться:

  • максимально сократить количество запросов
  • сохраняйте общий вес страницы как можно ниже

И не ломайте голову над тем, как получить 100% инструмента Google PageSpeed ​​Insights ...! ;-)

Дополнение 1: Вот страница, на которой Google показывает нам, что они рекомендуют для оптимизации доставки CSS .

Как уже было сказано, я не думаю, что это ни реалистично, ни имеет смысл для «нормального» сайта! Потому что, в основном, когда у вас адаптивный веб-дизайн, наиболее вероятно, что вы используете медиа-запросы и другие стили макета. Так что, если вы не собираетесь загружать свой CSS первым и блокировать его, вы получите FOUT ( Flash из Unstyled Text ). Я действительно не верю, что это «лучше», чем хотя бы еще несколько миллисекунд для рендеринга страницы!

Imho Google начинает новую «шумиху» (когда я смотрю на все вопросы об этом здесь, на Stackoverflow) ...!


9
Отличный ответ. Беда в том, что Google, кажется, наказывает вас, если у вас медленная страница. Следовательно, они принуждают вас придерживаться их идей, будь они великими или совершенно глупыми. :(
— Стив Хорват

10
@Netsurfer не все, что исходит от Google, это "Святой Грааль" LOL. Я чесал голову, чтобы достичь 100, но остановился на 92 после прочтения этого комментария.
— kiranking

44
Вам следует больше подчеркнуть тот факт, что Google не придерживается своих собственных предложений .
— Мистер Смит

2
Дополнительные запросы станут меньше проблем с HTTP / 2 и SPDY из Википедии. «Дополнительные улучшения производительности в первом проекте HTTP / 2 (который был копией SPDY) происходят благодаря мультиплексированию запросов и ответов, чтобы избежать головной боли. проблема блокировки строк в HTTP 1 (даже при использовании HTTP-конвейеризации), сжатие заголовков и расстановка приоритетов запросов. "
— RationalDev любит GoFundMonica

3
пытался поднять мою страницу с 72 мобильных и 80 настольных компьютеров, но имел ту же проблему. Я отказываюсь размещать свой CSS где-то ниже и, возможно, ухудшать пользовательский опыт, показывая FOUT!
— publicknowledge

14

Как я получил 99/100 на Google Page Speed ​​(для мобильных устройств)

TLDR: сожмите и вставьте весь свой сценарий CSS между вашими <style></style>тегами.


Я преследовал этот неуловимый счет 100/100 в течение недели. Как и вы, последним оставшимся элементом было устранение «блокирования рендеринга CSS для содержимого, превышающего фолд».

Конечно, есть легко решить ?? Нет. Я опробовал решение loadCSS группы Filament . Слишком много .js на мой вкус.

Как насчет asyncатрибутов для CSS (например, JS)? Их не существует

Я был готов сдаться. Затем меня осенило. Если связывание скрипта блокировало рендеринг, что если я вместо этого вложил весь CSS в голову. Таким образом, было нечего блокировать.

Казалось абсолютно НЕПРАВИЛЬНЫМ встраивать 1263 строки CSS в мой тег стиля. Но я обернулся. Я сжал его (и префикс) сначала с помощью:

postcss -u autoprefixer --autoprefixer.browsers 'last 2 versions' -u cssnano --cssnano.autoprefixer false *.css -d min/ Смотрите пакет NPM postcss .

Теперь это была всего лишь одна длинная линия без космического пространства. Я поместил CSS в <style>your;great-wall-of-china-long;css;here</style>теги на моей домашней странице. Затем я пересмотрел информацию о скорости страницы.

Я перешел с 90/100 на 99/100 на мобильном телефоне !!!

Это идет против всего во мне (и, вероятно, вы). Но это решило проблему. Я просто сейчас использую его на своей домашней странице и включаю сжатый css программно через PHP include.

YMMV (ваш пробег может отличаться) в зависимости от длины вашего css. Google может перебить вас за слишком большое содержание. Но не думай; тест!

Ноты

  1. Пока что я делаю это только на своей домашней странице, поэтому люди получают БЫСТРЫЙ рендер на моей самой важной странице.

  2. Ваш CSS не будет кэширован. Я не слишком беспокоюсь, хотя. Когда они попадут на другую страницу моего сайта, файл .css будет кэширован (см. Примечание 1).


4
Спасибо за вашу преданность делу и исследования, однако я лично не буду мечтать сделать это: D
— Niet the Dark Absol

2
Так какой смысл, кроме попытки набрать очки, которые на самом деле ничего не помогут?
— LarryBud

Хорошо, что ваш рейтинг выше, но теперь каждая страница на вашем сайте будет иметь больший вес. Тем не менее, хорошая находка.
— EdwardM

@EdwardM Спасибо! Смотрите мою заметку 2 в посте. Как только они попадают на вторую страницу, css кэшируется, и проблема с весом исчезает.
— elbowlobstercowstand

1
@LarryBud Точка с более высоким счетом? Больше денег для меня. Чем выше мой сайт в Google, тем больше вероятность, что кто-то нажмет на него и станет клиентом. Поскольку Google использует скорость страницы для определения рейтинга , я решил улучшить свой счет.
— elbowlobstercowstand

9

Несколько советов, которые могут помочь:

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

  • Я видел следующую презентацию на jQueryUK о «скрытых секретах» в Googe Chrome (Canary) Dev Tools: DevTools Может это сделать . Проверьте разделы на время до первой краски , перекраски и дорогостоящего CSS.

  • Кроме того, если вы используете загрузчик, такой как requireJS, вы можете взглянуть на один из плагинов загрузчика CSS, называемый require-CSS , который использует CSSO - оптимизатор, который также выполняет структурную оптимизацию, например. объединение блоков с одинаковыми свойствами. Я использовал его несколько раз, и он может сохранить довольно много CSS от случая к случаю.

Вне вопроса: я второй @Enzino в создании спрайта для всех маленьких иконок, которые вы загружаете. Размеры файлов настолько малы, что на самом деле не требуется обходной сервер для каждого значка. Также имейте в виду общее количество одновременных запросов http, которые может выполнить браузер. Таким образом, запросы на большее количество маленьких значков также «блокируют рендеринг». Хотя пустая страница сравнивается с вашей, мне нравится, например, как duckduckgo загружается.


Кажется, duckduckgo также не заботится о своей странице, проверьте здесь
— Chetabahana

6

Пожалуйста, посмотрите на следующую страницу https://varvy.com/pagespeed/render-blocking-css.html . Это помогло мне избавиться от «Render Blocking CSS» . Я использовал следующий код для удаления « Render Blocking CSS ». Теперь в Google Speed ​​Insight я не получаю проблемы, связанные с блокировкой рендеринга CSS.

<!-- loadCSS -->
<script src="https://cdn.rawgit.com/filamentgroup/loadCSS/6b637fe0/src/cssrelpreload.js"></script>
<script src="https://cdn.rawgit.com/filamentgroup/loadCSS/6b637fe0/src/loadCSS.js"></script>
<script src="https://cdn.rawgit.com/filamentgroup/loadCSS/6b637fe0/src/onloadCSS.js"></script>
<script>
      /*!
      loadCSS: load a CSS file asynchronously.
      */
      function loadCSS(href){
        var ss = window.document.createElement('link'),
            ref = window.document.getElementsByTagName('head')[0];

        ss.rel = 'stylesheet';
        ss.href = href;

        // temporarily, set media to something non-matching to ensure it'll
        // fetch without blocking render
        ss.media = 'only x';

        ref.parentNode.insertBefore(ss, ref);

        setTimeout( function(){
          // set media back to `all` so that the stylesheet applies once it loads
          ss.media = 'all';
        },0);
      }
      loadCSS('styles.css');
    </script>
    <noscript>
      <!-- Let's not assume anything -->
      <link rel="stylesheet" href="styles.css">
    </noscript>

1
Когда я использую упомянутую функцию, она уменьшает оценку PageSpeed. Я написал следующую функцию: jsfiddle.net/kvfzbxxo Можете ли вы мне помочь?
— Аршо

Я реализовал эту же функцию для следующего URL- адреса, и, пожалуйста, посмотрите на скорость здесь " whitecashback.in ". Вы можете посмотреть исходный URL-адрес и найти функцию "loadCSS" в нижнем колонтитуле. Это поможет вам понять, как я реализовал код. Скорость страницы должна увеличиться, поскольку css загружается после страницы.
— Амук Саксена

Я использовал этот код: jsfiddle.net/sbpa1hun. Теперь CSS не загружается на веб-сайте.
— Аршо

Я упомянул, что после добавления этого кода: jsfiddle.net/sbpa1hun, который используется на вашем сайте, мой сайт потерял все стили. Это увеличивает скорость страницы, но CSS больше не работает! Можете ли вы помочь мне, как? Я получаю около 40 в скорости страницы. Но, добавив ваш код, я получил около 70. Но не смог заставить работать CSS.
— Аршо

1
Если вы пытаетесь сделать это в jsfiddle, то это не сработает, попробуйте этот код на своем веб-сайте, jsfiddle заблокирует загрузку CSS для внешних веб-сайтов. Потому что вы загружаете CSS из внешних источников, используя JavaScript. Поэтому, пожалуйста, попробуйте сделать это на вашем сайте. Также попробуйте включить файлы jquery, они отсутствуют в вашем скрипте. После включения файлов JS, это может работать. Также обратите внимание, что https-сайты могут работать в jsfiddle. Вы получаете эту ошибку: «Заблокирована загрузка смешанного активного контента». Вы должны решить это в первую очередь.
— Амук Саксена

4

Я тоже боролся с этим новым показателем скорости страниц.

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

Объединение всех CSS в один файл очень помогло. Все мои сайты вернулись до% 95 -% 98.

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


2
Smashing журнал имеет 100% баллов PageSpeed тест developers.google.com/speed/pagespeed/insights/...
— Мо

1

Оптимальным решением для этого в 2019 году является HTTP / 2 Server Push .

Вам не нужны какие-либо хакерские решения на JavaScript или встроенные стили. Однако вам нужен сервер, поддерживающий HTTP 2.0 (любая современная версия сервера), который сам требует, чтобы ваш сервер запускал SSL. Однако с Let's Encrypt нет никаких причин не использовать SSL в любом случае.

Мой сайт https://r.je/ имеет оценку 100/100 для мобильных и настольных компьютеров.

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

Вы можете использовать HTTP / 2 push, установив заголовок Link.

Пример Apache (.htaccess):

Header add Link "</style.css>; as=style; rel=preload, </font.css>; as=style; rel=preload"

Для NGINX вы можете добавить заголовок к вашему тегу местоположения в конфигурации сервера:

location = / {
    add_header Link "</style.css>; as=style; rel=preload, </font.css>; as=style; rel=preload";
}

С этим установленным заголовком браузер получает HTML и CSS одновременно, что мешает CSS блокировать рендеринг.

Вы захотите настроить его так, чтобы CSS отправлялся только при первом запросе, но заголовок Link является наиболее полным и наименее хакерским решением «Устранить блокировку рендеринга Javascript и CSS».

Для подробного обсуждения посмотрите мой пост здесь: Устраните блокировку рендеринга CSS с помощью HTTP / 2 Push


Возможно, я неправильно понял, но не заставит ли сервер Push Push отправлять CSS каждый раз при загрузке страницы, а не один раз до ее кэширования?
— Niet the Dark Absol

Да, есть несколько методов, таких как куки, которые могут помочь избежать этого. Взгляните на раздел по выборочному толканию здесь: nginx.com/blog/nginx-1-13-9-http2-server-push
— Том Б,


-1

Привет для jQuery Вы можете использовать только так

Используйте только async и type = "text / javascript"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.