Frontend-разработка: React, Next.js, Vue, Nuxt, TypeScript
Бандл вырос до 3.1 MB gzip — это реальная цифра из проекта, который пришёл к нам на аудит. Причина: moment.js (72 KB) тянул локали для всех 160 языков, lodash импортировался целиком вместо tree-shaking, три компонентные библиотеки подключены одновременно. TTFB хороший, но TTI (Time to Interactive) на мобильном — 14 секунд. Пользователи уходили.
Frontend — это не «нарисовать красиво». Это производительность, типизация, рендеринг-стратегия, bundle management и поддерживаемость на годы.
React и Next.js: когда и зачем App Router
React — наш основной UI-фреймворк для сложных интерфейсов. Next.js — стандартный выбор для проектов с SEO-требованиями или SSR.
Pages Router vs App Router — актуальный вопрос для новых проектов на Next.js 13+. App Router принёс React Server Components, streaming, и fetch с built-in кешированием. Это реальные преимущества: страница каталога с тысячами товаров рендерится на сервере без отправки логики фильтрации на клиент, JS-бандл меньше.
Но App Router — это другой способ мышления. "use client" нужно ставить осознанно. Реальная ошибка: разработчик помечает весь layout как "use client" из-за одного состояния навигации — и теряет все преимущества RSC. Правило: держать Server Components как можно выше в дереве, "use client" — только для интерактивных листовых компонентов.
ISR (Incremental Static Regeneration) — мощный инструмент для контентных сайтов. Страница генерируется статически и кешируется. По истечении revalidate секунд Next.js регенерирует страницу в фоне — пользователь всегда получает кешированную версию, ни разу не ждёт SSR. На каталоге из 50 000 страниц с ISR и CDN — TTFB < 50ms для любой страницы.
Vue 3 и Nuxt 3: Composition API и SSR
Vue 3 с Composition API — это другой стиль разработки по сравнению с Options API, ближе к React Hooks. setup() и <script setup> синтаксис делает код более переиспользуемым через composables.
Nuxt 3 — фреймворк для Vue с SSR/SSG аналогично Next.js. useAsyncData и useFetch — встроенные composables для получения данных с дедупликацией запросов и hydration. Auto-imports компонентов и composables — удобная фича, но может запутывать при debug: откуда взялась эта функция?
Nuxt Content — модуль для работы с Markdown/MDX файлами как с контентом. Удобно для документации, блогов, контентных сайтов.
Hydration mismatch — специфическая боль SSR на Vue и React. Если контент на сервере отличается от клиентского рендера (дата/время, случайные ID, данные специфичные для браузера) — в консоли появляется предупреждение, в продакшене — визуальные артефакты. Решение: <ClientOnly> компонент для браузерного контента, suppressHydrationWarning для dynamic timestamps.
TypeScript: не опциональная функция
TypeScript обязателен на любом проекте, который планируется поддерживать дольше 3 месяцев или в команде больше одного разработчика. Аргумент «пишем быстро без типов» работает только первые 2 недели.
Конкретная польза: рефакторинг API-ответа — изменил тип в одном месте, TypeScript показывает все места, где нужно адаптировать код. Без типов — баг в продакшене через неделю.
strict: true в tsconfig.json — обязательно. noImplicitAny, strictNullChecks, strictFunctionTypes. Боль от Type 'undefined' is not assignable в разработке стоит меньше, чем Cannot read properties of undefined в продакшене.
tRPC — end-to-end типизация от бэкенда (Node.js) до фронтенда без отдельной схемы (в отличие от GraphQL). Изменил возвращаемый тип процедуры на бэкенде — TypeScript сразу показывает ошибки на фронтенде. Оверхед: только для Node.js бэкенда, для Laravel нужны другие подходы (OpenAPI → Zod schema generation).
Производительность: конкретные метрики и инструменты
Bundle analysis — стартовая точка. @next/bundle-analyzer или rollup-plugin-visualizer (для Vite) — запускаем перед каждым мажорным деплоем. Цель: ни одна страница не должна требовать > 200 KB JS gzip для first paint.
Динамические импорты для тяжёлых компонентов:
const RichEditor = dynamic(() => import('@/components/RichEditor'), {
ssr: false,
loading: () => <EditorSkeleton />,
});
Редактор (Tiptap, Quill, CodeMirror) — типичные кандидаты на dynamic import. Без этого они попадают в основной бандл.
React DevTools Profiler — для поиска лишних ре-рендеров. React.memo, useMemo, useCallback — не серебряная пуля, а точечные инструменты. Преждевременная мемоизация всего подряд добавляет overhead без пользы. Профилируй сначала, оптимизируй потом.
Виртуализация для длинных списков. Список из 10 000 строк в DOM — это гарантированный фриз. @tanstack/virtual или react-window рендерят только видимые элементы. Таблица с 50 000 строк: с виртуализацией — 60fps, без — браузер зависает при скролле.
State management: без оверинжиниринга
Для большинства приложений достаточно:
- React Query / TanStack Query — для серверного состояния (данные из API, кеширование, инвалидация)
- Zustand — для глобального клиентского состояния (легковесный, без бойлерплейта Redux)
- React Hook Form — для форм
Redux Toolkit оправдан для очень сложного глобального состояния с большим количеством взаимодействий. Для большинства задач — это overkill.
Recoil, Jotai — атомарные подходы, хорошо работают для независимых кусков состояния.
CSS и дизайн-система
Tailwind CSS 4 — наш стандартный выбор для новых проектов. Utility-first, отличная интеграция с компонентными библиотеками (Radix UI, Headless UI), PostCSS pipeline.
CSS Modules — альтернатива когда нужна более явная изоляция стилей. Хорошо работает в Next.js из коробки.
Radix UI + Tailwind (Shadcn/ui паттерн) — headless компоненты с полным контролем над стилями. Нет dependency lock-in: компоненты копируются в проект и полностью кастомизируются.
Storybook — для документирования компонентной библиотеки. Особенно полезен в командах, где дизайнер проверяет компоненты независимо от страниц.
Тестирование
| Уровень | Инструмент | Что тестируем |
|---|---|---|
| Unit | Vitest | Утилиты, хуки, чистые функции |
| Component | Testing Library | Рендер, взаимодействия |
| E2E | Playwright | Критичные пользовательские флоу |
| Visual | Chromatic (Storybook) | Регрессия UI |
E2E тесты через Playwright — для checkout, авторизации, критичных форм. Не для всего подряд: поддержка большой e2e-сюиты дорогая.
Ориентиры по срокам
| Задача | Срок |
|---|---|
| SPA (дашборд, CRM-интерфейс) | 8–16 недель |
| Next.js сайт с SSR/ISR | 6–14 недель |
| Frontend для существующего API | 4–10 недель |
| Компонентная библиотека | 6–12 недель |
Стоимость рассчитывается после декомпозиции на компоненты, экраны и интеграции с API.







