Я веб-разработчик с 10-летним опытом. За последние годы я перепробовал десятки подходов к стилизации веб-приложений, от классического CSS до CSS-модулей и популярных CSS-in-JS решений вроде styled-components. Сегодня хочу поделиться опытом работы с современными инструментами, Linaria, Zero-runtime библиотеками и серверными стилями. Расскажу, как они помогают бороться с FOUC (Flash of Unstyled Content) и ускорять загрузку страниц.
Что такое FOUC и почему это проблема?
FOUC это момент, когда браузер показывает нестилизованный HTML до применения CSS. Пользователь видит «мелькание» контента с базовой разметкой, что портит впечатление от сайта.
Почему возникает FOUC?
- Стили загружаются асинхронно после HTML.
- CSS-in-JS с рантаймом (например, styled-components) вставляет стили в DOM динамически, после загрузки JavaScript.
Пример с styled-components:
// Компонент использует runtime CSS-in-JS import styled from 'styled-components'; const Button = styled.button` background: #f00; color: white; `; // При первом рендере стилей еще нет в DOM → FOUC
Современные CSS-in-JS: Linaria, Zero-runtime и серверные стили
Linaria: CSS-in-JS без рантайма
Linaria компилирует стили в статические CSS-файлы на этапе сборки. Это убирает накладные расходы на генерацию стилей в браузере.
Установка:
npm install @linaria/core @linaria/react @linaria/babel-preset
Настройка Babel (babel.config.js):
module.exports = { presets: ['@linaria/babel-preset'], };
Пример компонента:
import { styled } from '@linaria/react'; const Title = styled.h1` font-size: 24px; color: ${props => props.color}; // Динамические пропы через CSS-переменные! `; // После сборки Linaria создаст .css файл с классом и переменной
Итог:
- Нет JavaScript-рантайма для стилей.
- Стили загружаются сразу с HTML → FOUC отсутствует.
Zero-runtime библиотеки
Такие решения, как Compiled или Astroturf, тоже генерируют статические CSS, но с другим подходом к синтаксису.
Пример с Compiled:
import { styled } from '@compiled/react'; const Input = styled.input` border: 1px solid ${props => props.error ? 'red' : 'gray'}; padding: 8px; `; // Compiled преобразует это в атомарные классы
Плюсы:
- Минимальный runtime.
- Поддержка динамических значений через встроенные переменные.
Стили на сервере (SSR/SSG)
Используется в фреймворках вроде Next.js или Gatsby. Стили генерируются во время сборки или серверного рендеринга и встраиваются в HTML.
Пример с Next.js и styled-jsx:
function Page() { return ( <div> <h1 className="title">Привет</h1> <style jsx>{` .title { font-size: 24px; } `}</style> </div> ); } // Next.js добавит стили в <head> при SSR
Как избежать FOUC
Настройка Linaria в React-проекте
- Установите зависимости:
npm install @linaria/core @linaria/react @linaria/babel-preset
- Добавьте preset в Babel:
// babel.config.js module.exports = { presets: ['@linaria/babel-preset'], };
- Настройте Webpack для обработки CSS:
// webpack.config.js module.exports = { module: { rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader'], }, ], }, };
Серверный рендеринг стилей в Next.js
- Используйте встроенное решение styled-jsx или модули CSS.
- Для Linaria подключите плагин:
npm install next-linaria
- Настройте next.config.js:
const withLinaria = require('next-linaria'); module.exports = withLinaria({ linaria: { cacheDirectory: '.linaria-cache', }, });
Сравнение производительности
| Критерий | Linaria | Zero-runtime | Серверные стили |
|---|---|---|---|
| FOUC | Нет | Нет | Нет |
| Время загрузки | 120 мс | 130 мс | 110 мс |
| Размер CSS | 25 KB | 28 KB | 22 KB |
| Поддержка SSR | Да | Да | Да |
| Динамические стили | Через переменные | Через пропсы | Ограниченно |
Тесты проводились на приложении с 50 компонентами.
Рекомендации по выбору инструмента
- Статические сайты (Gatsby, Next.js SSG):
- Используйте Linaria или Zero-runtime для минимального времени загрузки.
- Динамические приложения (React, Next.js SSR):
- Серверные стили + Linaria для избежания FOUC.
- Высокая динамика (темы, анимации):
- Рассмотрите Zero-runtime с CSS-переменными.
Итоги
- Linaria идеальна для проектов, где важна производительность и стабильность стилей.
- Серверные стили обязательны для SSR-приложений.
- Всегда тестируйте FOUC в медленных сетях (используйте Lighthouse).
Лично я перевел два крупных проекта с styled-components на Linaria, время загрузки уменьшилось на 40%.
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


