Emotion через SWC

## Назначение интеграции Emotion и SWC **Emotion** — популярная CSS-in-JS библиотека для React, предоставляющая инструменты для создания стилизованных компонентов, динамической генерации стилей и оптимизации работы с CSS на уровне JavaScript. При использовании классической конфигурации Emotion обычно применяется Babel-плагин `@emotion/babel-plugin`, который выполняет ряд преобразований исходного кода. С появлением **SWC (Speedy Web Compiler)** возникла возможность заменить многие операции Babel значительно более быстрыми аналогами. Для проектов с большим количеством компонентов и развитой системой стилизации это позволяет существенно сократить время сборки и повысить производительность инструментов разработки. Интеграция Emotion через SWC обеспечивает: * автоматическую генерацию читаемых имён классов; * поддержку source maps; * оптимизацию шаблонных литералов; * улучшенную отладку компонентов; * ускоренную компиляцию по сравнению с Babel; * поддержку SSR-сценариев Emotion. --- ## Как работает Emotion без дополнительных трансформаций Базовый пример: ```jsx import styled from "@emotion/styled"; const Button = styled.button` padding: 12px 20px; background: royalblue; color: white; `; ``` Во время выполнения Emotion: 1. Анализирует шаблонную строку. 2. Генерирует CSS. 3. Создаёт уникальный класс. 4. Добавляет стиль в DOM. 5. Привязывает класс к компоненту. Без специальных преобразований сборщик практически не участвует в оптимизации такого кода. --- ## Роль SWC в обработке Emotion SWC выполняет часть работы заранее во время компиляции. Исходный код: ```jsx const Button = styled.button` color: red; `; ``` После преобразований могут появляться дополнительные метаданные: ```jsx const Button = styled.button( "color:red;", "label:Button;" ); ``` Emotion получает уже подготовленную информацию и тратит меньше ресурсов на этапе выполнения приложения. Основные преимущества такого подхода: | Возможность | Без SWC | Со SWC | | ------------------- | ----------- | ------------- | | Label генерация | Нет | Да | | Source maps | Ограниченно | Да | | Оптимизация CSS | Частично | Да | | Скорость компиляции | Средняя | Очень высокая | | Babel не требуется | Нет | Да | --- ## Включение поддержки Emotion в SWC Настройка производится через файл `.swcrc`. Базовая конфигурация: ```json { "jsc": { "experimental": { "plugins": [] }, "transform": { "react": { "runtime": "automatic" } } } } ``` Для Emotion используется специальный блок: ```json { "jsc": { "transform": { "react": { "runtime": "automatic", "importSource": "@emotion/react" } } } } ``` Параметр `importSource` сообщает компилятору о необходимости использовать JSX Runtime от Emotion. --- ## Новый JSX Runtime Emotion Emotion предоставляет собственный JSX Runtime. Вместо: ```jsx /** @jsx jsx */ import { jsx } from "@emotion/react"; ``` современный код может выглядеть следующим образом: ```jsx import { css } from "@emotion/react"; function App() { return (
Hello
); } ``` При использовании SWC директивы `@jsx` больше не требуются. Настройка: ```json { "jsc": { "transform": { "react": { "runtime": "automatic", "importSource": "@emotion/react" } } } } ``` --- ## Поддержка свойства css Одной из ключевых возможностей Emotion является специальный проп `css`. Пример: ```jsx
Text
``` Либо: ```jsx
Text
``` SWC автоматически преобразует такие конструкции в вызовы внутренних API Emotion. В результате браузер получает уже готовые классы, а не исходные объекты стилей. --- ## Автоматическая генерация label Одной из наиболее полезных функций является генерация читаемых имён компонентов. Исходный код: ```jsx const SubmitButton = styled.button` color: white; `; ``` Без label итоговый класс может выглядеть так: ```html css-1a2b3c ``` Со включённой генерацией: ```html css-1a2b3c-SubmitButton ``` Подобные имена значительно упрощают: * анализ DOM; * отладку React-компонентов; * поиск проблем со стилями; * профилирование интерфейса. --- ## Настройка labelFormat Emotion позволяет задавать собственный формат имён. Пример конфигурации: ```json { "jsc": { "experimental": { "emotion": { "labelFormat": "[local]" } } } } ``` Возможные шаблоны: | Шаблон | Значение | | -------------------- | ---------------------- | | `[local]` | Имя компонента | | `[filename]` | Имя файла | | `[dirname]` | Каталог | | `[local]-[filename]` | Комбинированный формат | Пример: ```jsx const Card = styled.div``; ``` Файл: ```text ProfileCard.jsx ``` Результат: ```text css-xyz-Card-ProfileCard ``` --- ## Source Maps Source Maps позволяют связывать сгенерированный CSS с исходным кодом приложения. При возникновении проблемы в DevTools можно увидеть: ```css color: red; ``` и сразу определить исходный файл: ```text src/components/Button.jsx ``` В крупных проектах это значительно сокращает время поиска ошибок. Настройка: ```json { "jsc": { "experimental": { "emotion": { "sourceMap": true } } } } ``` --- ## Оптимизация шаблонных литералов Emotion активно использует template literals. Пример: ```jsx const Box = styled.div` padding: 10px; margin: 20px; border-radius: 8px; `; ``` SWC может анализировать содержимое шаблонной строки заранее и выполнять оптимизации ещё до запуска приложения. Преимущества: * меньше работы во время выполнения; * меньше выделений памяти; * ускорение гидратации; * уменьшение нагрузки на клиентский JavaScript. --- ## Использование css-функции Функция `css()` создаёт переиспользуемые наборы стилей. ```jsx import { css } from "@emotion/react"; const primaryStyle = css` color: white; background: blue; `; ``` Применение: ```jsx ``` SWC корректно обрабатывает подобные конструкции и сохраняет все возможности Emotion. --- ## Композиция стилей Emotion позволяет объединять несколько наборов CSS. ```jsx const baseStyle = css` padding: 10px; `; const warningStyle = css` background: orange; `; ``` Использование: ```jsx
Warning
``` После компиляции создаются необходимые классы и выполняется их объединение. --- ## Styled Components через Emotion Наиболее распространённый способ использования Emotion основан на API `styled`. ```jsx import styled from "@emotion/styled"; const Card = styled.div` padding: 20px; border-radius: 12px; `; ``` SWC анализирует такие объявления во время сборки и внедряет служебную информацию для последующей генерации классов. --- ## Динамические стили Emotion поддерживает использование пропсов. ```jsx const Button = styled.button` background: ${(props) => props.primary ? "blue" : "gray"}; `; ``` Использование: ```jsx