Статьи

Сравнение 8 способов стилизации компонентов React

Я работал с несколькими разработчиками в моем офисе над проектами React JS, которые имеют разные уровни опыта React JS. Мы решали некоторые сумасшедшие проблемы, такие как обработка странного способа, которым Redux выполняет инициализацию состояния, и выполнение полезной нагрузки запроса axios с PHP и понимание того, что происходит в фоновом режиме . Эта статья возникла из вопроса о том, как стилизовать компоненты React.

Различные стилистические подходы

Существуют различные способы стилизации компонентов React. Выбор правильного метода для укладки компонентов не является абсолютным абсолютом. Это конкретное решение, которое должно соответствовать вашему конкретному варианту использования, личным предпочтениям и, прежде всего, архитектурным целям вашей работы. Например, я использую уведомления в React JS с использованием Noty , и стиль должен уметь обрабатывать плагины.

Некоторые из моих целей при ответе на вопрос включали в себя следующее:

  • Глобальное пространство имен
  • зависимости
  • Повторное использование
  • Масштабируемость
  • Устранение мертвого кода

Кажется, существует около восьми различных способов стилизации компонентов React JS, широко используемых в промышленности для работы на уровне производства:

  • Встроенный CSS
  • Нормальный CSS
  • CSS в JS
  • Стилизованные компоненты
  • CSS Модули
  • Sass & SCSS
  • Меньше
  • допускающее применение стиль

Для каждого метода я рассмотрю необходимость зависимостей, уровень сложности и то, является ли подход действительно хорошим или нет.

Встроенный CSS

  • Зависимости: нет
  • Сложность: Легко
  • Подход: худший

Я не думаю, что кому-то нужно введение во встроенный CSS. Это стиль CSS, отправляемый элементу напрямую с использованием HTML или JSX. Вы можете включить JavaScript-объект для CSS в компоненты React. Есть несколько ограничений, таких как замена каждого текста на camelCase. Вы можете стилизовать их двумя способами, используя объекты JavaScript, как показано в примере.

пример

 import React from "react"; const spanStyles = { color: "#fff", borderColor: "#00f" }; const Button = props => ( <button style={{ color: "#fff", borderColor: "#00f" }}> <span style={spanStyles}>Button Name</span> </button> ); 

Обычный CSS

  • Зависимости: нет
  • Сложность: Легко
  • Подход: хорошо

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

Вы можете поддерживать любое количество таблиц стилей, и при необходимости вам будет проще изменить или настроить стили. Но обычный CSS может стать серьезной проблемой, если вы работаете над большим проектом с большим количеством людей, особенно без согласованного шаблона для стилизации в CSS.

пример

 a:link { color: gray; } a:visited { color: green; } a:hover { color: rebeccapurple; } a:active { color: teal; } 

Дополнительная информация

Вы можете узнать больше о регулярном использовании CSS на странице обучения CSS в W3C. Существует множество игровых площадок, таких как JS Bin — совместная отладка JavaScript , JSFiddle , CodePen: создание, тестирование и обнаружение кода переднего плана , Repl.it — ​​ведущей в мире платформы для онлайн-кодирования и т. Д., Где вы можете попробовать их вживую и получить результаты в режиме реального времени.

CSS в JS

  • Зависимости: jss , jss-preset-default , jss-cli
  • Сложность: Легко
  • Подход: Достойный

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

пример

 import React from "react"; import injectSheet from "react-jss"; // Create your Styles. Remember, since React-JSS uses the default preset, // most plugins are available without further configuration needed. const styles = { myButton: { color: "green", margin: { // jss-expand gives more readable syntax top: 5, // jss-default-unit makes this 5px right: 0, bottom: 0, left: "1rem" }, "& span": { // jss-nested applies this to a child span fontWeight: "bold" // jss-camel-case turns this into 'font-weight' } }, myLabel: { fontStyle: "italic" } }; const Button = ({ classes, children }) => ( <button className={classes.myButton}> <span className={classes.myLabel}>{children}</span> </button> ); // Finally, inject the stylesheet into the component. const StyledButton = injectSheet(styles)(Button); 

Дополнительная информация

Вы можете узнать больше об этом подходе в официальной документации JSS. Есть также способ испытать это, используя их REPL (цикл чтения-eval-print).

Стилизованные компоненты

  • Зависимости: styled-components
  • Сложность: средняя
  • Подход: Достойный

Styled-components является примером вышеупомянутого CSS в JS. Это в основном дает нам CSS с другими свойствами, которые вы хотели бы иметь в CSS, например, вложенность. Это также позволяет нам стилизовать CSS под переменной, созданной в JavaScript. Обычно вы можете создать компонент React вместе с прикрепленными к нему стилями, не создавая отдельный файл для CSS. Styled-компоненты позволяют нам создавать настраиваемые компоненты многократного использования, которые могут быть менее сложными в обслуживании. Реквизит можно использовать для стилизации компонентов так же, как он передается в компонентах React. Реквизиты используются вместо классов в CSS и устанавливают свойства динамически.

пример

 import React from "react"; import styled, { css } from "styled-components"; const Button = styled.button` cursor: pointer; background: transparent; font-size: 16px; border-radius: 3px; color: palevioletred; margin: 0 1em; padding: 0.25em 1em; transition: 0.5s all ease-out; ${props => props.primary && css` background-color: white; color: green; border-color: green; `}; `; export default Button; 

Дополнительная информация

Styled-components имеет подробную документацию, а на сайте также есть живой редактор, где вы можете опробовать код. Получите больше информации о стилевых компонентах в стилевых компонентах: Основы .

CSS Модули

  • Зависимости: css-loader
  • Сложность: жесткая (использует конфигурацию загрузчика)
  • Подход: лучше

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

пример

 import React from "react"; import style from "./panel.css"; const Panel = () => ( <div className={style.panelDefault}> <div className={style.panelBody}>A Basic Panel</div> </div> ); export default Panel; 
 .panelDefault { border-color: #ddd; } .panelBody { padding: 15px; } 

Sass & SCSS

  • Зависимости: node-sass
  • Сложность: Легко
  • Подход: лучший

Sass утверждает, что это самый зрелый, стабильный и мощный язык расширений CSS профессионального уровня в мире. Это препроцессор CSS, который добавляет специальные функции, такие как переменные, вложенные правила и миксины (иногда их называют «синтаксический сахар») в обычный CSS. Цель состоит в том, чтобы сделать процесс кодирования более простым и эффективным. Как и другие языки программирования, Sass позволяет использовать переменные, вложенность, частичные значения, импорт и функции, которые добавляют сверхспособности к обычному CSS.

пример

 $font-stack: 'Open Sans', sans-serif; $primary-color: #333; body { font: 100% $font-stack; color: $primary-color; } 

Дополнительная информация

Узнайте больше об использовании и установке Sass с различными языками программирования из их официальной документации на Sass: Syntaxically Awesome Style Sheets . Если вы хотите что-то попробовать, есть сервис под названием SassMeister — The Sass Playground! где вы можете поиграть с различными функциями Sass и SCSS.

Меньше

  • Зависимости: less , less-loader
  • Сложность: Легко
  • Подход: хорошо

Less (Leaner Style Sheets) — это язык динамических препроцессоров с открытым исходным кодом, который можно компилировать в CSS и запускать на стороне клиента или на стороне сервера. Он основан на CSS и Sass и похож на SCSS. Несколько заметных отличий включают переменные, начинающиеся со знака @ в Less и $ в Sass.

пример

 @pale-green-color: #4D926F; #header { color: @pale-green-color; } h2 { color: @pale-green-color; } 

Дополнительная информация

Вы можете начать с Less из официальной документации, и есть LESSTESTER, песочница Less, которая преобразует ваш код Less в CSS.

допускающее применение стиль

  • Зависимости: @stylable/core , @stylable/runtime , @stylable/optimizer , @stylable/module-utils , @stylable/custom-valu
  • Сложность: Сложная
  • Подход: лучше

Stylable — еще один препроцессор, объединяющий Sass, SCSS и Less. Если есть проблема с удобством использования стилизованных компонентов — так как их синтаксис немного отличается от обычного CSS — это поможет. Stylable похож на CSS, но предлагает больше возможностей сделать каждый компонент незаметным. Это может сделать то, что CSS-модулям будет сложнее, например, стилизация внутренних частей пользовательского интерфейса. Помимо других свойств CSS, Stylable также предлагает пользовательские псевдо-классы и псевдо-элементы. Это свойство Stylable автоматически позволяет нам создавать собственные классы CSS, что позволяет нам делать стили для внутренних частей компонентов.

пример

 @namespace "Page"; :import { -st-from: './video-player.st.css'; -st-default: VideoPlayer; } .mainVideo { -st-extends: VideoPlayer; /* define mainVideo as VideoPlayer */ } .mainVideo::playButton { /* override mainVideo playButton */ background: green; color: purple; } 
 /* CSS output*/ .Page__mainVideo.VideoPlayer__root {} .Page__mainVideo.VideoPlayer__root .VideoPlayer__playButton { background: green; color: purple; } 

Дополнительная информация

Stylable может предложить гораздо больше. Официальная документация по началу работы содержит подробное объяснение. Существует отдельная документация по интеграции React для ручной интеграции Stylable с компонентом React.

Грязные руки

Имея так много доступных вариантов, я испачкал руки и попробовал их один за другим. Благодаря Git я смог контролировать версию и сравнить все, чтобы увидеть, какой вариант является победителем. Я смог получить некоторую ясность относительно того, сколько зависимостей я использовал и как работал мой рабочий процесс при работе со сложными стилями. У меня была небольшая борьба со всем, кроме обычного CSS, CSS-модулей и SCSS.

Работа в офисе

Модули CSS помогают с импортом и другими вещами, но когда я попытался использовать его, не было особой поддержки для его расширения. Модули CSS имели проблемы, когда я использовал несколько классов и иерархий CSS. Единственная хорошая вещь — это то, что вы не получаете никаких конфликтов CSS, но недостатком является то, что ваш код CSS очень большой. Это немного похоже на методологию БЭМ.

К тому же, работа с псевдоэлементами и состояниями была адом. Иногда модули CSS даже не компилируются, когда я пытаюсь импортировать содержимое другого класса из другого файла. Я бы предпочел использовать для этого миксины в SCSS, но, к сожалению, CSS-модули все еще очень просты в этой области. Ключевое слово composes здесь почти никогда не работает для меня. Это огромный недостаток, с которым я лично столкнулся. Это может быть только моя вина за то, что я не использовал его правильно, но это не сработало даже для настоящего случая.

Персональный проект

Я использовал SCSS в качестве своей следующей попытки поработать со стилями для React. К счастью, это сработало. Сравнение SCSS с модулями CSS дало мне хорошее понимание. Есть так много общего между ними. Здесь есть одна загвоздка в том, что я уже использовал SCSS, и мне это очень удобно, так как он похож на CSS, но обладает суперспособностями. Единственное, что мне нужно сделать вместе с Create React App, это то, что мне просто нужно установить еще одну зависимость, node-sass и ничего больше. Не трогайте конфиги веб-пакетов и не удаляйте приложение React JS из CRA.

Рассматривая возможности модулей CSS, я провел небольшое сравнение между модулями SCSS и CSS и обнаружил, что у меня больше всего возможностей в SCSS. Говоря о компоновке, которая является основной причиной, по которой моя команда выбрала модули CSS, мы можем использовать @mixin и @include в SCSS, и они работают очень хорошо. Я не видел, чтобы модули CSS взаимодействовали с JavaScript, поэтому то же самое с SCSS — никакого взаимодействия с частью JavaScript. Циклы и включения с функциями являются уникальными для SCSS, поэтому я подумал о том, чтобы продолжить работу с SCSS для моего личного проекта и нового проекта в моем офисе.

Мощный?

Очевидно, SCSS является абсолютным победителем здесь. SCSS предоставляет множество новых функций по сравнению с модулями CSS. Я собираюсь сделать глубокий анализ SCSS, как это лучше и почему вы должны использовать SCSS в вашем следующем проекте.

SCSS Wins: углубленный анализ

Я люблю SCSS из-за функций, которые он предлагает. Во-первых, он очень похож на CSS. Вам не нужно изучать что-то новое, чтобы понять SCSS. Если вы знаете CSS, вы, вероятно, знаете Sass. Sass имеет два разных синтаксиса: сам Sass и SCSS, который используется чаще. Синтаксис SCSS совместим с CSS, поэтому вам просто нужно переименовать файл .css в .scss . Конечно, делая это, вы не используете ни одну из сверхспособностей и способностей, которые предоставляет Sass, но, по крайней мере, вы понимаете, что вам не нужно тратить часы и часы, чтобы начать использовать Sass. С этой отправной точки вы сможете изучать синтаксис Sass по ходу работы.

Вы можете перейти на Sass Basics, чтобы начать работать с основами. Настроить поддержку Sass для вашего проекта и начать стилизацию с использованием SCSS очень просто в случае React. Следующим преимуществом использования SCSS, как и любого препроцессора CSS, является возможность использования переменных. Переменная позволяет хранить значение или набор значений и повторно использовать эти переменные в файлах Sass столько раз, сколько вы хотите и где угодно. Легко, мощно и полезно. Это помогает организовать ваш продукт или приложение и оформить его в соответствии с потребностями клиента, не делая ничего, кроме переключения нескольких кусков кода здесь и там.

Вложение в CSS (или SCSS) — одна из лучших вещей, которые может предложить Sass. Sass позволяет вам использовать вложенный синтаксис, который представляет собой код, содержащийся в другом фрагменте кода, который выполняет более широкую функцию. В Sass, вложение позволяет более чистый способ нацеливания на элементы. Другими словами, вы можете вкладывать свои HTML-элементы с помощью CSS-селекторов . Вложение кода с помощью Sass дает множество преимуществ, главным из которых является удобство сопровождения и читаемость SCSS. Мы все слышали о концепции DRY в коде, но в CSS это предотвращает необходимость перезаписывать селекторы несколько раз. Это также помогает легче поддерживать код.

Умение использовать партиалы великолепно. Вы можете разделить SCSS в любом месте на частичные и включать их где угодно. Вы также можете разделить их на миксины и передать некоторые параметры, чтобы обеспечить совершенно другой CSS. Использование переменных — это здорово, но что если у вас есть блоки кода, повторяющиеся в вашей таблице стилей? Именно тогда в игру вступают миксины. Миксины похожи на функции в других языках программирования. Они возвращают значение или набор значений и могут принимать параметры, включая значения по умолчанию. Обратите внимание, что Sass также имеет функции, поэтому не путайте миксин с функцией.

Использование SCSS с React JS

С обновленным приложением Create React, выпущенным недавно, у нас появилось много новых инструментов для игры. Я очень рад .scss , поскольку раньше у нас .scss файлы .scss которые компилировались и записывались в файлы .css прямо в нашей структуре папок. Вы можете быть обеспокоены использованием Sass в React. Разве это не умный способ написания стилей с помощью библиотек CSS-in-JS, таких как styled-components или aphrodite ? Я полагаю, что добавление поддержки Sass к приложению Create React станет большой помощью для начинающих пользователей React. Как использовать Sass в React — один из вопросов, которые я всегда слышу от людей, вступающих в React. С дополнениями React 16.6, такими как React.memo() и функциональными дополнениями React 16.7, такими как React.memo() , начать с React будет проще, чем когда-либо!

  1. Установите приложение Starter с помощью приложения «Создать React»

    Начнем с установки начального приложения. Вы можете сделать это, запустив npm install -g create-react-app npx create-react-app npm install -g create-react-app глобально или используя npx create-react-app чтобы установить и сразу вызвать его, чтобы ваш установленный пакет не находился нигде в ваших глобальных переменных. Проверьте больше о NPX .

  2. Установить node-sass зависимость

    Давайте запустим npm install node-sass чтобы установить node-sass чтобы помочь в компиляции вашего scss в css .

  3. Вот и все — мы сделали. Мы можем проверить конфигурацию, изменив наш файл index.css файл index.scss и опробовав некоторые интересные функции Sass / SCSS .

Общие примеры

Вот способ использования переменных в SCSS:

 $blue: #004BB4; $ubuntu-font: 'Ubuntu', 'Arial', 'Helvetica', sans-serif; $nunito-font: 'Nunito', 'Arial', 'Helvetica', sans-serif; 

Создав переменные, вы можете использовать их везде, где вам нужно, например:

 h1 { font: $ubuntu-font; color: $blue; } a { font: $nunito-font; background-color: $blue; padding: 6px; } 

Когда вы компилируете свои файлы SCSS, компилятор Sass позаботится о переменных, которые вы использовали в исходном файле, заменив имя переменной ее сохраненным значением. И изменение значения цвета так же быстро, как обновление содержимого переменной и повторная компиляция. Прошли времена использования «Найти и заменить» в вашем любимом текстовом редакторе для изменения цветов в вашем файле CSS.

Стоящая особенность, о которой я говорил ранее, — это функция «вложенности» в SCSS. Пример этого можно продемонстрировать здесь:

 <ul class="navbar"> <li><a href="">Item <span>1</span></a></li> <li><a href="">Item <span>2</span></a></li> <li><a href="">Item <span>3</span></a></li> <li><a href="">Item <span>4</span></a></li> <li><a href="">Item <span>5</span></a></li> </ul> 
 .navbar { font: $ubuntu-font; color: $blue; li { margin-left: 1rem; a { padding: 5px; font-size: 1.5rem; span { font-weight: 600; } } } } 

Однако следует помнить, что слишком глубокое вложение не является хорошей практикой. Чем глубже вы вкладываете, тем более многословным становится файл Sass, и тем больше потенциально может быть скомпилированный CSS, поскольку при компиляции вложенность выравнивается. Таким образом, чрезмерное использование вложенности может создать слишком специфические правила CSS, которые сложно поддерживать. Есть вероятность, что селекторы не могут быть повторно использованы, а также есть проблемы с производительностью. Вложенные селекторы создадут длинную строку селектора CSS, которая в итоге создаст больший файл CSS.

Завершение

CSS-препроцессоры здесь, чтобы остаться. Они расширяют базовые функции CSS, предоставляя вам набор мощных функций, которые сразу же повысят вашу производительность. Мы упомянули несколько преимуществ, но есть еще много, таких как наследование, функции, управляющие директивы и выражения, такие как if() , for() или while() , типы данных, интерполяция и т. Д. Чтобы стать гуру Sass, может потребоваться немного время — все, что вам нужно сделать, это просмотреть файлы Bootstrap Sass, чтобы увидеть, как Sass может превратиться в сложную вещь. Но изучение основ и настройка его для вашего проекта не займет у вас много времени.

Попробуйте и дайте мне знать, если вам нужна поддержка в настройке. Я просто сообщение прочь.