From 0aceabcb02ee05fd74195668ef4ff09b90352267 Mon Sep 17 00:00:00 2001 From: Ruslan Shevchenko Date: Fri, 17 Jan 2025 15:49:48 +0300 Subject: [PATCH 01/11] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=D1=83=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- people/ruslanpro01/index.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 people/ruslanpro01/index.md diff --git a/people/ruslanpro01/index.md b/people/ruslanpro01/index.md new file mode 100644 index 0000000000..a673a2a961 --- /dev/null +++ b/people/ruslanpro01/index.md @@ -0,0 +1,4 @@ +--- +name: 'Руслан Шевченко' +url: https://github.com/RuslanPro01 +--- From 41d285d51cb8a03aa74f9365af92ef1db1b5dfd6 Mon Sep 17 00:00:00 2001 From: Ruslan Shevchenko Date: Fri, 17 Jan 2025 15:51:25 +0300 Subject: [PATCH 02/11] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=20=D1=81=D1=82=D0=B0=D1=82=D1=8C=D1=91=D0=B9=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=20CSS-in-JS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/css-in-js/index.md | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 tools/css-in-js/index.md diff --git a/tools/css-in-js/index.md b/tools/css-in-js/index.md new file mode 100644 index 0000000000..e3a6312885 --- /dev/null +++ b/tools/css-in-js/index.md @@ -0,0 +1,56 @@ +--- +title: "Обзор CSS-in-JS" +description: "А что, так можно было? Разберём, как можно описывать компоненты и стили не создав ни одного css-файла" +authors: + - ruslanpro01 +related: + - tools/how-the-browser-creates-pages + - tools/preprocessors + - tools/react-and-alternatives +tags: + - article +--- + + + +## Кратко + +**CSS-in-JS** — это способ писать стили непосредственно в JavaScript, что позволяет использовать возможности языка для управления внешним видом элементов. Обычно эта методика используется в компонентной архитектуре, например, в разработке на React, где каждому компоненту соответствуют свои стили. + +Существуют разные решения, но все они работают схожим образом: стили задаются как [объекты](https://doka.guide/js/object/) или [шаблонные строки](https://doka.guide/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/). + +## Почему CSS-in-JS? + +Главное преимущество использования подхода CSS-in-JS — возможность использовать конструкции JS при описании стилей компонента, в зависимости от проекта это может помочь описывать динамические стили, которые зависят от условия, ещё помогает работать с темизацией. + + + +## Краткая история ~~времени~~ CSS-in-JS + +### Становление CSS + +CSS (Каскадные таблицы стилей) начал развитие в 90-е годы, был отмечен консорциумом [W3C](https://www.w3.org/) и начал стремительно развиваться. CSS стал методом определения стиля веб-документа. Он был мощным, чтобы удовлетворить потребности проектов тех лет, и был относительно прост, чтобы все желающие, могли приступить к работе в короткий срок. + +### Проблемы CSS + +sdfsdf + + + From 525d8f1e177af6940b0d9ebd625f4bd382be405b Mon Sep 17 00:00:00 2001 From: Ruslan Shevchenko Date: Sun, 26 Jan 2025 14:11:01 +0300 Subject: [PATCH 03/11] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=20=D1=81=20?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BE=D1=80=D0=B8=D0=B5=D0=B9,=20=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D1=85=D0=BE=D0=B4=D0=BE=D0=B2=20=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B0=D1=8E=D1=89=D0=B5=D0=B3=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0=20"=D0=9D=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=BA=D1=82=D0=B8=D0=BA=D0=B5"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/css-in-js/index.md | 120 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 115 insertions(+), 5 deletions(-) diff --git a/tools/css-in-js/index.md b/tools/css-in-js/index.md index e3a6312885..0efd8e9870 100644 --- a/tools/css-in-js/index.md +++ b/tools/css-in-js/index.md @@ -1,6 +1,6 @@ --- title: "Обзор CSS-in-JS" -description: "А что, так можно было? Разберём, как можно описывать компоненты и стили не создав ни одного css-файла" +description: "CSS в JavaScript — разберём, как можно описывать компоненты и стили не создав ни одного css-файла" authors: - ruslanpro01 related: @@ -24,7 +24,7 @@ tags: ## Кратко -**CSS-in-JS** — это способ писать стили непосредственно в JavaScript, что позволяет использовать возможности языка для управления внешним видом элементов. Обычно эта методика используется в компонентной архитектуре, например, в разработке на React, где каждому компоненту соответствуют свои стили. +**CSS-in-JS** — это способ писать стили непосредственно в JavaScript, а не в классических CSS-файлах — это позволяет использовать возможности языка для управления внешним видом элементов. Чаще всего CSS-in-JS встречается в компонентной архитектуре, например, в разработке на React, где каждому компоненту соответствуют свои стили. Существуют разные решения, но все они работают схожим образом: стили задаются как [объекты](https://doka.guide/js/object/) или [шаблонные строки](https://doka.guide/js/template-strings/) и привязываются к компонентам через уникальные классы - это обеспечивает их изоляцию и упрощённое управление. @@ -42,15 +42,125 @@ CSS-in-JS не универсальное решение -## Краткая история ~~времени~~ CSS-in-JS +## Краткая история CSS-in-JS + +Тут мы бегло рассмотрим историю появления CSS-in-JS решений. + + ### Становление CSS CSS (Каскадные таблицы стилей) начал развитие в 90-е годы, был отмечен консорциумом [W3C](https://www.w3.org/) и начал стремительно развиваться. CSS стал методом определения стиля веб-документа. Он был мощным, чтобы удовлетворить потребности проектов тех лет, и был относительно прост, чтобы все желающие, могли приступить к работе в короткий срок. -### Проблемы CSS +### Появление реактивных фреймворков и SPA + +До 2010-х годов, в основном создавались многостраничные приложения с четким разделением ответственности: + +- HTML — разметка страницы, +- CSS — описывал, как они будут выглядеть, +- JavaScript — отвечал за интерактивность. + +С течением времени развивался не только CSS, но и JavaScript — это приводит к появлению новой экосистемы разработки и современных реактивных фреймворков: Angular (2010), React (2013), Vuejs (2014). Разработка приложений начинает смещаться от многостраничных приложений на разработку одностраничных приложений (SPA), а пользователи стали ожидать от них более динамичного и сложного поведения. + +### Кристофер Шедо, его доклад о проблемах CSS и разработка первых решений CSS-in-JS + +В 2014 году Кристофер Шедо (инженер известной социальной сети) [выступает с докладом](https://speakerdeck.com/vjeux/react-css-in-js) о 7 проблемах CSS, которые нужно решить для беспроблемной разработки больших динамичных приложений: + +1. **Глобальное пространство имён** + Все CSS-селекторы живут в одной глобальной области, из-за чего стили разных компонентов могут конфликтовать или перезаписывать друг друга. + +1. **Зависимости** + При большом числе стилей сложно понять, в каком порядке подключать файлы и какие компоненты от чего зависят, что может привести к нежелательным коллизиям. + +1. **Удаление неиспользуемого кода** + В больших проектах часто копится CSS, который больше нигде не применяется, и его непросто безопасно убрать, не зная точного использования. + +1. **Минификация** + При сжатии стилей важно сохранять их читабельность для отладки, но и уменьшать размер, чтобы повысить производительность. + +1. **Общий доступ к константам** + Трудно централизованно хранить и переиспользовать значения (например, цвета, размеры), чтобы все команды работали с едиными стилевыми параметрами. + +1. **Проблемы каскада** + Когда несколько правил стилизуют одни и те же элементы, порядок подключения CSS может приводить к непредсказуемым результатам и конфликтам. + +1. **Изоляция** + Нужен способ гарантировать, что стили каждого компонента не затронут стили других, что особенно актуально в больших проектах. + +В этом же году начинается работа над CSS-in-JS. Первыми экспериментальными подходами можно считать решения, появившиеся в экосистеме React. Одна из самых ранних и широко известных библиотек — [JSS](https://cssinjs.org/). Чуть позже начали появляться и другие проекты (например, [Radium](https://github.com/formidablelabs/radium)), но именно JSS часто упоминают как одну из первых полноценных реализаций «CSS в JavaScript». + +## Runtime / zero runtime + +За время развития CSS-in-JS появилось несколько вариантов реализации: от полностью рантайм-решений до почти «нулевого» времени исполнения. Ниже разберём ключевые варианты и их особенности. + +