Skip to main content

Feature-Sliced Design

Що таке Feature-Sliced Design (FSD)

Feature-Sliced Design (FSD) - це архітектурний підхід до організації фронтенд-проєкту, де структура коду будується навколо функціональності (features), а не навколо технічних шарів (наприклад, «components», «utils», «pages»).

Ідея: розділити проєкт за змістом (бізнес-функціями), а не просто за типами файлів.

Головна мета FSD

Зробити проєкт масштабованим і зрозумілим: щоб під час росту коду ти завжди знав, куди покласти новий модуль, і щоб зміна однієї фічі не ламала решту.

Основні рівні (Layers)

FSD ділить проєкт на шари, кожен з яких має свою зону відповідальності. Типова структура виглядає так:

javascript
src/ app/ → кореневий застосунок (ініціалізація, провайдери, роутинг) processes/ → наскрізні бізнес-процеси (наприклад: автентифікація, покупка) pages/сторінки (сторінка профілю, кошика тощо) features/ → окремі фічі (логін, фільтрація, лайк, коментарі) entities/ → бізнес-сутності (User, Product, Order, Post) shared/ → перевикористовувані утиліти, UI, хелпери, API, хуки

Ролі шарів

ШарЩо робитьПриклад
shared/Загальні перевикористовувані частиниUI-бібліотека, utils, hooks
entities/Моделі предметної областіUser, Product, Post
features/Конкретні користувацькі діїЛайк поста, додавання в кошик
pages/Збирання фіч і сутностей у конкретну сторінкуProductPage, ProfilePage
processes/Наскрізні процеси між сторінкамиАвторизація, оформлення замовлення
app/Точка входу, роутер, глобальні провайдериApp.tsx, Providers, ErrorBoundary

Принцип «знизу вгору»

javascript
shared → entities → features → pages → processes → app

Нижчі рівні не знають про вищі. Наприклад:

  • shared не повинен імпортувати нічого з features;
  • features можуть використовувати entities і shared, але не навпаки.

Так зберігається спрямованість залежностей і чистота архітектури.

Структура всередині фічі

Кожна фіча (або сутність) - ізольований модуль, у якому є все, що їй потрібно:

javascript
features/ add-to-cart/ ui/ AddToCartButton.tsx model/ store.ts selectors.ts lib/ formatPrice.ts index.ts

У фічі є свої UI-компоненти, своя логіка, свої типи і стор. Це робить її незалежною і переносною.

Приклад на React / Next.js

javascript
src/ shared/ ui/ Button.tsx Input.tsx lib/ formatDate.ts entities/ user/ model/ types.ts store.ts ui/ UserAvatar.tsx features/ login/ ui/LoginForm.tsx model/store.ts pages/ login/ index.tsx ui/LoginPage.tsx app/ providers/ RouterProvider.tsx StoreProvider.tsx index.tsx

Переваги Feature-Sliced Design

ПеревагаОпис
МодульністьКожен блок ізольований: легко змінювати або видаляти
МасштабованістьМожна додавати нові фічі без хаосу
ПрозорістьЛегко зрозуміти, де лежить бізнес-логіка
Контроль залежностейМінімум «спагеті-імпортів»
Сумісність з Atomic DesignУ shared/ui можна зберігати атоми, молекули й організми
Інтегрується з будь-яким стекомNext.js, React, Redux, Zustand, RTK Query тощо

Приклад із реального світу

Замість хаотичної структури на кшталт:

javascript
components/ hooks/ utils/ pages/

FSD пропонує:

javascript
shared/ entities/ features/ pages/

Тепер, коли ти додаєш нову можливість, ти не думаєш:

«Це компонент чи хук?»

а думаєш:

«Це фіча (дія) чи сутність (об’єкт)?»

Сучасні практики в FSD

  • Використовувати бар’єри імпортів (наприклад, eslint-plugin-boundaries)
  • Експортувати назовні лише index.ts (public API)
  • Декомпозувати UI за Atomic Design усередині shared/ui
  • Розділяти логіку і представлення (model, ui, lib, api)

Підсумок

ЩоОпис
ІдеяСтруктурувати фронтенд за бізнес-функціями, а не за типами файлів
Основні шариshared → entities → features → pages → processes → app
МетаМасштабованість, модульність, зрозумілість
Основна одиницяFeature (фіча): ізольований модуль
Підходить дляВеликих React / Next.js проєктів

Формула FSD: «Групуй код за змістом, а не за технологією. Нехай кожна фіча живе у своєму просторі й нічого не знає про інші».

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.