1. Архитектура Feature-Sliced Design и настройка HTTP-клиента
Архитектура Feature-Sliced Design и настройка HTTP-клиента
Добро пожаловать в курс React Lab Survival. Если вы читаете это, значит, перед вами стоит задача сдать лабораторную работу, которая звучит как список требований к коммерческому проекту: авторизация с двумя токенами, сложная валидация, React Query и архитектура FSD. Звучит страшно, но мы разберем этого слона по частям.
Эта статья — фундамент. Мы не будем писать код «как попало», чтобы потом переписывать его в ночь перед дедлайном. Мы сразу настроим проект так, чтобы преподавателю было не к чему придраться в плане структуры.
Почему Feature-Sliced Design?
В маленьких проектах (например, To-Do List) мы привыкли делить код по типам файлов: папка components, папка hooks, папка pages. Это называется File-Type Architecture. Но когда проект растет, компоненты начинают путаться, импорты превращаются в паутину, и понять, какая кнопка к какой логике относится, становится невозможно.
Feature-Sliced Design (FSD) — это архитектурная методология, которая делит код не по типам файлов, а по бизнес-ценности. Она заставляет вас отвечать на вопрос: «Для чего нужен этот код?», а не «Что это за файл?».
Слои FSD
FSD делит приложение на слои. Это строгая иерархия: нижние слои не могут использовать верхние. Это спасает от циклических зависимостей.
!Иерархия слоев FSD: от переиспользуемой базы (Shared) до инициализации приложения (App).
Разберем слои снизу вверх (от самых независимых к самым сложным):
Button, Input, axiosInstance.User (карточка профиля), Product (карточка товара).AuthByEmail (форма входа), AddToCart (кнопка добавления в корзину).Header (логотип + меню + профиль), ProductList (список товаров с фильтрами).LoginPage, CatalogPage.App.tsx, providers, styles.Структура проекта для лабораторной
Исходя из требований вашей лабы (Auth + CRUD), структура папок в src будет выглядеть примерно так:
> Главное правило FSD: модуль может импортировать только из модулей, находящихся на слоях ниже него.
Настройка HTTP-клиента (Axios)
Для работы с сетью мы будем использовать библиотеку Axios. Она является стандартом де-факто благодаря встроенной поддержке перехватчиков (interceptors), которые критически важны для реализации авторизации с обновлением токенов.
Установка
Создание инстанса
В FSD конфигурация API относится к слою Shared. Создадим файл src/shared/api/api.ts.
Мы не будем использовать глобальный объект axios, а создадим настроенный экземпляр (instance). Это позволит нам задать базовый URL и настройки один раз.
Зачем нужны Interceptors (Перехватчики)?
В требованиях к лабе указано: «Авторизация с двумя токенами и автообновлением access». Это значит, что:
Access Token.Делать это вручную в каждом компоненте — безумие. Для этого и нужны перехватчики.
#### Request Interceptor (Перехватчик запроса)
Он срабатывает перед тем, как запрос улетит на сервер. Здесь мы добавляем токен.
#### Response Interceptor (Перехватчик ответа)
Он срабатывает, когда ответ пришел от сервера. Здесь мы ловим ошибки. Полную логику обновления токенов (Refresh Flow) мы реализуем в следующей статье, посвященной авторизации, но каркас подготовим сейчас.
Интеграция с переменными окружения
Никогда не хардкодьте адреса API. Создайте в корне проекта файл .env:
И добавьте .env в .gitignore, чтобы не слить секретные ключи (если они будут) в репозиторий.
Резюме
Мы заложили прочный фундамент:
Shared готов к работе и автоматически подставляет токены.В следующей статье мы реализуем полноценную систему авторизации, подключим React Query и заставим этот механизм работать как часы.