-
Notifications
You must be signed in to change notification settings - Fork 198
[Draft,Roadmap] Модульный CSS #1643
Copy link
Copy link
Closed
Description
В #1335 мы попробовали сделать весь CSS модульным и огребли.
Все из-за того, что наши стили чувствительны к порядку
Child.css
.Child.Child--ios {
color: red;
}Parent.css
.Parent .Child {
color: blue;
}Теперь цвет .Child зависит от порядка импортов Child.css и Parent.css. Особенно грустно, когда Child интерполируется в Parent: <Parent left={<Child />} />, потому что порядок импортов Child и Parent полностью определяется конечным приложением. Полностью избавиться от таких стилей в один рефакторинг неправдоподобно.
Модульный CSS — хорошо, потому что:
- Уменьшает размер CSS-бандла небольших приложений и ускоряет загрузку
- Устойчивее к рефакторингам — все стили компонента в одном месте
- Поддерживает инструменты экосистемы css-модулей
Так что попробуем еще раз, но будем действовать аккуратнее:
- [done] Поддержать импорты CSS из TS (Собирать CSS вебпаком #1628)
- [in review] Настроить линтеры для модульных стилей (refactor: Выделить модульный CSS и добавить линтеры #1639)
- Добавить в dist экспериментальную сборку с модульным CSS, чтобы
- Плавно и безопасно делать стили компонентов модульными
- Убрать лишние линтеры
- В v5+ сделать сборку с модульным CSS дефолтной
После #1639 запускаем марафон модульных стилей:
-
ActionSheet -
ActionSheetItem -
Alert -
AppRoot -
Avatar -
Badge -
Banner -
Button -
Card -
CardGrid -
CardScroll -
Cell -
CellButton -
Checkbox -
Chip -
ChipsInput -
ChipsSelect -
ContentCard -
Counter -
CustomScrollView -
CustomSelect -
CustomSelectOption -
DatePicker -
Div -
Epic -
File -
FixedLayout -
Footer -
FormField -
FormItem -
FormLayout -
FormLayoutGroup -
FormStatus -
Gallery -
Gradient -
Group -
Header -
HorizontalCell -
HorizontalScroll -
IconButton -
InfoRow -
Input -
Link -
List -
MiniInfoCell -
ModalCard -
ModalDismissButton -
ModalPage -
ModalPageHeader -
ModalRoot -
NativeSelect -
Panel -
PanelHeader -
PanelHeaderBack -
PanelHeaderButton -
PanelHeaderClose -
PanelHeaderContent -
PanelHeaderContext -
PanelHeaderEdit -
PanelHeaderSubmit -
Placeholder -
PopoutRoot -
PopoutWrapper -
Progress -
PromoBanner -
PullToRefresh -
Radio -
RangeSlider -
Removable -
RichCell -
Root -
ScreenSpinner -
Search -
Select -
SelectMimicry -
Separator -
SimpleCell -
Slider -
SliderSwitch -
Snackbar -
Spacing -
Spinner -
SplitCol -
SplitLayout -
SubnavigationBar -
SubnavigationButton -
Switch -
Tabbar -
TabbarItem -
Tabs -
TabsItem -
Tappable -
Textarea -
Tooltip -
Typography/Caption -
Typography/Headline -
Typography/Subhead -
Typography/Text -
Typography/Title -
UsersStack -
View -
WriteBar -
WriteBarIcon
Правила простые: Component.css — модульный и может импортироваться независимо, если:
- Работает только с селекторами
.Component - Другие CSS не лезут в
.Component - Component не импортируется из не-модульных компонентов
План:
- Выбираем подходящий Component из списка (из-за 1.3. стоит начать с компонентов, которые не используются другими компонентами VKUI — см. схему зависимостей)
- Переименовываем
Component.cssвComponent.m.css - Проверяем компоненты в
isModularизtasks/modular-components, и перещелкиваемtrue, если они импортируютComponent - Запускаем линтеры без кеша:
rm -rf .cache && yarn test:static - Как-то чиним модульность
6. Локализация селектора
7. Рефакторинг, при котором оверрайды не нужны
8. Перенос стилей из контейнера в целевой компонент (не модульно, нужна донастройка линтера)
9. Форсирование порядка импортов
9. С изменением дизайна
Пожелаем нам удачи; победа не за горами.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Type
Projects
Status
✅ Done