Skip to content

[Feature] Добавление поддержки CSS Modules путём использования расширения *.module.css#2294

Merged
inomdzhon merged 2 commits intov5.0.0from
research/use-module-css-ext
Jun 2, 2022
Merged

[Feature] Добавление поддержки CSS Modules путём использования расширения *.module.css#2294
inomdzhon merged 2 commits intov5.0.0from
research/use-module-css-ext

Conversation

@inomdzhon
Copy link
Copy Markdown
Contributor

@inomdzhon inomdzhon commented Mar 11, 2022

  • Поправил в доках vkuiClass на className
    • ADAPTIVITY_GUIDE.md
    • CONTRIBUTING.md
    • CSS_GUIDE.md

Как работает решение?

Вкратце, для конечной сборки ничего не изменилось, меняется лишь сам подход создания компонентов.

Решение предполагает плавный переход с декоратора createScopedElement на CSS Modules.

Как было?

// src/components/Example/Example.css
.Example {}

// src/components/Example/Example.tsx
import './Example.css';

const Example = ({ ...restProps }) => <div vkuiClass="Example" {...restProps} />;

// src/styles/components.css
@import '../components/Example/Example.css';

Как стало?

// src/components/Example/Example.module.css
.Example {}

// src/components/Example/Example.tsx
import { classNamesString } from "../../lib/classNames";
import styles from './Example.module.css';

const Example = ({ className, ...restProps }) => <div className={classNamesString(styles.Example, className)} {...restProps} />;

// src/styles/components.css
@import '../components/Example/Example.module.css';

На каких компонентах тестировалось?

  • ButtonGroup
  • Button
    • Для обратной совместимости (в случае, если кто-то обращается к этим классам) в CSS файл были добавлены пустые классы (подробности в коде). Они вырезаются при минификации CSS.
    • ⚠️ В конечную сборку в JS попадают лишние строчки. Стоит постараться сократить кол-во обращений из одного блока к другому
      image
  • Tappable

    На заметку: была проблема с показом фокуса, пока я не понял, что оказывается последним в атрибуте "class" элемента должен быть Tappable--focus-visible, чтобы сработал селектор. Проблема возникла из-за того, что className я добавил последним аргументом в функции. В последствии перенёс в самый верх.

Какие настройки и инструменты понадобились?

babel-plugin-css-modules-transform

Плагин выгружает CSS классы в объект

image

Изменения под плагин

babel.config.js

  • настройка плагинаkeepImport сохраняет импортирование стилей и, к тому же, заменяет строку import styles from './ButtonGroup.modules.css' на import ./ButtonGroup.modules.css' (используется для команды babel-cssm)
  • исключение .module.css из плагина babel-plugin-transform-remove-imports – вместо этого удаление импортирования стиле делегирутеся св-ву keepImport у плагина css-modules-transform. Причина: без этого transform-remove-imports аффектит плагин css-modules-transform. Предполагаю первый плагин срабатывает раньше и удаляет имопртирование стилей.

typescript-plugin-css-modules

Плагин типизирует CSS классы

image

Изменения под плагин


webpack.config.js и postcss.config.js

Для Styleguide появилось дополнительное правило для .module.css.

Здесь мы передаём кастомное св-во в postcss.config.js, чтобы тут, в плагине postcss-modules, мы не подставляли префикс vkui для .module.css.

Иначе при import styles from './ButtonGroup.modules.css' в styles мы будем получать styles.vkuiButtonGroup, вместо необходимого styles.ButtonGroup.

Что стоит учесть?

  1. Новый подход для условных классов: Так как в проекте TS < 4.4.4, для CSS классов нельзя использовать шаблонные строки типа ButtonGroup--mode-${mode} (в TS > 4.4.4 можно, вот пример) Обновили TS до 4.4.4

    решение для TS < 4.4.4
    • [рекомендую] либо используем объект (пример здесь)
    • либо используем функцию + условные конструкции, например
      function getModeClass(mode: ButtonGroupProps['mode]): string {
        switch (mode) {
          case 'horizontal':
            return styles['ButtonGroup--mode-horizontal'];
          case 'vertical':
            return styles['ButtonGroup--mode-vertical'];
          default:
            return '';
      }
      
    • (ваши идеи)
  2. Вес сборки: Учитывая п. 1 и то, что в сборку будут попадать CSS классы в виде объекта, увеличиться вес сборки. при сжатии в gzip несущественная проблема за счёт алгоритма LZ77.


resolve #2607

@inomdzhon inomdzhon changed the title [Research] Переезд CSS Modules Использование расширения *.module.css [Research] Переезд на CSS Modules путём использования расширения *.module.css Mar 11, 2022
@codesandbox-ci
Copy link
Copy Markdown

codesandbox-ci bot commented Mar 11, 2022

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Latest deployment of this branch, based on commit a7de844:

Sandbox Source
VKUI - default example Configuration

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 11, 2022

size-limit report 📦

Path Size
JS 75.25 KB (+1.04% 🔺)
JS (brotli) 63.54 KB (+1.29% 🔺)
JS, unstable 29.18 KB (+0.93% 🔺)
CSS 39.01 KB (0%)
CSS (brotli) 31.35 KB (0%)
CSS, unstable 1.05 KB (0%)

@github-actions
Copy link
Copy Markdown
Contributor

👀 Styleguide deployed

See the styleguide for this PR at https://vkcom.github.io/VKUI/pull/2294/

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 11, 2022

Code coverage

lines3597 / 461377.97%
statements3665 / 469977.99%
functions829 / 103080.48%
branches2994 / 425770.33%
branchesTrue0 / 0100.00%

Generated by 🚫 dangerJS against a7de844

@inomdzhon inomdzhon linked an issue Apr 4, 2022 that may be closed by this pull request
4 tasks
@inomdzhon inomdzhon force-pushed the research/use-module-css-ext branch 2 times, most recently from 6197ebd to 904c81b Compare April 5, 2022 08:19
@inomdzhon inomdzhon force-pushed the research/use-module-css-ext branch from 904c81b to 7582e88 Compare April 21, 2022 16:39
@inomdzhon inomdzhon linked an issue May 25, 2022 that may be closed by this pull request
1 task
@inomdzhon inomdzhon force-pushed the research/use-module-css-ext branch from 7582e88 to 2c8f3f9 Compare May 25, 2022 09:19
@inomdzhon inomdzhon changed the base branch from master to v5.0.0 May 25, 2022 09:23
@inomdzhon inomdzhon marked this pull request as ready for review May 25, 2022 09:23
@inomdzhon inomdzhon requested review from a team as code owners May 25, 2022 09:23
@inomdzhon inomdzhon changed the title [Research] Переезд на CSS Modules путём использования расширения *.module.css [Feature] Добавление поддержки CSS Modules путём использования расширения *.module.css May 25, 2022
@inomdzhon inomdzhon force-pushed the research/use-module-css-ext branch from 2c8f3f9 to 46b1922 Compare May 25, 2022 10:24
@stoope
Copy link
Copy Markdown
Contributor

stoope commented May 25, 2022

Мы хотим CSS tree shaking вместе с модулями затащить или это отдельная задача?

@inomdzhon
Copy link
Copy Markdown
Contributor Author

Мы хотим CSS tree shaking вместе с модулями затащить или это отдельная задача?

Отдельной задачей
Тут мы уходим от vkuiClass

@inomdzhon inomdzhon force-pushed the research/use-module-css-ext branch 4 times, most recently from a5dd1cd to 2609446 Compare June 2, 2022 11:26
inomdzhon added 2 commits June 2, 2022 17:38
* Update docs
* Create getPlatformClassName()
* Mark getClassName() deprecated
* Extend with `styles` argument next function
  * getSizeXClassName()
  * getSizeYClassName()
  * getHoverClassName()
* Changes configs
  * babel.config.js
  * postcss.config.js
  * stylelint.config.js
  * tsconfig.dist.json
  * tsconfig.json
  * webpack.config.js
@inomdzhon inomdzhon force-pushed the research/use-module-css-ext branch from 2609446 to a7de844 Compare June 2, 2022 14:38
@inomdzhon inomdzhon merged commit 128caed into v5.0.0 Jun 2, 2022
@inomdzhon inomdzhon deleted the research/use-module-css-ext branch June 2, 2022 14:53
Copy link
Copy Markdown
Contributor

@satandyh satandyh left a comment

Choose a reason for hiding this comment

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

only for version changes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] Добавить поддержку CSS Modules

5 participants