Всем привет!
У меня наверное дурная мысль!
Как заинлайнить стили в хтмл применяя стэк БЭМ?
Обоснование данной задачи: Поисковые системы рекомендуют инлайнить стили для рендера верхней части страницы. Для увеличения скорости отображения видимой части страницы клиенту.
Например, инструментом для генерации CriticalCSS: https://github.com/filamentgroup/criticalCSS. Но эта задача может быть за пределами сборки БЭМ-стека.
В идеале:
@DjonyBastone мысль вовсе не дурная, мы и сами этим балуемся, пока никто не видит :)
Вот технология для ENB: https://github.com/tadatuta/enb-css-hash и в https://github.com/tadatuta/enb-css-hash/issues/1 чуть-чуть объяснения про способ использования.
Готов дальше отвечать на вопросы, если они возникнут.
@tadatuta логика понятна берем блок
footerсоздаем файлfooter.css.jsonпишем массив, из строк со стилями:а чтобы завести всю эту штуковину не разобрался. Добавил настройку в enb make.js - issue
Подскажи что не так сделал, что еще нужно настроить, что бы сработало?
Эта технология на вход получает файлы
*.css, а на выходе генерируетbundle-name.css.jsonсо всеми стилями всех сущностей со всех уровней.Дальше нужен BEMHTML-шаблон, который для первого вхождения сущности в BEMJSON-е будет генерировать инлайновый
<style>со стилями из полученногоcss.json.Пример шаблона есть в https://github.com/tadatuta/enb-css-hash/issues/1
в make.js верно вписал код?
bundle-name.css.jsonне появилсяСделал веточку с примером: https://github.com/bem/project-stub/commit/f5719b436d53b0bcd25c03ed87579957e85d8c96
Т.к.
css.jsonне запрашивается браузером, он сейчас не будет пересобираться при запросе черезenb server. Так что нужно либо сделать, чтобы одна из вызываемых технологий от него явно зависела, либо какой-нибудь вотчер прикрутить.Не понял как сделать что бы технология зависела от
css.jsonдалек от легкого владения JS. Но стили инлайн сработали. Всем элементам страницы стили приехали. Это очень круто!!! Магия!!!В теории: а можно ли договориться с
enb-css-hashчто бы стили приезжали только требуемым блокам, а не всей странице?Ребята, а вообще как продуктивнее и рациональнее - только первый экран инлайнить или всю страницу?
Попробую в ближайшие дни добраться и запилить пример.
Разумеется, можно. Задача сводится к тому, чтобы отфильтровать один массив по другому. В каком-нибудь
lodashдля этого наверняка даже готовая функция найдется. Вопрос только в том, что будет служить источником информации о необходимых блоках: отдельный список, кастомная технология в рамкахdeps.js, хитрая интроспекция, вычисляющие сущности до фолда или что-то еще.Правильного ответа не существует. Это очень зависит от страницы, типичных кейсов ее использования и накладных расходов на дополнительный http-запрос (которые в свою очередь зависят от десятка факторов).