Назад

GitHub делится опытом отказа от CSS-in-JS

Как GitHub заменил runtime CSS-in-JS на utility-классы и улучшил размер бандлов, INP и LCP.

GitHub делится опытом отказа от CSS-in-JS

В инженерном блоге GitHub выкатил подробный разбор того, как они перевели ключевые страницы с styled-components и runtime CSS-in-JS на серверный CSS с utility-классами.

Причина классическая — перформанс. По мере роста Primer React (их дизайн-системы) сгенерированный CSS начал раздуваться, а runtime-накладные расходы на парсинг и внедрение стилей в JS стали ощутимо тормозить гидрацию и рендеринг.

Что сделали:

  • Шипят больше CSS, но меньше JS. Перешли на заранее скомпилированные utility-классы и атрибуты.
  • Убрали runtime-вычисления. Стили больше не генерируются на лету в браузере пользователя.
  • Сохранили DX. Разработчики по-прежнему пишут компоненты на React, но под капотом вместо JS-функций генерации стилей работают атомарные классы.

Результаты в цифрах:

  • -58% к размеру JS-бандла на дашборде.
  • -80% к объёму CSS (благодаря переиспользованию атомарных utility-классов вместо дублирования правил для каждого компонента).
  • Ощутимый буст по метрикам INP (Interaction to Next Paint) и LCP.

Главный вывод:

Runtime CSS-in-JS был крутой концепцией для своего времени и дал огромный толчок DX, но для сложных продуктов на масштабах GitHub он стал узким местом. Тренд на Zero-Runtime (Panda CSS, StyleX) или классический/атомарный CSS продолжается.

Читать разбор в блоге GitHub

Скопировано