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 — це не «нарисувати красиво». Це продуктивність, типізація, rendering-стратегія, bundle management та підтримуваність на роки.
React та Next.js: коли та чому App Router
React — наш основний UI-фреймворк для складних інтерфейсів. Next.js — стандартний вибір для проектів із вимогами SEO або SSR.
Pages Router проти 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 одразу показує помилки на фронтенді. Overhead: тільки для 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 та design system
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.







