Как организуете общую структуру кода
Что проверяют
Есть ли у вас принцип, по которому новый файл находит своё место, и как вы не даёте проекту превратиться в свалку через год. Следом обычно спрашивают, куда положить компонент, нужный двум фичам, и как вы следите за границами между модулями.
Как отвечать
Опишите структуру по бизнес-фичам, а не по типам файлов. Папки components, hooks, utils в корне хороши на старте и перестают работать, когда в каждой набирается по сотне несвязанных файлов.
- фичи и слои: готовый язык для этого даёт Feature-Sliced Design. Слои
app,pages,widgets,features,entities,shared, импорт разрешён только из нижележащих слоёв, а у каждого модуля есть публичный API черезindex.ts; - колокация: компонент, его стили, тесты, сторис и типы лежат в одной папке. Удалили фичу, удалили папку;
shared: UI-кит, клиент API, утилиты без бизнес-логики. Код попадает сюда, только когда реально нужен в двух местах;- состояние: серверные данные в TanStack Query или RTK Query, клиентское состояние в Zustand или Redux Toolkit, и эти две вещи не смешиваются в одном сторе;
- слой API: типы и клиент генерируются из OpenAPI, компоненты не зовут
fetchнапрямую; - правила в инструментах: алиасы вида
@/вtsconfig.json, запрет обходных импортов черезeslint-plugin-boundariesилиimport/no-restricted-paths, поиск циклов черезmadge; - несколько приложений: монорепозиторий на pnpm workspaces с Turborepo или Nx.
В Next.js App Router папка app отвечает только за маршруты и сборку страниц, а логика живёт в фичах. Лучше всего подкрепить ответ своим проектом: какая была структура, что сломалось, что поменяли.
Где спотыкаются
Тащат Feature-Sliced Design в лендинг из пяти страниц. Слои и публичные API без нужды удваивают число файлов, и команда тратит время на споры, в какой слой что положить.
Складывают всё подряд в shared или utils. Через полгода там бизнес-логика трёх фич, и любая правка задевает половину приложения.
Не закрепляют правила линтером. Договорённость держится до первого дедлайна, а потом появляются импорты из соседней фичи в обход публичного API и циклические зависимости.