Pull to refresh

Comments 13

Для работы в CSS нужно использовать SCSS и CSS Modules, а CSS in JS это мракобесие и извращенство засоряющее код, добавляющее ненужный шум и размывающее явное визуальное отличие компонентов в JSX'e от обычных div'ов, span'ов и т.п.

Вообще есть нормальные compile time реализации CSS in JS.

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

Вы скинули только то, что на выходе при сборке эти стили извлекутся в отдельный css файл.

Всего-то убирает весь оверхед css-in-js решений.

Все остальные жирные минусы никуда не делись.

А какие именно? Если про

размывающее явное визуальное отличие компонентов в JSX'e от обычных div'ов, span'ов и т.п.

то мне это тоже не нравится. Но у linaria этот функционал даже не в базовой библиотеке, а плагином. Ничего не мешает тупо не ставить этот пакет.

При этом сохраняется главное преимущество css-in-js решений: неиспользуемые классы сразу видны.

У styled проблемы с производительностью. Как только в DOM появляется пара десятков тысяч элементов, styled начинает визуально тормозить, когда пользователь покидает страницу и нужно почистить стили для всех этих десятков тысяч элементов.

Соответственно, если какие-то сложные гриды с кучей styled компонентов внутри — жди беды. Наступили на грабли уже и с ant-table и c aggrid.

Разве для тех же CSS-модулей ситуация не такая же?

Это же webpack css-loader, флаг modules: true и получаем css modules. Т.е. это просто обычный css + имена классов изменяются чтобы можно было во многих компонентах использовать .title и т.п.


https://webpack.js.org/loaders/css-loader/#modules


https://github.com/css-modules/css-modules


В общем вот живой пример:
https://codesandbox.io/s/jolly-tdd-jyh2w?file=/src/index.js


Смотрите там в консоль и сразу все увидите.

Ну а разве styled components делает что-то другое? Вроде как он тоже генерирует CSS и классы для селекторов, и так же генерирует `<style/>` узел в `<head/>`. Ну разве что в случае модулей это будет `<link/>`. Но в обоих случаях браузеру нужно загружать все стили.

Нет, он не тоже самое делает. Всё это хранится в JS файле бандла, а не вырезано отдельным .css файлом сбилженым, отсюда неоправданно более жирный JS бандл, и при каждом изменении JS'a вынужденно пользователь загружает ещё CSS in JS месте с ним, хотя мог бы и не загружать без изменения стилей и пользовался бы закэшированным .css'ником. В любом случае css in js это просто неоправданно срать в коде и срать в бандле итоговом.

Чтобы CSS был отдельным файлом тот же webpack нужно отдельно настраивать. По-умолчанию стандартная связка style-loader/css-loader помещают стили в JS бандл.

> css in js это просто неоправданно срать в коде

Когда-то так же говорили про JSX, якобы это "html in js"

> срать в бандле итоговом.

Не уверен что это недостаток. С помощью того же url-loader картинки бандлят. Иногда может быть удобно иметь приложение в виде одного файла, например для встраивания.

Не знаю деталей про styled components, но вроде бы есть аналогичные библиотеки которые позволяют извлечь CSS (google подсказывает linaria и astroturf, может есть и другие). Так что я бы не стал обобщать на весь "css in js".

Чтобы CSS был отдельным файлом тот же webpack нужно отдельно настраивать. По-умолчанию стандартная связка style-loader/css-loader помещают стили в JS бандл.

Да, надо настроить, но никто в здравом уме не использует голый webpack без кастомного конфига и у всех уважающих себя разработчиков есть webpack config для всех проектов, который уже можно дотюнить под конкретные нужны если в этом есть нужда. Есть ещё конечно и отдельные индивидумы которые используют Create React App не в hello world'e, а в комерческих проектах это конечно отдельная смешная история, но чтож и такие к сожалению тоже есть)


Не знаю деталей про styled components, но вроде бы есть аналогичные библиотеки которые позволяют извлечь CSS (google подсказывает linaria и astroturf, может есть и другие). Так что я бы не стал обобщать на весь "css in js".

Тогда полностью его "преимущества" улетучиваются и его использование становится абсурдным в квадрате.


Когда-то так же говорили про JSX, якобы это "html in js"

Тут другая история, неравнозначная аналогия, но попытка не пытка конечно)


Если хотите используйте CSS in JS сколько влезет, только не в коммерческих проектах пожалуйста, т.к. потом кому-то кроме вас их поддерживать придется. Вы же уйдете и забудете это как страшный сон, а другим потом волосы на голове рвать или переписывать все.

В v3 половина просадки производительности была из-за поддержки тем, которыми большая часть проектов не пользуется, а просадка есть. Это так, к примеру. Текущее состояние не знаю. Те нет, не тоже самое он делает.

Есть styled-components как паттерн, функция styled`...`, и у неё есть разные реализации, и styled-components тут не очень. Есть варианты получше, посмотрите на emotion или jss

Only those users with full accounts are able to leave comments. Log in, please.