← Назад
📂 app (слой/слайс)
📁 routes (сегмент)
📁 analytics (сегмент)
📂 pages (слой)
📁 home (слайс)
📂 article-reader (слайс)
📁 ui (сегмент)
📁 api (сегмент)
📁 settings
📂 shared (слой/слайс)
📁 ui (сегмент)
📁 api (сегмент)
user
илиproduct
.* — эти слои, App и Shared, в отличие от других слоев, не имеют слайсов и состоят из сегментов напрямую.
Фишка слоев в том, что модули на одном слое могут знать только о модулях со слоев строго ниже, и как следствие, импортировать только с них.
Дальше идут слайсы, они делят слой по предметной области. Вы можете называть ваши слайсы как угодно, и создавать их сколько угодно. Слайсы помогают не теряться в проекте, потому что группируют тесно связанный по смыслу код.
Слайсы не могут использовать другие слайсы на том же слое, и это обеспечивает сильную связанность кода внутри слайса и слабую сцепленность между слайсами.
Слайсы, а также слои App и Shared, состоят из сегментов, а сегменты группируют код по его назначению. Имена сегментов не зафиксированы стандартом, но существует несколько общепринятых имен для наиболее распространенных целей:
ui
— всё, что связано с отображением: UI-компоненты, форматтеры дат, стили и т.д.api
— взаимодействие с бэкендом: функции запросов, типы данных, мапперы.model
— модель данных: схемы валидации, интерфейсы, хранилища и бизнес-логика.lib
— библиотечный код, который нужен другим модулям этого слайса.config
— файлы конфигурации и фиче-флаги.Папки внутри📂 app
,📂 shared
и📂 pages/article-reader
называются_сегментами_, и они делят слайсы по техническому
назначению, то есть по тому, для чего предназначен код.
api/
ui/
model/
config/
для фиче-флагов, переменных окружения и других форм конфигурацииМы поместим код, который получает тэги, вapi
, сам компонент тэга вui
, а взаимодействие с хранилищем вmodel
.
📂 pages
Папки внутри📂 pages
называются_слайсами_. Они делят слой по домену (в данном случае, по страницам).
Страницы не могут зависеть друг от друга, то есть одна страница не может импортировать код с другой страницы. Это связано справилом импорта для слоёв:
ui
будет содержать саму страницу и составляющие её блокиapi
будет содержать более специализированные функции получения данных, использующиеshared/api
model
может содержать клиентское хранилище данных, которые мы будем отображатьМодуль (файл) в слайсе может импортировать другие слайсы только в том случае, если они расположены на слоях строго ниже.
📂 shared
ui/
— UI-кит, только внешний вид, без бизнес-логики. Например, кнопки, диалоги, поля форм. Содержит наш
переиспользуемый UI-кит.api/
— удобные обёртки вокруг запросов на бэкенд (например, обёртка надfetch()
в случае веба). Содержит наши
примитивы для взаимодействия с бэкендом.config/
— обработка переменных окруженияi18n/
— конфигурация поддержки разных языковrouter/
— примитивы и константы маршрутизацииНазвания сегментов должны описыватьцель (почему), а не суть (что).
Такие названия как
components
,hooks
илиmodals
_не стоит_использовать, потому что они описывают, что содержат эти файлы по сути, а не то, с какой целью писался этот код.
_Публичный API_означает, что слайс или сегмент объявляет, что из него могут импортировать другие модули в проекте.
Например, в JavaScript это может быть файлindex.js
, который переэкспортирует объекты из других файлов в слайсе. Это
обеспечивает свободу рефакторинга внутри слайса до тех пор, пока контракт с внешним миром (т.е. публичный API) остается
неизменным.
📂 pages/ 📂 feed/ 📄 index 📂 sign-in/ 📄 index 📂 article-read/ 📄 index 📁 … 📂 shared/ 📂 ui/ 📄 index 📂 api/ 📄 index 📁 …
Каталоги верхнего уровня в «FSD» называются «слоями», и это первый уровень дробления приложения. У нас есть строго определённое число возможных слоёв, некоторые из них опциональные. Слои стандартизируются, и в настоящее время выделяется семь таких слоёв:
ChangePassword
,
MakePayment
, BuyProduct
.UserSettings
,
PaymentsList
, ProductsList
.withAuth
.За каждым из уровней закреплена своя зона и ответственности и, как видите, все они сильно ориентированы на бизнес. Кроме того, у них ступенчатая иерархия, как показано на следующей картинке. Она строится так, чтобы получился понятный однонаправленный поток данных, что значительно повышает удобство работы с приложением.
Чем ниже модуль расположен в этой иерархии, тем опаснее производить его рефакторинг. Например, если вы измените компонент Modal на разделяемом уровне, это сильнейшим образом скажется на всём приложении.
← Назад