Какие используешь библиотеки

Ответ

React, Redux, RTK Query для управления состоянием и API-запросами. Для стилей - Sass, styled-components или CSS Modules. Тестирование - Jest + React Testing Library. Для типов - TypeScript. Утилиты - lodash, date-fns. Формы - React Hook Form + yup для валидации. UI-киты - Material UI или Ant Design.

Пример с RTK Query:

// apiSlice.ts
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

export const api = createApi({
  reducerPath: 'api',
  baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
  endpoints: (builder) => ({
    getUsers: builder.query<User[], void>({
      query: () => 'users',
    }),
  }),
});

// Компонент
const { data: users, isLoading } = useGetUsersQuery();

Ответ 18+ 🔞

О, смотри-ка, народ опять про архитектуру фронтенда спрашивает. Ну что ж, давай разложу по полочкам, как эти ваши современные штуки работают, а то у некоторых в голове, прости господи, каша из jQuery и надежд.

Вот смотри, если ты делаешь что-то серьёзнее, чем "погода в виджете", тебе понадобится управлять состоянием. Не то состояние, когда в пятницу вечером, а состояние приложения — что загрузилось, что выбрал пользователь, куда он тыкнул. Для этого есть React и Redux. А чтобы не писать тонны кода для запросов к серверу, берёшь RTK Query. Это такая штука, которая из коробки даёт кэширование, инвалидацию, загрузку — красота, в общем. Чувствуешь, как жизнь налаживается?

Стили? Да хоть обоссысь от выбора. Sass — классика, чтобы переменные и миксины использовать. styled-components — когда хочешь, чтобы стили были прям в компонентах, как сиамские близнецы. CSS Modules — чтобы имена классов не конфликтовали, и твои .button не превратились в тыкву из-за коллегиного кода.

Тестирование — это как презерватив: лучше иметь и не нуждаться. Jest + React Testing Library. Пишешь тесты, чтобы потом не орать ночью "почему оно сломалось, я же ничего не менял, ёпта!".

TypeScript — это когда ты устал от "а что тут в data лежит? О, сюрприз — undefined!". Он типы пропишет, ошибки на этапе написания подсветит. Сначала кажется, что он тебя ебёт, а потом понимаешь — это он от добра тебя бережёт.

Утилиты — lodash для разной манипуляции с данными (чтобы самому велосипед не изобретать), date-fns для дат (потому что с Date() нативным можно с ума сойти, честное пионерское).

Формы… О, это отдельная песня, пиздец. Раньше руками всё делали, state, onChange… React Hook Form + yup для валидации — это просто праздник какой-то. Контролируешь всё, валидация на ура, перформанс не страдает. Красота!

UI-киты — Material UI или Ant Design. Бери готовые компоненты, как конструктор собирай интерфейс. Только смотри, не перегрузи проект, а то получится "дизайн из ада, блядь".

А вот тебе живой пример, как RTK Query выглядит, чтобы не на словах было:

// apiSlice.ts
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

export const api = createApi({
  reducerPath: 'api',
  baseQuery: fetchBaseQuery({ baseUrl: '/api' }),
  endpoints: (builder) => ({
    getUsers: builder.query<User[], void>({
      query: () => 'users',
    }),
  }),
});

// Компонент
const { data: users, isLoading } = useGetUsersQuery();

Видишь? Объявил endpoint getUsers, а в компоненте хуком всё получил. data, isLoading, error — всё само приехало. Никаких fetch в useEffect, никаких setState на три страницы. Чистая магия, я тебе говорю. Главное — не накосячить с типами, а то TypeScript тебе такую оплеуху выпишет, мало не покажется.

Вот так, собственно, и живём. Собираем из этих кирпичиков нормальные приложения, а не "сделано на коленке за ночь". Хотя, конечно, если проект — это "галерея котиков на одну страницу", то можешь и на голом React писать, хуй с ним. Но для всего остального — этот стек, считай, стандарт де-факто. Понял да?