Создание масштабируемых приложений React часто сопряжено с трудностями в управлении структурами компонентов, и сложность этих структур только увеличивается.

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

Идею атомарного дизайна представили Брэд Фрост и Дэйв Олсен: дизайн-система разбивается на мельчайшие части, из которых затем создаются все более сложные, переиспользуемые компоненты. Цель  —  построить не строгую иерархию, а скорее ментальную модель, с которой проще понимать и создавать пользовательские интерфейсы.

Методология атомарного дизайна

Методологией атомарного дизайна проектирование разделяется на пять уровней.

  1. Атомы. Это базовые строительные блоки приложения: кнопка, поле ввода или метка формы. В React они представлены отдельными компонентами. Атомы  —  это фундаментальные элементы, которые сами по себе не очень полезны, но являются основой для создания компонентов посложнее.
  2. Молекулы. Это объединяемые в группы атомы, из которых образуется функциональный блок. Например, форма является молекулой с атомами вроде меток, полей ввода и кнопки отправки.
  3. Организмы. Это относительно сложные компоненты пользовательского интерфейса, состоящие из групп молекул и/или атомов. У этих крупных разделов интерфейса, таких как заголовок, подвал или панель навигации, имеются собственные состояние и функциональность.
  4. Шаблоны. Это страничные объекты, которыми компоненты помещаются в макет и описывается базовая структура содержимого дизайна. Обычно они состоят из групп организмов, представляющих собой полный макет.
  5. Страницы. Это конкретные экземпляры шаблонов, на которых показывается пользовательский интерфейс с имеющимся реальным содержимым представления. Из страниц образуются экосистемы, которыми отображаются различные отрисовки шаблонов. Из экосистем формируется целое приложение.
Атомарный дизайн

Реализация атомарного дизайна в React

Атомарный дизайн реализуется в приложении React с учетом:

  • Категоризации компонентов, распределяемых на атомы, молекулы, организмы, шаблоны и страницы. Эта категоризация отражается в файловой структуре проекта.
  • Управления состоянием на разных уровнях компонентов. В атомах и молекулах состояния может не быть, а вот организмам и шаблонам оно может понадобиться.
  • Документации. Очень важно иметь подробную документацию по каждому компоненту и его использованию. Упрощается эта задача инструментами вроде Storybook, которым создается современное руководство по стилю.

Вот очень простой пример структуры приложения React, построенного на принципах атомарного дизайна:

import React from 'react';

const noop = () => {};

// Атомы
const Button = ({ onClick, children, type }) => <button type={type} onClick={onClick}>{children}</button>;
const Label = ({ htmlFor, children }) => <label htmlFor={htmlFor}>{children}</label>;
const Input = ({ id, type, onChange, value = "" }) => <input id={id} type={type} onChange={onChange} value={value} />;
const Search = ({ onChange }) => <input type="search" onChange={onChange} />;
const NavMenu = ({ items }) => <ul>{items.map((item) => <li>{item}</li>)}</ul>;

// Молекулы
const Form = ({ onSubmit }) => (
<form onSubmit={onSubmit}>
<Label htmlFor="email">Email:</Label>
<Input id="email" type="email" onChange={noop} />
<Button type="submit" onClick={noop}>Submit</Button>
</form>
);

// Организмы
const Header = () => (
<header>
<Search onChange={noop} />
<NavMenu items={[]} />
</header>
);

const Content = ({ children }) => (
<main>
{children}
<Form onSubmit={noop} />
</main>
);

// Шаблоны
const MainTemplate = ({ children }) => (
<>
<Header />
<Content>{children}</Content>
</>
);

// Страницы
const HomePage = () => (
<MainTemplate>
<h2>My Form</h2>
<p>This is a basic example demonstrating Atomic Design in React.</p>
</MainTemplate>
);

Почему именно атомарный дизайн?

Атомарный дизайн идеален для компонентной архитектуры React. Им обеспечиваются:

  • Переиспользуемость. Разбиением интерфейсов на мельчайшие части упрощается повторное использование компонентов, применение модульной композиции в разных частях приложения или даже в разных проектах.
  • Согласованность. Атомарным дизайном поддерживается согласованность пользовательского интерфейса, важная для удобства пользователей и индивидуальности бренда.
  • Сопровождаемость. Будучи хорошо организованными, компоненты со временем становятся намного проще в обновлении и сопровождении.
  • Улучшение совместной работы. Благодаря общему языку проектирования на принципах атомарного дизайна, совершенствуются взаимодействие, использование и дальнейшее развитие. Ведь кодовая база становится понятнее.
  • Повышение качества кода. Поскольку для каждой функции компонента создается мини-экосистема, у каждого компонента или сервиса имеется изолированная среда со стилями, экшенами и тестами. С такой изоляцией становится эффективнее тестирование, обеспечивается качество кода.

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

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Roopal Jasnani: Atomic Design Pattern: Structuring Your React Application

Предыдущая статьяПриемы работы с оболочкой Zsh, которые я хотел бы знать раньше