Fsd архитектура react

Fsd архитектура react

Современная разработка на React требует не только глубокого понимания фреймворка, но и продуманной архитектуры проекта. Одним из эффективных подходов к организации кодовой базы является FSD — Feature-Sliced Design, методология, которая помогает масштабировать приложения, минимизируя технический долг и упрощая поддержку. В отличие от традиционных архитектур по слоям или доменам, FSD делит приложение по функциональным срезам, что особенно полезно в крупных командах и долгоживущих проектах.

FSD (Feature-Sliced Design) — это архитектурный подход, ориентированный на разделение кода по функциональным срезам. Он повышает модульность, упрощает командную разработку и снижает риски при рефакторинге.

Что такое FSD: основные принципы и идеология

FSD (Feature-Sliced Design) — это архитектурная методология, разработанная сообществом Effector и активно применяемая в крупных React-проектах. В основе лежит идея декомпозиции приложения на независимые, самодостаточные функциональные срезы, каждый из которых решает конкретную бизнес-задачу. Такой подход противопоставляется монолитной структуре, где компоненты группируются по типам (например, components, pages, utils), что со временем приводит к спагетти-зависимостям.
В FSD акцент делается на горизонтальном срезе функционала: каждая фича содержит всё необходимое для своей работы — UI, логику, стор, тесты. Это позволяет командам работать автономно, не затрагивая чужой код. Методология особенно эффективна в условиях частых изменений требований и масштабирования команд.
Подход напоминает микросервисную архитектуру, но на уровне кодовой базы. Каждый срез — как отдельный сервис, который можно подключить, отключить или заменить без влияния на остальные части системы. Это достигается за счёт строгих правил иерархии, зависимостей и уровней абстракции.

Полезно знать: FSD не привязан к конкретному фреймворку. Хотя чаще всего используется с React, он применим и в Vue, Angular, а также в бэкенд-разработке.

Ключевые принципы FSD-архитектуры

Успешное применение FSD строится на нескольких фундаментальных принципах, соблюдение которых определяет жизнеспособность архитектуры.

  • Декомпозиция по функциональности — приложение делится на срезы (slices), соответствующие бизнес-возможностям, а не технологическим слоям. Например, «авторизация», «корзина», «уведомления».
  • Глубина среза — каждый срез должен быть сквозным: от UI до данных и состояния. Это исключает необходимость заглядывать в другие папки для реализации функции.
  • Уровни абстракции (layers) — FSD выделяет три уровня: app (всё приложение), pages (страницы), widgets (крупные виджеты). Ниже — features (фичи) и entities (сущности).
  • Однонаправленные зависимости — зависимости могут идти только сверху вниз: от app к pages, от pages к widgets и так далее. Обратные связи запрещены.
  • Независимость фич — фичи одного уровня не должны зависеть друг от друга. Если возникает потребность в обмене данными — используется shared-уровень или сущности.

Иерархия уровней в FSD

FSD предлагает чёткую иерархию, которая помогает организовать код:

Уровень
Назначение
Пример
App
Глобальная конфигурация, роутинг, шелл приложения
app/providers, app/router
Pages
Страницы приложения, маршруты
pages/profile, pages/cart
Widgets
Крупные блоки UI, уникальные для страниц
widgets/header, widgets/sidebar
Features
Функциональные возможности (действия пользователя)
features/auth-by-phone, features/add-to-cart
Entities
Бизнес-сущности и их логика
entities/user, entities/product
Shared
Общие утилиты, типы, компоненты
shared/ui/button, shared/lib/utils
«Архитектура должна расти вместе с командой. Если у вас 2 разработчика — FSD может быть избыточен. Но при 5+ человеках он становится обязательным инструментом предотвращения хаоса.» — Алексей, CTO продуктовой компании

Структура FSD-проекта на React

Типичная файловая структура FSD-проекта на React выглядит следующим образом:

src/
├── app/ # Глобальные провайдеры, роутинг
│ ├── providers/
│ └── router/
├── pages/ # Страницы приложения
│ ├── main/
│ └── profile/
├── widgets/ # Переиспользуемые блоки на уровне страниц
│ ├── header/
│ └── sidebar/
├── features/ # Фичи — действия пользователя
│ ├── auth-by-phone/
│ └── add-to-cart/
├── entities/ # Бизнес-сущности
│ ├── user/
│ └── product/
└── shared/ # Общие компоненты и утилиты
 ├── ui/
 └── lib/

Каждый срез (slice) внутри уровней имеет внутреннюю структуру:

  • ui/ — пользовательский интерфейс (компоненты)
  • model/ — логика состояния (store, events, effects — особенно если используется Effector)
  • lib/ — вспомогательные функции
  • api/ — запросы к серверу (опционально)
  • types/ — TypeScript-интерфейсы
  • index.ts — экспорт публичного API среза

Пример: фича «Добавление в корзину»

Рассмотрим реализацию фичи add-to-cart:

features/add-to-cart/
├── ui/
│ └── AddToCartButton.tsx
├── model/
│ ├── store.ts
│ ├── addToCartFx.ts
│ └── events.ts
├── lib/
│ └── formatPrice.ts
├── types/
│ └── index.ts
└── index.ts

Основная идея — любой разработчик может подключить эту фичу, импортировав её через import { AddToCartButton } from 'features/add-to-cart', не зная деталей реализации.

Полезно знать: Использование barrel-файлов (index.ts) в FSD обязательно — они формируют публичный API модуля и контролируют, что можно экспортировать наружу.

Пошаговая реализация FSD в React-приложении

Переход на FSD требует системного подхода. Вот пошаговый алгоритм внедрения:

  1. Анализ текущей архитектуры — определите ключевые страницы, фичи и сущности. Выделите повторяющиеся паттерны и точки сильной связанности.
  2. Определение уровней — создайте папки app, pages, widgets, features, entities, shared. Начните с минимального набора.
  3. Миграция сущностей — начните с выноса бизнес-объектов (user, product) в entities. Убедитесь, что они не содержат UI-логики.
  4. Разделение фич — выделите ключевые действия пользователя (логин, добавление в корзину) и перенесите их в features.
  5. Создание виджетов — оформите крупные блоки (хедер, футер) как widgets, чтобы они могли использоваться на разных страницах.
  6. Настройка зависимостей — проверьте, что нет циклических импортов. Используйте ESLint-правила для контроля уровней.
  7. Автоматизация — настройте генераторы (через Plop или Nx), чтобы новые срезы создавались с правильной структурой.

Инструменты для поддержки FSD

  • Effector — state manager, идеально сочетающийся с FSD благодаря модульности и отсутствию глобального стора.
  • Nx — монорепозиторий с поддержкой генерации, анализа зависимостей и CI/CD.
  • TypeScript — строгая типизация помогает контролировать границы срезов.
  • ESLint + plugin — правила для запрета импортов между уровнями (например, запрет import из features в entities).
«Начинайте с малого. Даже если вы не можете переписать весь проект — начните новую страницу или фичу по FSD. Со временем старый код будет рефакториться естественно.» — Дмитрий, senior frontend architect

Распространённые ошибки при внедрении FSD

Несмотря на простоту концепции, при внедрении FSD часто допускают критические ошибки.

1. Слишком раннее внедрение

FSD — это overhead для маленьких проектов. Если у вас одностраничное приложение с 3 экранами, проще использовать классическую структуру.

2. Неправильное разделение уровней

Частая ошибка — смешение features и entities. Например, размещение логики «добавления в корзину» внутри entities/cart. Правильно: cart — сущность (что?), add-to-cart — фича (что делаем?).

3. Циклические зависимости

Когда widget использует feature, а feature — widget. Решение — вынос общего функционала в shared или пересмотр иерархии.

4. Отсутствие публичного API

Если фича не имеет index.ts с чётким экспортом, любой внутренний файл может быть импортирован откуда угодно — это нарушает инкапсуляцию.

5. Игнорирование автоматизации

Ручное создание структуры ведёт к несогласованности. Используйте генераторы шаблонов.

Ошибка
Последствия
Решение
Фичи зависят друг от друга
Невозможно отключить одну фичу без последствий
Вынести общее в shared или entities
UI в entities
Сущность привязывается к дизайну
Вынести компоненты в widgets или features
Отсутствие слоёв
Проект теряет направленность зависимостей
Ввести четкую иерархию и линтер

Экспертное мнение

При выборе архитектуры важно понимать, что FSD — не панацея, а инструмент для решения конкретных задач. Он наиболее эффективен в проектах с длительным сроком жизни, множеством команд и частыми изменениями требований.
Главное преимущество FSD — способность изолировать изменения. Когда нужно обновить авторизацию, вы работаете только в одной папке, не затрагивая остальной код. Это снижает риск багов и ускоряет доставку фич.
Однако FSD требует дисциплины. Без строгих правил и код-ревью архитектура быстро деградирует. Рекомендуется внедрять его параллельно с линтерами, генераторами и документацией.
FSD хорошо сочетается с современными практиками: atomic design, domain-driven design, event-driven architecture. Особенно мощно он работает с Effector — state manager, который позволяет делать фичи полностью автономными.

Вопросы и ответы

Можно ли использовать FSD в небольших проектах?
Да, но с оговорками. Для MVP лучше начать с упрощённой структуры. FSD стоит внедрять, когда проект начинает расти, и появляются первые признаки спагетти-кода.
Чем FSD отличается от Atomic Design?
Atomic Design фокусируется на визуальной декомпозиции (атомы, молекулы, организмы), тогда как FSD — на функциональной и архитектурной. Они могут дополнять друг друга: атомы — в shared/ui, фичи — в features.
Как тестировать фичи в FSD?
Каждая фича тестируется изолированно: юнит-тесты для логики, компонентные — для UI. Интеграционные тесты проверяют взаимодействие с entities. E2E-тесты покрывают сценарии на уровне pages.
Нужен ли Redux при использовании FSD?
Не обязателен. FSD — это структура, а не state management. Можно использовать Redux, Zustand, Jotai или Effector. Последний особенно популярен в экосистеме FSD благодаря модульности.
Как масштабировать FSD в монорепозитории?
Используйте Nx или Turborepo. Они позволяют разделять приложения, библиотеки и анализировать зависимости между уровнями. Это усиливает контроль над архитектурой.

Заключение

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

Выбирая FSD, вы инвестируете в долгосрочную стабильность проекта. Архитектура не устранит все проблемы, но создаст прочный фундамент для масштабирования.
  • FSD структурирует код по функциональности, а не по типам файлов.
  • Чёткая иерархия уровней предотвращает спагетти-зависимости.
  • Фичи должны быть автономными и иметь публичный API.
  • Внедрение требует дисциплины, но окупается при росте проекта.
  • Инструменты вроде Effector и Nx усиливают эффективность FSD.
⚠️ Дисклеймер — нажмите, чтобы развернуть

Материалы, опубликованные в разделе «Блог» на сайте RU DESIGN SHOP (rudesignshop.ru), носят исключительно информационный и ознакомительный характер и не являются руководством к действию, финансовой рекомендацией, медицинской услугой, ветеринарным назначением либо рекламой товаров и услуг, включая азартные игры. Публикации не содержат призывов к участию в азартных играх и не направлены на продвижение соответствующих операторов.

Безопасность применения товаров и веществ: при использовании строительных материалов, бытовой химии, пестицидов и агрохимикатов необходимо строго следовать инструкциям производителя и действующему законодательству Российской Федерации, включая Федеральный закон РФ от 19.07.1997 № 109-ФЗ «О безопасном обращении с пестицидами и агрохимикатами».

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

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

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

Правовая ответственность: решения, принятые на основе опубликованной информации, пользователь принимает самостоятельно и на свой риск; редакция и авторы несут ответственность в пределах, установленных законодательством Российской Федерации.

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

Упоминание организаций с ограниченным статусом: компания Meta Platforms Inc. (социальные сети Facebook и Instagram) признана экстремистской организацией решением суда РФ, её деятельность запрещена на территории Российской Федерации; любые упоминания приводятся исключительно в информационных целях.

Авторские права и источники: информация собирается из открытых источников; её актуальность указывается на дату публикации и может изменяться.

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

Персональные данные и cookies: сайт использует cookies и обрабатывает персональные данные пользователей в соответствии с Федеральным законом № 152-ФЗ «О персональных данных» и Политикой конфиденциальности RU DESIGN SHOP.

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