Архитектура современных Spa: эволюция фронтенда от jquery до react и next.js

Архитектура современных spa: как фронтенд эволюционировал от jquery до react/next.js

Зачем вообще говорить про архитектуру SPA

Когда-то фронтенд был «посверкать кнопочками и анимировать меню». Сейчас — это сложные SPA-приложения, которые тащат на себе бизнес‑логику, сложные данные и интеграции. Ошибка в архитектуре легко превращается в:

- сломанный деплой;
- непредсказуемые баги;
- невозможность масштабировать команду.

Поэтому разговор про архитектуру современных SPA — это не теория, а вопрос выживания проекта.

От jQuery к SPA: как мы вообще сюда пришли

Эпоха jQuery: «немного магии поверх HTML»

В начале 2010‑х картинка была простой: есть серверный рендер (PHP, Ruby, .NET), который отдает HTML‑страницы. jQuery добавляет динамику: модалки, AJAX, валидатор форм.

Типичная логика выглядела так:

```js
$('#save').on('click', function () {
$.ajax({
url: '/api/save',
method: 'POST',
data: $('#form').serialize(),
success: function (response) {
$('#status').text('Готово!');
}
});
});
```

Код работает… пока таких обработчиков 10–20. На реальных проектах через год:

- 3000+ строк в одном файле;
- глобальные переменные;
- «магические» селекторы `$('.btn-blue')`, которые ломаются от смены дизайна;
- тестировать нечего — всё спаяно в одну кучу.

В консалтинге мне попадался проект на jQuery и Bootstrap 3: 14 экранов, три человека в команде, и никто уже не решался «что-то менять», потому что любое исправление ломало что‑то в другом месте.

Первое поколение SPA: «давайте перенесём всё в браузер»

Появились AngularJS, Backbone, Knockout. Идея проста: раз браузер стал мощным, пусть он рендерит интерфейс, а сервер отдает только API (JSON).

Это дало:

- роутинг на клиенте (без перезагрузки страниц);
- шаблонизацию;
- первые попытки выделить слои: `models`, `views`, `controllers`.

Но всплыли новые проблемы: тяжелый бандл, SEO, сложность вхождения. Тогда же родилась мысль, к которой сейчас мы вернулись в Next.js: часть работы всё-таки стоит делать на сервере.

Появление React: UI как функция от состояния

Архитектура современных SPA: как фронтенд эволюционировал от jQuery до React/Next.js - иллюстрация

React в 2013–2014 изменил мышление: «интерфейс = функция от state». Не «нарисуй элемент и потом модифицируй DOM», а:

```jsx
function TodoList({ items }) {
return (

    {items.map(item =>

  • {item.text}
  • )}

);
}
```

Компоненты стали единицей переиспользования и мысли. Это критически важно для архитектуры: появилось естественное место, куда класть логику, разбивать на модули, выделять абстракции.

На реальном проекте в финтехе мы заменяли jQuery‑панель управления на React. Количество багов, связанных с «DOM не в том состоянии», упало примерно на 40 % после перехода на предсказуемый state и компоненты. Просто потому, что исчезла ручная возня с DOM.

Архитектура SPA на React: из чего вообще всё состоит

Если отбросить модули, папки и спор про «правильный» стиль, типичное SPA на React делится на несколько слоёв.

1. UI‑слой (компоненты)
Отображает данные, почти не думает. Идеально, если 70–80 % компонентов у вас — «тупые» (presentational), без бизнес‑логики.

2. Слой состояния (state management)
Redux, Zustand, MobX, React Query + локальный state. Здесь живут данные, которые важны сразу для нескольких частей приложения: текущий пользователь, корзина, фильтры.

3. Слой работы с сервером (API‑клиент)
Axios/fetch, обёртки над запросами, обработки ошибок и ретраев.

4. Роутинг
React Router или встроенный роутер Next.js. Управление страницами, параметрами, protected routes.

5. Инфраструктурный слой
Конфиг Webpack/Vite, линтеры, тесты, CI/CD. Всё, что определяет, как приложение живет в проде.

Технический блок: простая, но жизнеспособная структура

```txt
src/
app/ # роуты, layout'ы, провайдеры
entities/ # сущности домена: User, Product, Order
features/ # фичи: auth, cart, filters
shared/ # общие компоненты и утилиты
widgets/ # сложные блоки: Header, Sidebar, Dashboard
```

Эта идея близка к feature-sliced архитектуре и хорошо заходит на проектах с командой от 4–5 фронтендеров.

Почему Next.js стал де-факто стандартом для современных SPA

Долгое время React решал только проблему интерфейса, но не:

- SSR;
- SEO;
- разбиение кода;
- маршрутизацию на сервере.

Next.js закрыл эти дыры: серверный рендер, гибридный режим (SSR + SSG), отличная история с роутингом и файловой системой.

На практике это означает, что:

- первая отрисовка страницы в 2–4 раза быстрее для медленных сетей за счёт SSR;
- Core Web Vitals улучшаются без «танцев с бубном»;
- SEO для маркетинговых/контентных страниц работает «из коробки».

На одном e‑commerce проекте переход с CRA на Next.js дал:

- снижение Time to First Byte ~с 800–900 ms до 200–300 ms;
- рост конверсий с органики на 12–15 % за счёт лучше индексируемого контента.

Технический блок: гибридный рендеринг в Next.js

```tsx
// app/products/[id]/page.tsx
import { getProduct } from '@/shared/api';

export default async function ProductPage({ params }) {
const product = await getProduct(params.id); // SSR-запрос

return ;
}
```

Здесь:

- данные для конкретной страницы грузятся на сервере;
- HTML отдаётся уже с готовым содержимым;
- на клиенте React просто «гидратирует» страницу.

Практическая архитектура: как не утонуть в хаосе

1. Чёткое разделение слоёв

Главная ошибка начинающих — тянуть всё в компонент.

```jsx
// Антипример
function ProductsPage() {
const [products, setProducts] = useState([]);

useEffect(() => {
axios.get('/api/products').then(res => setProducts(res.data));
}, []);

return (

{/* тут ещё 300 строк логики и верстки */}

);
}
```

Через полгода страницу невозможно тестировать и переиспользовать. Лучше:

```jsx
// hooks/useProducts.ts
export function useProducts() {
return useQuery(['products'], fetchProducts);
}

// pages/ProductsPage.tsx
function ProductsPage() {
const { data: products } = useProducts();

return ;
}
```

Результат:

- API-логика живет отдельно;
- UI можно реально протестировать изолированно;
- переезд с REST на GraphQL потребует меньше переписывания.

2. Стандартизация фич

На проектах, где 10+ разработчиков, спасает договорённость: «Каждая существенная фича — это модуль со своим API».

Например, у вас есть `features/auth`:

- внутри лежат компоненты `LoginForm`, `RegisterForm`;
- хук `useAuth`;
- сервисы `login`, `logout`.

Снаружи используется только то, что явно экспортируется из `index.ts`. Это и есть маленькая архитектура в масштабе одной фичи.

3. Числа и факты из практики

На реальном B2B‑продукте (длинные формы, много состояний, сложная таблица) сравнивали:

- хаотичный подход «как получится»;
- модульную архитектуру по фичам (feature-based).

После рефакторинга:

- время онбординга нового разработчика сократилось с 3–4 недель до ~10 дней;
- количество регрессионных багов после релизов упало примерно на треть;
- рефакторинг больших кусков логики стал возможен без тотальной переписки.

Next.js и архитектура: что меняется по сравнению с «чистым» React

Страницы vs компоненты

В Next.js у вас появляются новые «точки входа» архитектуры:

- страницы (pages/app routes) — «контейнеры» для данных и роута;
- layout‑ы — обёртки над группами страниц (общий header/footer, провайдеры);
- серверные компоненты — место, где можно безопасно ходить в БД или приватное API.

Важно не повторять ошибку старых SPA: не тащить сейчас всю логику в layout или page. Часть должна оставаться в фичах и сущностях.

Технический блок: серверные и клиентские компоненты

```tsx
// server component
import { getUser } from '@/entities/user';

export default async function ProfilePage() {
const user = await getUser();

return (
// можно передать на клиент
);
}

// client component
'use client';
export function ProfileView({ user }) {
const [tab, setTab] = useState('info');

return (
// интерактивщина уже здесь
);
}
```

Логика:

- всё, что можно сделать на сервере (запросы, тяжелые вычисления) — делаем там;
- всё, что требует интерактивности (формы, локальный UI‑state) — в клиентских компонентах.

Где тут обучение и как это все осваивать

Многие разработчики пытаются «нащупать» архитектуру сами, через боль. Но сейчас есть нормальные курсы по современному фронтенд‑разработке React и Next.js, где вам не просто объяснят, как сделать todo‑лист, а разберут реальные паттерны: разбиение на слои, работу с API, SSR/SSG, кеширование, роутинг.

Если хотите зайти в профессию с нуля, то формат «frontend разработчик React Next.js удаленно обучение с нуля» с практическими проектами и разбором чужого legacy кода обычно эффективнее разрозненных статей. Важно, чтобы в программе было именно обучение архитектуре SPA приложений React Next.js онлайн, а не просто «вот вам JSX и вот useState».

Для действующих инженеров логичным шагом будет повышение квалификации фронтенд разработчиков по архитектуре SPA: разбор сложных кейсов, микрофронтенды, модульные монолиты, монорепы, дизайн публичных API между фичами.

Практика: на что смотреть при старте нового SPA

Чтобы не утонуть в деталях, можно ориентироваться на чек‑лист.

Небольшой чек‑лист из практики

Архитектура современных SPA: как фронтенд эволюционировал от jQuery до React/Next.js - иллюстрация

1. Определите доменные сущности
Пользователь, продукт, заказ — и т.п. Под них создайте `entities/`.

2. Выделите ключевые фичи
Авторизация, корзина, поиск, фильтры, оплата. Каждая — в своем модуле `features/`.

3. Заранее договоритесь о правилах импорта
Например: фичи не могут импортировать друг друга напрямую, только через `entities` и `shared`.

4. Сразу выберите стратегию работы с данными
REST/GraphQL, React Query/RTK Query и т.д. Избегайте «и так, и сяк» одновременно.

5. Настройте минимальный CI
Линтеры, форматтер, базовые тесты. Это дешевле, чем потом чинить архитектурный хаос.

Сколько стоит архитектура и «разработка SPA под ключ»

Когда бизнес заказывает разработку SPA на React и Next.js под ключ цена сильно зависит именно от архитектуры. Два проекта с одинаковым количеством экранов могут отличаться в 2–3 раза по стоимости поддержки через год.

Из практики:

- «большой» SPA без внятной структуры → через 12–18 месяцев до 40–50 % времени команды уходит на «поддержать шатающийся домик»;
- хорошо спроектированный SPA (слои, разделение по фичам, понятные правила импорта) → основное время тратится на развитие, а не на тушение пожаров.

Инвестиции в архитектуру на старте — это не «красиво по диаграммам», а конкретные деньги и скорость вывода фич в прод.

Итоги: куда всё движется дальше

Фронтенд прошёл путь:

- от «прицепить jQuery и считать, что этого достаточно»;
- через первичные SPA, где всё переехало в браузер;
- к современным гибридным архитектурам на React и Next.js, где часть логики снова живет на сервере.

Сейчас фокус не в том, «какой фреймворк моднее», а:

- как разделить ответственность между слоями;
- как сделать код поддерживаемым при росте команды;
- как балансировать между SSR, SSG и клиентскими компонентами.

Если вы только заходите в тему, начните с простых приложений, но сразу думайте слоями: UI, состояние, данные, фичи. Если уже работаете на проде — посмотрите, где у вас смешаны уровни: компоненты, которые знают слишком много, хаотичные импорты, отсутствие чётких контуров модулей.

Архитектура SPA — это не про диаграммы в Confluence. Это про то, сможете ли вы через два года спокойно открыть свой проект, а не переписывать его с нуля.

Scroll to Top