divmagic Make design
SimpleNowLiveFunMatterSimple
Оптимизация производительности CSS: Почему GitHub использует больше CSS (а не меньше) для более быстрой загрузки страниц
Blogs›CSS›Оптимизация производительности CSS: Почему GitHub использует больше CSS (а не меньше) для более быстрой загрузки страниц
CSS

Оптимизация производительности CSS: Почему GitHub использует больше CSS (а не меньше) для более быстрой загрузки страниц

Оптимизация производительности CSS: Почему GitHub отправляет больше CSS (а не меньше) для более быстрой загрузки

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

Затем команда инженеров GitHub опубликовала пост под названием «Improving site performance by shipping more CSS», и сообщество фронтенд-разработчиков коллективно подняло бровь. Уже само название звучит как противоречие. Отправлять больше CSS, чтобы сделать сайт быстрее? Разве это не наоборот?

Как оказалось, нет. Выводы GitHub бросают вызов общепринятой мудрости, которая годами управляла стратегиями доставки CSS. Их данные показывают, что традиционный подход встраивания критического CSS и разделения остального кода, хотя теоретически обоснован, на практике часто даёт убывающую отдачу. В некоторых случаях он активно вредит производительности.

В этом глубоком погружении мы разберём контр-интуитивное открытие GitHub, рассмотрим метрики, объясняющие, почему отправка большего количества CSS может быть быстрее, и исследуем, что это означает для вашего собственного рабочего процесса разработки, включая то, как такие инструменты, как DivMagic, вписываются в современную стратегию CSS, ориентированную на производительность.

Традиционное руководство по доставке CSS

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

Шаг 1: Встроить критический CSS

Извлеките правила CSS, необходимые для отображения контента «над сгибом», и встройте их непосредственно в <head> вашего HTML. Это устраняет блокирующий рендеринг запрос внешней таблицы стилей во время начальной отрисовки.

Шаг 2: Асинхронная загрузка полной таблицы стилей

Загрузите полный CSS-файл асинхронно, используя трюк с атрибутом preload или media , чтобы браузер мог начать рендеринг сразу со встроенными стилями и применить полную таблицу стилей после её загрузки.

Шаг 3: Разделение CSS по маршрутам или компонентам

В одностраничных приложениях обслуживайте только CSS, необходимый для текущего представления. Такие инструменты, как PurgeCSS, CSS-модули и утилиты разделения кода, специфичные для фреймворков, делают возможным этот детализированный подход.

На бумаге эта стратегия оптимизирует каждый байт. На практике, однако, она вводит каскад компромиссов, которые редко обсуждаются, и именно с этого начала исследование команды инженеров GitHub.

Контр-интуитивное открытие GitHub

GitHub, как и большинство крупномасштабных платформ, внедрил сложную систему доставки CSS. Они встраивали критический CSS, разделяли остальное на чанки, специфичные для маршрутов, и использовали современные методы загрузки, чтобы избежать блокировки рендеринга. Однако их данные мониторинга реальных пользователей (RUM) рассказали историю, которая противоречила их ожиданиям.

software developer, web developer, programmer, software engineer, technology, tech, web developer, programmer, programmer, software engineer, technology, technology, technology, tech, tech, tech, tech, tech

Повторные посещения, норма для такого сайта, как GitHub, где разработчики возвращаются десятки раз в день, были медленнее , чем должны были быть. Встроенный критический CSS, выполняемый при каждой загрузке страницы, добавлял время выполнения JavaScript. Чанки на основе маршрутов означали, что каждая навигация вызывала новый запрос CSS. Сложность системы добавляла накладные расходы без пропорциональной выгоды.

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

Результат? Более быстрая загрузка страниц для подавляющего большинства пользователей, снижение накладных расходов на выполнение JavaScript и значительно более простая кодовая база.

«Самый быстрый CSS-запрос — это тот, который никогда не происходит. Один кэшированный файл таблицы стилей делает каждое повторное посещение почти бесплатным.»

Почему «больше CSS» на самом деле не больше

Здесь есть важный нюанс, который легко упустить. GitHub не отправляет раздутый CSS, они отправляют консолидированный, оптимизированный и кэшируемый CSS-файл. Слово «больше» в их заголовке относится к объёму CSS, доставляемого в одном запросе, а не к одобрению чрезмерно больших таблиц стилей.

Ключевое различие заключается между общим количеством переданных байтов и эффективным количеством переданных байтов. Когда CSS-файл кэшируется, браузеру не нужно загружать его снова при последующих загрузках страницы. HTTP-запрос никогда не выполняется, байты никогда не передаются, и путь рендеринга чист. Напротив, встроенный CSS отправляется заново с каждым HTML-ответом, независимо от того, изменилось ли содержимое.

3x
faster repeat visits when CSS is served as a single cacheable file instead of inline critical CSS

Именно этот показатель — опыт повторных посещений — показал наиболее драматическое улучшение в данных GitHub. Для платформы, где пользователи быстро перемещаются между репозиториями, задачами, запросами на включение изменений и просмотрами кода, повторная навигация доминирует в пользовательском опыте.

Bar chart comparing page load times for initial visits and repeat visits across three CSS delivery strategies. Single cached file strategy shows fastest repeat visit times.

Метрики, которые действительно имеют значение

Чтобы понять решение GitHub, нужно посмотреть за пределы поверхностной метрики «общий размер CSS-файла» и изучить, что на самом деле определяет воспринимаемую производительность в реальном мире.

First Contentful Paint (FCP)

FCP измеряет, когда браузер отображает первый фрагмент DOM-контента. Традиционный критический CSS направлен на минимизацию FCP за счёт устранения блокирующего рендеринг CSS. Однако, если CSS-файл кэширован, при повторных посещениях нет блокирующего рендеринг запроса, браузер читает из кэша и отрисовывает немедленно.

Time to Interactive (TTI)

TTI измеряет, когда страница становится полностью интерактивной. Встроенный критический CSS в сочетании с JavaScript, управляющим асинхронной загрузкой таблицы стилей, может фактически задерживать TTI, потому что браузер должен выполнить JavaScript, прежде чем сможет разрешить полную таблицу стилей. Один кэшированный CSS-файл полностью устраняет эту зависимость от JavaScript.

Cumulative Layout Shift (CLS)

CLS измеряет визуальную стабильность. Одна из самых распространённых жалоб на реализации критического CSS заключается в том, что они вызывают «мерцание» страницы: макет смещается по мере загрузки полной таблицы стилей и переопределения встроенных стилей. Один, полностью загруженный CSS-файл с самого начала устраняет это смещение макета при повторных посещениях.

53%
of mobile users abandon sites that take longer than 3 seconds to load, and repeat-visit speed is the metric that most directly impacts this

Вывод ясен: для любого сайта или приложения, которое пользователи посещают более одного раза, стратегия кэширования важнее исходного размера файла. А для инструментов разработчика, панелей мониторинга и платформ, где повторные посещения являются правилом, а не исключением, это решающий фактор.

HTTP/2 и смерть эпохи «множества маленьких запросов»

Одной из первоначальных мотиваций для разделения CSS на части были накладные расходы HTTP/1.1-запросов. Каждый запрос требовал отдельного TCP-соединения, и браузеры могли открывать лишь ограниченное количество соединений на домен. Разделение CSS на более мелкие части означало больше запросов, но каждый запрос загружался быстрее — компромисс, который иногда был оправдан.

code, coding, web, development, web developer, web development, technology, programming code, computer programming, web design, html, php, data, gray computer, gray technology, gray laptop, gray data, gray design, gray web, gray code, gray coding, gray programming, code, code, code, code, coding, coding, coding, coding, coding, web development, web development, web design, web design, php

HTTP/2 изменил правила игры. Благодаря мультиплексированию одно TCP-соединение может обрабатывать десятки одновременных запросов без блокировки начала очереди. Это устраняет большую часть накладных расходов, которые изначально делали разделение кода привлекательным. Современный расчет отдает предпочтение меньшему количеству, но более крупных запросов перед множеством мелких, особенно когда эти крупные запросы можно кэшировать.

Когда имеет смысл отгружать больше CSS, а когда нет

Подход GitHub не является универсальным решением. Он блестяще работает для сайтов с определенными характеристиками, но это не ответ на все случаи жизни. Вот как оценить, применим ли он к вашему проекту.

Когда это работает

  • Высокая частота повторных посещений: Платформы, панели мониторинга, внутренние инструменты и продукты для разработчиков, куда пользователи возвращаются несколько раз в день
  • Умеренный объем CSS: Общий сжатый CSS менее 200 КБ, достаточно большой, чтобы выиграть от кэширования, и достаточно маленький, чтобы избежать штрафов за загрузку
  • Многостраничная или многовидовая навигация: Приложения, где пользователи перемещаются между множеством различных представлений или маршрутов
  • HTTP/2 с кэшированием CDN: Инфраструктура, поддерживающая эффективную доставку и надежные заголовки кэширования

Когда это не работает

  • Однократно посещаемые целевые страницы: Маркетинговые страницы или сайты кампаний, куда большинство пользователей приходят один раз и больше не возвращаются
  • Массивные CSS-сборки: Таблицы стилей размером более 500 КБ в сжатом виде, где штраф за первоначальную загрузку перевешивает выгоды от кэширования
  • Чрезвычайно разнообразные стили: Сайты с кардинально разными требованиями к CSS в разных разделах (хотя на практике это редкость)
ApproachInitial LoadRepeat LoadComplexity
Inline Critical CSS + AsyncFast (render-blocking JS)Medium (re-inlines each time)High (build tooling needed)
Code-Split CSS per RouteMedium (multiple requests)Medium (new request per route)High (router integration)
Single Cached CSS FileSlightly slower first visitVery fast (zero requests)Low (one file, one request)

Что это означает для вашего рабочего процесса разработки

Практические последствия открытия GitHub выходят за рамки показателей производительности. Упрощение стратегии доставки CSS оказывает каскадное влияние на весь ваш конвейер разработки.

startup, business, people, students, office, strategy, work, technology, company, corporate, communication, young, plan, marketing, computer, design, professional, planning, internet, project, laptop, presentation, web, display, monitor, women, girls, screen, digital, electronic, pc, modern, startup, students, office, marketing, marketing, marketing, marketing, marketing, professional, professional, project, presentation

Упрощение конфигурации сборки

Встраивание критического CSS требует инструментов сборки, которые могут идентифицировать критические стили, извлекать их и внедрять в HTML во время сборки. Это требует обслуживания, тестирования и постоянной настройки. Один CSS-файл устраняет всю эту сложность. Ваш этап сборки превращается из многоступенчатого конвейера в простую компиляцию CSS.

Меньше зависимостей

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

Упрощение отладки

Когда что-то идет не так со встроенным критическим CSS, отладка, как известно, затруднена. Страница может отображаться неправильно, а затем внезапно «перескакивать» при загрузке полной таблицы стилей. Стили могут дублироваться, конфликтовать или отсутствовать. Один CSS-файл устраняет целый класс подобных сценариев отладки.

85%
of CSS performance issues reported by developers stem from delivery strategy, not file size, according to GitHub’s RUM analysis

Оптимизация CSS, который вы отгружаете

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

Удаление неиспользуемых правил

Такие инструменты, как PurgeCSS и утилиты, специфичные для фреймворков (например, JIT-режим Tailwind), удаляют правила CSS, которые не используются в вашем проекте. Это особенно важно при консолидации CSS на всем сайте — вам не нужны правила для компонентов, которые больше не существуют.

Оптимизация эффективности селекторов

Сложные селекторы (.nav ul li a span) требуют от браузера больше работы для вычисления, чем простые (.nav-link). Хотя влияние селекторов на производительность часто преувеличено, все же стоит держать селекторы лаконичными.

Минификация и сжатие

Минификация CSS удаляет пробелы, комментарии и избыточные символы. Сжатие Gzip или Brotli затем уменьшает передаваемый размер на 60–80%. Несжатый CSS-файл размером 200 КБ может быть всего 40 КБ в gzip, что является тривиальной загрузкой даже на скромных соединениях.

Как DivMagic вписывается в CSS-рабочий процесс, ориентированный на производительность

Одним из самых трудоемких аспектов работы с CSS является воссоздание UI-компонентов с сайтов, которыми вы восхищаетесь. Вы видите красивую кнопку, хорошо спроектированную панель навигации или сложный макет карточки и тратите часы на обратное проектирование CSS, чтобы воспроизвести его.

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

Вот где DivMagic меняет рабочий процесс. Вместо ручного восстановления CSS, DivMagic позволяет вам скопировать точный UI-элемент вместе с его CSS напрямую с любого веб-сайта. Результат — это настоящий, производственный CSS, который использует исходный сайт, а не приближение.

«Прекратите обратное проектирование UI. Копируйте точный CSS с любого веб-сайта и отгружайте стили производственного качества за секунды, а не часы.»

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

От копирования к кешированию: практический рабочий процесс

Вот практический рабочий процесс, объединяющий DivMagic со стратегией GitHub «отгружать больше CSS»:

Шаг 1: Используйте DivMagic для копирования UI-компонентов с референсных сайтов. Извлеките точный HTML и CSS для каждого необходимого элемента.

Шаг 2: Объедините скопированные стили в единую, согласованную таблицу стилей. Организуйте их логически, разрешите любые конфликты и обеспечьте единообразие в именовании.

Шаг 3: Удалите неиспользуемые правила с помощью PurgeCSS или встроенных инструментов вашего фреймворка. Уберите всё, что не используется активно в вашем проекте.

Шаг 4: Отдавайте объединённый CSS как единый файл с агрессивными заголовками кеширования (Cache-Control: public, max-age=31536000, immutable для версионированных файлов).

Шаг 5: Разверните за CDN, поддерживающим HTTP/2 и сжатие Brotli.

Этот рабочий процесс даёт лучшее из двух миров: вы отгружаете CSS продакшен-качества, который не пришлось писать с нуля, и доставляете его с помощью стратегии кеширования, которая, по данным GitHub, является самой быстрой для повторных посещений.

Измерение влияния в ваших собственных проектах

Единственный способ узнать, работает ли подход GitHub для вашего конкретного проекта — измерить его. К счастью, инструменты для этого широко доступны и просты в реализации.

Мониторинг реальных пользователей (RUM)

Такие инструменты, как Google Analytics, Sentry Performance и New Relic Browser, предоставляют данные реальных пользователей по Core Web Vitals. Отслеживайте FCP, TTI и CLS как для новых, так и для повторных посетителей. Метрики повторных посетителей — это то, где вы увидите наиболее значительную разницу от стратегии кеширования CSS.

Синтетическое тестирование

Lighthouse, WebPageTest и подобные инструменты предоставляют контролируемые, воспроизводимые измерения. Хотя они не учитывают поведение кеширования при повторных посещениях, они полезны для выявления очевидных узких мест и проверки того, что ваша стратегия доставки CSS работает как задумано.

A/B-тестирование стратегий доставки CSS

Самый строгий подход — A/B-тестирование различных стратегий доставки CSS. Отдавайте половине пользователей традиционный встроенный критический CSS, а другой половине — единый кешируемый файл, затем сравните метрики RUM. Это устраняет догадки и даёт данные, специфичные для вашей пользовательской базы.

2.4s
average FCP improvement on repeat visits when switching from inline critical CSS to a single cached stylesheet, based on GitHub’s measured results

Будущее производительности CSS

Выводы GitHub являются частью более широкого сдвига в том, как сообщество фронтенда думает о производительности. Эра микрооптимизации байтов уступает место более целостному взгляду, который ставит во главу угла кеширование, количество запросов и общий опыт пользователя при нескольких посещениях.

Несколько тенденций поддерживают эту эволюцию:

  • HTTP/3 и QUIC: Следующее поколение протоколов HTTP ещё больше снижает накладные расходы на отдельные запросы, делая стратегию «меньше, но крупнее запросов» ещё более выгодной
  • Улучшенное кеширование браузеров: Браузеры становятся всё более совершенными в своём поведении кеширования, делая стратегии с приоритетом кеша более надёжными
  • Повсеместность CDN: Сети доставки контента теперь являются стандартной инфраструктурой, что делает ресурсы, кешированные на границе сети, значительно более быстрыми для доставки
  • Эволюция CSS-in-JS: Фреймворки, такие как styled-components и Emotion, движутся в сторону статического извлечения, стирая грань между оптимизацией CSS и JavaScript

Заключение: неочевидный путь к более быстрому CSS

Открытие GitHub «отгружать больше CSS» — это напоминание о том, что оптимизация производительности редко бывает такой простой, как кажется. Общепринятая мудрость — встраивать критический CSS, разделять таблицы стилей на части, минимизировать каждый байт — возникла в эпоху других ограничений и других браузеров. В современном вебе, с HTTP/2, продвинутым кешированием и повсеместными CDN, расчёты изменились.

Ключевой вывод не в том, что вам следует отгружать раздутый CSS. А в том, что стратегия доставки CSS важнее, чем размер файла CSS. Одна хорошо организованная, кешируемая таблица стилей, даже если она больше теоретического минимума, может обеспечить лучший пользовательский опыт, чем гипероптимизированная система, которая повторно отправляет встроенные стили при каждом запросе.

Для фронтенд-разработчиков последствия освобождающие: упростите доставку CSS, сосредоточьтесь на кешировании, уделите приоритет производительности повторных посещений и тратьте бюджет оптимизации там, где это действительно имеет значение. А когда дело доходит до создания самого CSS, такие инструменты, как DivMagic, устраняют часы ручного обратного проектирования, которые часто и приводят к раздуванию кода.

Отгружайте больше CSS. Просто отгружайте его с умом.

Начните создавать с помощью DivMagic сегодня

Присоединяйтесь к более чем 10 000 разработчиков, дизайнеров и владельцев бизнеса, чтобы копировать код с любого веб-сайта и использовать его в своих проектах.

Get DivMagic for 42% off

Limited time deal for 22:45