Раздел 18 · Воркшопы и проекты

Echo: Slack-подобный чат на трёх стеках

middle-senior~35 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Echo: Slack-подобный чат на трёх стеках

Кому это: ты идёшь по серии 07 · Браузер и Frontend или уже прошёл её. Echo собирается там по кусочку в каждом уроке; этот воркшоп, его финальная сборка. Здесь зафиксирован полный объём проекта, пять капстоун-задач, которых нет ни в одном отдельном уроке, и критерии, по которым проект считается сданным.

Зачем это: одна вещь, читать про RTK Query, другая, довести продукт до ссылки, которую не стыдно показать на собеседовании. Echo задуман как такой продукт: Slack-подобный чат с каналами, живыми сообщениями, поиском и presence, причём в трёх параллельных реализациях. На вопрос интервьюера про сравнение стейт-менеджеров у тебя будет не мнение, а свой код в трёх вкладках.

Что в итоге: задеплоенный чат и монорепо из четырёх воркспейсов:

echo/
├─ apps/
│  ├─ echo-react-rtk/      // React + Redux Toolkit + RTK Query
│  ├─ echo-react-reatom/   // React + Reatom
│  └─ echo-vue-pinia/      // Vue 3 + Pinia
├─ backend/                // Fastify + WebSocket + SSE
└─ packages/
   └─ shared-api/          // общие типы Channel/Message/User и событий

Фиче-сет одинаковый во всех трёх: список каналов, лента сообщений, отправка с optimistic update, поиск, presence через WebSocket, бесконечный скролл, вход и защищённые маршруты.


Карта: что приносит каждый урок

Echo растёт по серии, и большая часть пути уже расписана в уроках. Эта таблица, твой план сборки и одновременно чек-лист «ничего не пропустил»:

УрокиВклад в Echo
01монорепо, Vite, каркас echo-react-rtk
02vanilla-chat.html: тот же чат на голом DOM, для контраста
03сетевой слой: fetch, WS и SSE руками, localStorage и IndexedDB
04-06React-страница, разбор на компоненты, хуки и refs
07контексты темы и пользователя, ErrorBoundary, ленивый поиск
08Vitest + RTL + MSW, тесты ленты, ввода и AuthGuard
09-11карта state, формы на RHF + zod, RTK slices, RTK Query, WS-listener
12вторая реализация: echo-react-reatom
13третья реализация: echo-vue-pinia
14-15FSD-рефактор, разбор рендер-стратегий
16-17бюджет бандла, code splitting, Playwright E2E, Lighthouse CI
18RUM-метрики, error-трекинг, опционально Module Federation

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


Модуль 1 · Роутинг как каркас приложения

В уроках маршруты появлялись по необходимости. Теперь зафиксируем полную карту URL и сделаем роутер владельцем состояния навигации:

МаршрутЧто показываетДоступ
/редирект на последний открытый каналтолько вошедшим
/:channelлента сообщений каналатолько вошедшим
/searchпоиск по сообщениям, ленивый чанктолько вошедшим
/loginвход и регистрациятолько гостям

Требования к реализации:

  • Data-роутер: данные канала начинают грузиться на навигации, а не после рендера спиннера.
  • Активный канал живёт в URL, а не в store: F5 и шаринг ссылки возвращают человека в тот же канал. Это прямое применение правила «router state это тоже state» из урока про карту состояний.
  • Поисковый запрос лежит в ?q=...: поиск можно переслать ссылкой.
  • /search подгружается лениво, и в network видно отдельный чанк (приём из урока про бандлеры).
  • Защита маршрутов оформлена слоем роутера (guard или layout-маршрут с редиректом), а не россыпью if в компонентах.

урок для менти

Продолжение только для менти Vassiliy: этот урок идёт вместе с разбором у ментора.