Ответ
src/
features/
newFeature/
components/
NewComponent.tsx
NewComponent.styles.ts
hooks/
useNewFeature.ts
types/
newFeatureTypes.ts
utils/
newFeatureUtils.ts
index.ts
shared/
components/
Button.tsx
hooks/
useCommonHook.ts
types/
commonTypes.ts
app/
store/
newFeatureSlice.ts
routes.ts
App.tsx
Основные принципы:
- Функционал группируется в папку
features - Каждая фича содержит все необходимые части (компоненты, хуки, типы)
- Общие элементы выносятся в
shared - Глобальные настройки в
app - Экспорт через
index.tsдля чистого импорта
Пример импорта:
import { NewComponent } from 'features/newFeature' Ответ 18+ 🔞
Смотри, ну вот реально, как же заебало это бардак в проектах устраивать! Ты открываешь папку components, а там — пиздец, хуй пойми что: кнопки, формы, хедеры, футеры, хуи, палки, дрова, всё в одну кучу! Потом ищешь, где логика к одному фичу прикручена, а она размазана по трём континентам и двум вселенным, блядь.
Так вот, слушай сюда, пока я не взорвался. Есть одна охуенно простая идея, называется Feature-Sliced Design. Суть в том, чтобы не срать по углам, а класть всё по полочкам. Смотри, как это выглядит, если делать по-человечески:
src/
features/ <-- Вот тут вся магия живёт!
newFeature/ <-- Берём одну фичу, например, "Корзина" или "Лента новостей"
components/ <-- Компоненты, которые ТОЛЬКО этой фиче принадлежат
NewComponent.tsx <-- Вот этот красавец
NewComponent.styles.ts
hooks/ <-- Кастомные хуки, которые ТОЛЬКО тут нужны
useNewFeature.ts
types/ <-- Типы и интерфейсы, локальные для фичи
newFeatureTypes.ts
utils/ <-- Вспомогательные функции-помощники
newFeatureUtils.ts
index.ts <-- Главный выход в свет! Отсюда всё экспортируем
shared/ <-- А это наш общак, склад запчастей
components/ <-- То, что везде юзается: Кнопка, Инпут, Модалка
Button.tsx
hooks/ <-- Хуки общие, типа useLocalStorage
useCommonHook.ts
types/ <-- Глобальные типы, от которых всё пляшет
commonTypes.ts
app/ <-- Всё, что касается глобальной конфигурации
store/ <-- Слайсы для стейт-менеджера
newFeatureSlice.ts
routes.ts <-- Маршрутизация
App.tsx <-- Само приложение, мать его
Основные правила, которые надо вбить себе в башку, чтобы не быть мудаком:
- Функционал группируется в папку
features. Каждая фича — это как отдельный модуль, микросервис в миниатюре. Всё, что ей нужно для жизни, лежит внутри неё. Она самодостаточная, как ёж в тумане. - Каждая фича содержит все необходимые части. Не надо бегать по всему проекту и собирать пазл. Компоненты, логика, типы, стили — всё тут, под рукой. Удобно, блядь!
- Общие элементы выносятся в
shared. Если кнопка или хук юзается в пяти разных фичах — ему не место в одной из них. Он идёт на общую полку, вshared. Чтобы не было дублей и чтобы все одним говном мазались. - Глобальные настройки в
app. Роутинг, стейт-менеджмент (глобальные слайсы), провайдеры — это всё живёт здесь. Выше только небо. - Экспорт через
index.tsдля чистого импорта. Это, блядь, гениально просто. Внутри папки фичи создаёшьindex.tsи пишешь там что-то типа:
export { NewComponent } from './components/NewComponent';
export { useNewFeature } from './hooks/useNewFeature';
// и так далее...
И тогда, когда тебе эта фича понадобится в другом месте, ты импортируешь её красиво и понятно, без этих долбаных относительных путей в три этажа:
// Вместо этого ужаса:
// import { NewComponent } from '../../../../features/newFeature/components/NewComponent';
// Делаешь так — чисто, аккуратно, по-взрослому:
import { NewComponent, useNewFeature } from 'features/newFeature';
Вот и вся философия, ёпта. Не размазывай логику, не создавай спагетти-код, клади вещи на свои места. И тогда жить станет проще, а код — не таким ебучем для понимания. Всем чмоки в этом чате!