Как реализовать асинхронную загрузку CSS специально для PageSpeed Insights?

Имеется проект, по которому заказчик хочет получить "зеленые карточки" PageSpeed Insights ( >= 85 баллов). Фронтенд сторона проекта представляет из себя монолитный кусок CSS от старых разработчиков размером ~350 кбайт + 400 кбайт CSS от fancybox, semantic и десятка других фреймворков/непонятно чего. В общем, минифицированные и конкатенированные CSS весят >700 кбайт.
Результаты PageSpeed на данный момент 63 - мобильная и 79 - десктопная версия сайта. Рекомендовано "оптимизировать" и "избежать блокировки" css-файлами при загрузке страницы.
Первое, что было сделано - использование uncss, что в три раза снизило "вес", однако PageSpeed не придал этому значения. Так же был использован популярный метод динамической загрузки css через манипуляции с аттрибутом media:
link href="/css-skin/skin-blue.css" rel="stylesheet" media="none" onload="media='all'"

Но и тут PageSpeed словно игнорирует динамическую загрузку, считая, что рендер все равно не начинается без подгрузки этих файлов.
Ради эксперимента перед изменением media был задан таймаут в 10 секунд. На этот раз голую страницу без CSS PageSpeed принял как родную и дал "зеленые карточки". Естественно, оставлять посетителей без css на 10 секунд не то, что нужно, чтобы угодить PageSpeed. Посоветуйте, как можно решить этот вопрос?
Были испробованы:
1. подгрузка css из js - PageSpeed считает их блокирующими,
2. использование rel=preload (на данное время поддерживается лишь Chrome 50, дает хорошие результаты, но малораспространено),
3. Использование "критического" css - генерируемый утилитой critical инлайновый style дает нужные баллы только на главной странице. На подстраницах он уже не годится + мало баллов.
4. Интересная особенность - из утилиты ngrok хорошо себя показывает способ динамической загрузки через media + onload, а безCSS-ное безобразие на время загрузки прикрывается loader-ом. Однако будучи выгруженным на боевой сервер "динамические" css вновь оказываются "блокирующими"
  • Вопрос задан
  • 26997 просмотров
Решения вопроса 3
zona7o
@zona7o
Веб-разработчик
В footer. Либо повесить на document.ready
<script type="text/javascript">
    var head = document.head
            , link = document.createElement('link');

    link.type = 'text/css';
    link.rel = 'stylesheet';
    link.href = '{{ css_file }}';
    head.appendChild(link);
</script>
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
100/100 x2
precosts.com
Смотрим исходник и тестируем
Делаем аналогично.
PS: вся соль в минификаторе CSS который выдаёт строку в инлайн через echo динамически (соотв., на сервере - она в кэше) и выносим вниз остальное, что не критично для первичной разметки.
PS2: Считаю, что время загрузки (избавляясь от JS) дороже валидации недоговорившихся валидаторов гигантов IT-индустрии при корректной работе решения на большинстве устройств, поэтому тэг link - стоит внутри body, несмотря на правила сообщества w3c.
Иными словами: между JS-надстройками для отложенной загрузки CSS и неверной (с точки зрения валидации w3c), но рабочей разметке - лучше выбрать разметку, минимизировав нагрузку на клиентское устройство в момент рендеринга страницы.
PS3: Вот еще неплохой сервис для проверки: www.webpagetest.org
(пошел "полировать до блеска" свой код )))
---------------
Все линки на тесты: тут
Еще пару ресурсов по советам оптимизации:
Yahoo: https://developer.yahoo.com/performance/rules.html
Google: https://developers.google.com/speed/pagespeed/modu...
--------------
PS4: Про "critical CSS":
Можно вставить слегка переделанный скрипт из ответа на SO на все страницы и собрать стили по каждому URLу, запустив по всем линкам crawler и потом - найти пересечения между ними (П1).
Затем - объединить (merge) все возможные стили (О1), которые грузятся из файлов на сервере и снова найти пересечения между П1 и О1.
Результатом и будет искомый "critical css".
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dolosweb
У меня ccs файлы максимум 2-10 кб, грамотное построение и наследования. Не знаю даже 400кб css в нем роман война и мир между строк записан наверное. В любом случае css надо менять, в погоне за циферками - реальный результат будет реальным.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы