React

usehooks-ts

Набор готовых React hooks для типовых задач: localStorage, media queries, click outside, debounce, event listener, copy to clipboard.

import { useLocalStorage, useOnClickOutside } from 'usehooks-ts';
const [theme, setTheme] = useLocalStorage<'light' | 'dark'>('theme', 'light');

Когда полезно:

  • не хочется писать и поддерживать однотипные hooks;
  • нужен быстрый прототип;
  • команда договорилась брать типовые hooks из одного места.

TanStack Query

Server state: кеширование, refetch, retry, optimistic updates, pagination, infinite queries, mutation lifecycle.

const { data, isLoading, error } = useQuery({
	queryKey: ['users', filters],
	queryFn: () => getUsers(filters),
});

React Hook Form

Формы с минимальным количеством лишних перерендеров. Хорошо сочетается с Zod через resolver.

const form = useForm<UserFormValues>({
	resolver: zodResolver(userFormSchema),
});

Zustand

Лёгкий client state для случаев, когда Context уже неудобен, а Redux избыточен.

const useSidebarStore = create<{
	isOpen: boolean;
	toggle: () => void;
}>((set) => ({
	isOpen: false,
	toggle: () => set((state) => ({ isOpen: !state.isOpen })),
}));

Radix UI

Headless-компоненты с фокусом на доступность: Dialog, Popover, Dropdown, Tooltip, Tabs. Подходит, когда нужна своя визуальная система без реализации сложного поведения с нуля.

JavaScript и TypeScript

lodash / lodash-es

Утилиты для коллекций, объектов и функций. В современных проектах часто лучше импортировать точечно или использовать lodash-es.

import groupBy from 'lodash-es/groupBy';
import debounce from 'lodash-es/debounce';
import uniqBy from 'lodash-es/uniqBy';
const usersByRole = groupBy(users, 'role');
const uniqueUsers = uniqBy(users, 'id');
const saveDraft = debounce((value: Draft) => api.saveDraft(value), 600);

Частые функции:

  • debounce, throttle - ограничение частоты вызовов;
  • groupBy, keyBy - группировка и индексация коллекций;
  • uniqBy - удаление дублей по ключу;
  • sortBy, orderBy - сортировка;
  • pick, omit - выбор полей объекта;
  • isEqual - глубокое сравнение.

ts-pattern

Pattern matching для TypeScript. Удобен для discriminated unions, состояний загрузки и сложных switch.

const label = match(status)
	.with('idle', () => 'Ожидает')
	.with('loading', () => 'Загрузка')
	.with('success', () => 'Готово')
	.with('error', () => 'Ошибка')
	.exhaustive();

Даты

date-fns

Функциональный набор для дат: форматирование, сравнение, интервалы, add/sub, parse. Удобен тем, что функции импортируются отдельно.

import { addDays, format, isAfter } from 'date-fns';
import { ru } from 'date-fns/locale';
const deadline = addDays(new Date(), 7);
const label = format(deadline, 'd MMMM yyyy', { locale: ru });
const isExpired = isAfter(new Date(), deadline);

Day.js

Небольшая библиотека с API, похожим на Moment.js. Удобна, если команде нужен chain-style API.

const label = dayjs(date).add(7, 'day').format('DD.MM.YYYY');

Валидация

Zod

Runtime-валидация и вывод TypeScript-типов из схемы. Полезен на границах системы: формы, API responses, env config, query params.

import { z } from 'zod';
 
const UserSchema = z.object({
	id: z.string(),
	email: z.string().email(),
	role: z.enum(['admin', 'manager', 'viewer']),
});
 
type User = z.infer<typeof UserSchema>;
 
const user = UserSchema.parse(payload);

Valibot

Альтернатива Zod с фокусом на модульность и размер bundle. Имеет смысл смотреть для frontend-приложений, где критичен вес.

Angular

RxJS

База для реактивной работы в Angular: Observable, Subject, switchMap, combineLatest, debounceTime, catchError.

this.users$ = this.searchControl.valueChanges.pipe(
	debounceTime(300),
	distinctUntilChanged(),
	switchMap((query) => this.usersApi.searchUsers(query)),
);

NgRx

Экосистема для Angular state management: Store, Effects, Entity, Router Store, DevTools, Signals. Подходит для больших приложений со сложным shared state и сайд-эффектами.

export const loadUsers = createAction('[Users] Load Users');
export const loadUsersSuccess = createAction(
	'[Users] Load Users Success',
	props<{ users: User[] }>(),
);

Angular CDK

Низкоуровневые building blocks: overlay, portal, drag and drop, virtual scroll, a11y helpers. Полезен даже без Angular Material.

UI и стили

Tailwind CSS

Утилитарная стилизация. Хорошо работает с дизайн-токенами, быстрыми прототипами и компонентным подходом.

class-variance-authority

Описание вариантов компонентов через типизированную конфигурацию. Часто используется вместе с Tailwind.

const buttonVariants = cva('inline-flex items-center', {
	variants: {
		variant: {
			primary: 'bg-blue-600 text-white',
			secondary: 'bg-gray-100 text-gray-900',
		},
		size: {
			sm: 'h-8 px-3',
			md: 'h-10 px-4',
		},
	},
	defaultVariants: {
		variant: 'primary',
		size: 'md',
	},
});

clsx

Удобная сборка классов по условиям.

const className = clsx('button', isActive && 'button_active', isDisabled && 'opacity-50');

Таблицы, графики, виртуализация

TanStack Table

Headless-таблицы: сортировка, фильтры, пагинация, grouping, row selection. Подходит, когда визуальный слой должен быть своим.

TanStack Virtual

Виртуализация длинных списков и таблиц.

Recharts / ECharts

Графики и диаграммы. Recharts проще для React-интерфейсов, ECharts мощнее для сложной аналитики.

Тестирование и качество

Testing Library

Тестирование поведения интерфейса через пользовательские сценарии, а не внутреннюю структуру компонентов.

MSW

Mock Service Worker перехватывает network-запросы и подходит для тестов, Storybook и локальной разработки без backend.

Storybook

Изолированная разработка UI-компонентов, визуальные состояния, документация props, regression testing.

Выбор по задаче

ЗадачаБиблиотеки
Server stateTanStack Query, RTK Query, Apollo
Client stateZustand, Jotai, Redux Toolkit, NgRx
ФормыReact Hook Form, Formik, Angular Reactive Forms
ВалидацияZod, Valibot, Yup
Датыdate-fns, Day.js, Luxon
Утилитыlodash-es, remeda, radash
UI primitivesRadix UI, Base UI, Angular CDK
ТаблицыTanStack Table, AG Grid
ВиртуализацияTanStack Virtual, react-window
Запросыfetch, ky, axios
Тесты APIMSW
E2EPlaywright, Cypress