Skip to content

Добавляет статью про CSS-in-JS #5670

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Jul 1, 2025

Conversation

RuslanPro01
Copy link
Contributor

@RuslanPro01 RuslanPro01 commented Jan 26, 2025

Описание

Добавляет статью про CSS-in-JS решения.
Это мой превый подобный опыт, так что буду рад обратной связи 😊

Closes #5238

Превью: https://content-5670.dev.doka.guide/tools/css-in-js/

Чек-лист

  • Текст оформлен согласно руководству по стилю
  • Ссылки на внутренние материалы начинаются со слеша и заканчиваются слэшем либо якорем на заголовок (/css/color/, /tools/json/, /tools/gulp/#kak-ponyat)
  • Ссылки на картинки, видео и демки относительные (images/example.png, demos/example/, ../demos/example/)

@github-actions github-actions bot added веб-платформа Контент по Веб-платформе статья Расширенный материал labels Jan 26, 2025
@TatianaFokina TatianaFokina changed the title Article/css in js Добавляет статью про CSS-in-JS Jan 26, 2025
Copy link
Member

@ra1nbow1 ra1nbow1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет!

Спасибо за такую фундаментальную документацию) Я внес пару предложений

@RuslanPro01
Copy link
Contributor Author

@ra1nbow1 большое спасибо за апдейт, беру в работу!)

@RuslanPro01 RuslanPro01 requested a review from ra1nbow1 January 26, 2025 13:28
Статья получилась очень теоритической, кажется, что кусочки кода чуть-чуть добавят ясности
Copy link
Member

@solarrust solarrust left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Потрясно! С большим интересом прочитала. Спасибо!

Оставила несколько предложений по улучшению. Не пугайся, что их много. Все они больше про форматирование и про перестановку слов =)
Всё можем обсуждать!

@RuslanPro01 RuslanPro01 requested a review from solarrust January 29, 2025 14:14
Copy link
Member

@solarrust solarrust left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кайф, мне всё нравится!

@RuslanPro01
Copy link
Contributor Author

@solarrust, подскажи, пожалуйста, а мы тут ещё апрувы ждём или нужно сделать что-то еще?)

@solarrust
Copy link
Member

@solarrust, подскажи, пожалуйста, а мы тут ещё апрувы ждём или нужно сделать что-то еще?)

Ага, ждём ещё аппрув от редактора раздела @HellSquirrel =)

Copy link
Member

@HellSquirrel HellSquirrel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет! Спасибо большое за статью. Я добавила несколько замечаний. Давай немножко уточним формулировки и переставим парочку абзацев :)


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

Существуют разные решения, но все они работают схожим образом: стили задаются как [объекты](/js/object/) или [шаблонные строки](/js/template-strings/) и привязываются к компонентам через уникальные классы — это обеспечивает их изоляцию и упрощённое управление.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И тут бы хорошо немного обобщить. Вот пример из vanilla-extract

  margin: 0
});```

здесь вызывается функция и стиль не привязывается к классу

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавил в обобщении


Существуют разные решения, но все они работают схожим образом: стили задаются как [объекты](/js/object/) или [шаблонные строки](/js/template-strings/) и привязываются к компонентам через уникальные классы — это обеспечивает их изоляцию и упрощённое управление.

Основные библиотеки для написания CSS внутри JS — это [Styled Components](https://styled-components.com/), [Emotion](https://emotion.sh/docs/introduction), [Styled JSX](https://github.com/vercel/styled-jsx) и [vanilla-extract](https://vanilla-extract.style/).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это не все библиотеки которыми пользуются. Есть еще :) (stitches, material-ui...)

Suggested change
Основные библиотеки для написания CSS внутри JS — это [Styled Components](https://styled-components.com/), [Emotion](https://emotion.sh/docs/introduction), [Styled JSX](https://github.com/vercel/styled-jsx) и [vanilla-extract](https://vanilla-extract.style/).
Вот несколько популярных CSS-in-JS библиотек: [Styled Components](https://styled-components.com/), [Emotion](https://emotion.sh/docs/introduction), [Styled JSX](https://github.com/vercel/styled-jsx) и [vanilla-extract](https://vanilla-extract.style/).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я тут брал данные из stateofcss, взял первые, самы популярные на тот момент, конечно список можно продолжить, н я хотел показать популярные решения. Могу уточнить что это на основе данные из stateofcss


## Почему CSS-in-JS?

Главное преимущество использования подхода CSS-in-JS — возможность использовать конструкции JS при описании стилей компонента. В зависимости от проекта, это может помочь описывать динамические стили, которые зависят от условий, а также упростить работу с темизацией.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Возможно тут стоит добавить несколько слов про типизацию. Vanilla-extract продвигает это как основное приимущество фреймворка


☝️ CSS-in-JS не универсальное решение

Многие задачи, такие как изоляция стилей, динамическая стилизация и управление темами, можно решить с помощью традиционного CSS, препроцессоров или CSS Modules. Выбор подхода зависит от специфики проекта и предпочтений команды. CSS-in-JS предлагает определённые преимущества, но не является универсальным решением для всех случаев.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давайте добавим ссылочка на CSS Modules

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я не виду в доке статьи про CSS Modules, добавить сторонний ресурс?)


### Становление CSS

CSS (Каскадные таблицы стилей) начал развитие в 90-е годы, был отмечен консорциумом [W3C](https://www.w3.org/) и начал стремительно развиваться. CSS стал методом определения стиля веб-документа. Он был мощным, чтобы удовлетворить потребности проектов тех лет, и был относительно прост, чтобы все желающие могли приступить к работе в короткий срок.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@solarrust а тут точно единственное число?)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CSS как язык описания внешнего вида страницы, поэтому ед. число)


## Runtime и Zero-runtime

За время развития CSS-in-JS появилось несколько вариантов реализации: от полностью рантайм-решений до почти «нулевого» времени исполнения. Ниже разберём ключевые варианты и их особенности.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Давай попробуем не упоминать термин без объяснения. Было бы лучше так
За время развития появилось несколько вариантов

  • рантайм
  • но-рантайм
    И не будем убирать эти уточнения в это очень важный момент

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Переработал, постарался уточнить определния сразу


💡 Рантайм в контексте фронтенд-разработки обычно означает, что часть логики (в данном случае генерация стилей) выполняется напрямую в браузере, «на лету» при запуске приложения. То есть когда пользователь уже открыл страницу, JS-код просчитывает стили и «вживую» вставляет их в [`<style>`](/html/style/) или управляет классами.

В отличие от этого, «zero-runtime» решения максимально переносят логику (включая генерацию CSS) на этап сборки, чтобы в браузер попадал уже готовый, статический CSS.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Zero-runtime переносят полностью. Almost-zero максимально


<aside>

💡 Рантайм в контексте фронтенд-разработки обычно означает, что часть логики (в данном случае генерация стилей) выполняется напрямую в браузере, «на лету» при запуске приложения. То есть когда пользователь уже открыл страницу, JS-код просчитывает стили и «вживую» вставляет их в [`<style>`](/html/style/) или управляет классами.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не обязательно в style. Можно определять css переменные на лету или
что то типа такого
const sheet = new CSSStyleSheet(); sheet.replaceSync("body { background-color: lightblue; }"); document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Обощил


#### Суть подхода

Стили формируются и добавляются в [DOM](/js/dom/) во время исполнения (рантайма) приложения. В процессе рендера или при изменении состояний создаются (или обновляются) соответствующие `<style>` или классы в браузере.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

как я уточняла выше механик больше чем две

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавил блок о том, что механик несколько, чтобы не перегуржать и без того не самую короткую статью 😅

@ra1nbow1
Copy link
Member

ra1nbow1 commented May 5, 2025

@RuslanPro01 привет! Нужна помощь по этой статье?

@RuslanPro01
Copy link
Contributor Author

@ra1nbow1, привет
В работе, если что

@RuslanPro01 RuslanPro01 requested a review from HellSquirrel June 4, 2025 08:01
Copy link
Member

@ra1nbow1 ra1nbow1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Кайф. Ждем финальный аппрув от Полины

@ra1nbow1
Copy link
Member

@HellSquirrel Полин, посмотри пожалуйста

@HellSquirrel HellSquirrel merged commit 8b8ad48 into doka-guide:main Jul 1, 2025
6 checks passed
@HellSquirrel
Copy link
Member

Супер спасибо!

Copy link

github-actions bot commented Jul 1, 2025

Превью контента из 0bb56ea опубликовано.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
веб-платформа Контент по Веб-платформе статья Расширенный материал
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Не хватает материала о CSS-in-JS решениях
4 participants