Имеется проект, по которому заказчик хочет получить "зеленые карточки" 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 вновь оказываются "блокирующими"