Frontend
React для Angular-разработчика #
Содержание #
- Зачем Angular-разработчику знать React
- Короткая карта Angular -> React
- React Core
- State и rendering
- Hooks
- Forms
- Data fetching
- Routing
- Context и state management
- Отличия React от Angular
- Разные React-стеки
- Вопросы по уровням
- Практические задачки
- Мини-проект: Travel Planner
- Что важно не перепутать на интервью
- Рекомендуемый порядок изучения
Зачем Angular-разработчику знать React #
Middle #
Зачем Angular-разработчику знать React?
|
React не заменяет Angular в этой подборке. Это соседняя модель UI, которую полезно понимать frontend-разработчику, особенно если на интервью обсуждают не только Angular, но и архитектуру интерфейсов в целом.
|
Короткая карта Angular -> React #
Middle #
Как быстро сопоставить Angular-понятия с React?
|
React Core #
Junior #
Что такое React component?
|
React component - это функция, которая возвращает JSX и описывает часть UI. Компонент получает входные данные через props и может хранить локальное состояние через hooks.
|
Что такое JSX?
|
JSX - это синтаксис, похожий на HTML внутри JavaScript или TypeScript. Он компилируется в вызовы React и позволяет описывать UI рядом с логикой компонента. |
Что такое props?
|
Props - это входные данные компонента, практический аналог |
Как передать событие от child к parent?
|
Parent передает функцию через callback prop, а child вызывает ее в нужный момент. Это похоже на
|
Как вывести список?
|
Обычно через
|
Зачем нужен key?
|
|
State и rendering #
Middle+ or Senior #
Что такое state?
|
State - это данные компонента, изменение которых вызывает новый render. В function components state обычно создают через
|
Чем props отличаются от state?
|
Props приходят снаружи и принадлежат parent component. State принадлежит самому компоненту. Если данные должен менять child, обычно parent передает callback. |
Что такое render в React?
|
Render - это вычисление UI для текущих props и state. Важно думать о render как о чистом описании: при одних и тех же входных данных компонент должен вернуть один и тот же UI. |
Почему state считается snapshot?
|
Во время render-а значение state фиксировано. Если внутри одного обработчика написать несколько обновлений на основе
переменной
Если |
Когда использовать functional updater в setState?
|
Когда новое состояние зависит от предыдущего. Updater получает актуальное промежуточное значение, поэтому серия обновлений работает предсказуемо.
Такой код увеличит счетчик на |
Как batching влияет на обновления state?
|
React может группировать несколько state updates в один render, чтобы не перерисовывать UI после каждого setter-а. Batching не означает, что state мутируется сразу. Setter планирует обновление, а компонент получает новое значение на следующем render-е. |
Почему нельзя писать count++ и ждать корректный render?
|
|
Чем immutable update отличается от прямой мутации?
|
Прямая мутация меняет объект или массив на месте, но React сравнивает ссылки и планирует render через setter. Поэтому массивы и объекты в state обновляют иммутабельно.
В Angular signals похожая идея: лучше обновлять значение через |
Как отфильтровать список без мутации?
|
|
Hooks #
Junior #
Что такое hook?
|
Hook - это функция React, которая позволяет component или custom hook использовать state, effects, context и другие возможности React. Hooks вызывают только на верхнем уровне component или другого hook. |
Что такое useEffect и когда он не нужен?
|
|
Что такое custom hook?
|
Custom hook - это функция, которая выносит reusable stateful logic из компонентов. Это не сервис Angular один к одному: hook живет в React-дереве и подчиняется правилам hooks.
|
Middle #
Чем useEffect(..., []) похож и не похож на ngOnInit?
|
Похож тем, что часто запускается один раз после первого render-а. Не похож тем, что |
Как отменять fetch в useEffect?
|
Через
|
Forms #
Middle+ or Senior #
Что такое controlled input?
|
Controlled input - это input, значение которого хранится в React state и обновляется через
|
Чем controlled forms отличаются от Angular Reactive Forms?
|
В Angular Reactive Forms есть отдельная модель формы: |
Какие частые ошибки бывают при работе с forms в React?
|
Data fetching #
Middle #
Как организовать data fetching?
|
Для маленького примера достаточно |
Чем server state отличается от client state?
|
Server state приходит с сервера, может устаревать, требует cache, refetch и обработки loading/error. Client state принадлежит UI: открытая панель, текущий фильтр, выбранная вкладка, локальный draft. |
Middle+ or Senior #
Где хранить loading, error и empty?
|
Рядом с источником данных. Если запрос локальный для страницы, можно держать state в hook страницы. Если данные переиспользуются, лучше вынести загрузку в custom hook или query layer. |
Routing #
Middle+ or Senior #
Как React Router отличается от Angular Router?
|
Angular Router - часть Angular platform, он тесно связан с DI, guards, resolvers и lazy loading. React Router - отдельная библиотека для client-side routing. Ее выбирают и настраивают отдельно от React.
|
Context и state management #
Middle+ or Senior #
Когда нужен Context?
|
Context нужен, когда значение нужно передать глубоко по дереву без prop drilling: theme, locale, текущий пользователь, настройки приложения. Это ближе к scoped provider, чем к полноценному store. |
Почему Context не всегда замена state manager?
|
Context решает передачу значения, но не дает из коробки нормализованную модель данных, devtools, middleware, cache, optimistic updates или granular subscriptions. Для сложного client state чаще смотрят на Redux Toolkit или Zustand, а для server state - на TanStack Query. |
Как сравнить Angular DI и React Context?
|
Angular DI создает и резолвит зависимости по injector tree, умеет работать с class services, tokens и providers. React Context передает value через component tree. В Context можно положить service-like object, но lifecycle и границы будут React-овыми. |
Отличия React от Angular #
Junior #
Чем props отличаются от @Input()?
|
Обе механики передают данные сверху вниз. В Angular |
Middle #
Чем React component отличается от Angular component?
|
В React это чаще function + JSX + hooks. В Angular - class + metadata + template + DI. React component обычно ближе к функции отображения, а Angular component встроен в более широкий framework lifecycle. |
Чем callback prop отличается от @Output()?
|
|
Чем useEffect отличается от lifecycle hooks?
|
Lifecycle hooks Angular привязаны к lifecycle class component/directive. |
Почему в React нельзя мутировать state напрямую?
|
React должен получить новое значение через setter, чтобы запланировать render. При мутации на месте ссылка может остаться той же, а UI и memoization начнут вести себя непредсказуемо. |
Почему Angular-разработчику важно не пытаться писать React как Angular?
|
Если переносить Angular-привычки напрямую, можно получить лишние service abstractions, неуместный Context, effects для обычных вычислений и тяжелые формы без нужды. Лучше принять React-модель: props down, callbacks up, immutable state, hooks для reusable UI logic. |
Middle+ or Senior #
React - это framework или library?
|
React чаще называют library для UI layer. Он помогает описывать component tree и rendering, но routing, forms, HTTP, state management и project architecture выбираются отдельно. Angular дает больше решений из коробки: router, forms, DI, HTTP integration, CLI conventions. |
Чем React Context отличается от Angular DI?
|
Context передает конкретное значение через React tree. Angular DI резолвит зависимости через injectors и tokens. DI лучше подходит для сервисов и инфраструктурных зависимостей, Context - для значений, связанных с UI-деревом. |
Чем React forms отличаются от Angular Reactive Forms?
|
React не дает встроенной формы уровня Angular Reactive Forms. Можно собрать controlled inputs на state, использовать uncontrolled inputs или взять библиотеку. В Angular Reactive Forms модель формы является частью framework API. |
Чем React Router отличается от Angular Router?
|
React Router - отдельный выбор стека. Angular Router - официальный router с guards, resolvers, DI и lazy loading как частью Angular architecture. |
Чем React state отличается от Angular signals?
|
React state обновляется setter-ом и вызывает render component subtree. Angular signals хранят reactive value и точнее связывают чтения с зависимостями. В обоих случаях важно не мутировать объекты незаметно. |
Почему React-приложения чаще имеют больше вариантов архитектуры?
|
React намеренно покрывает меньше слоев. Команда сама выбирает router, data fetching, forms, state manager, styling и SSR framework. Это гибко, но требует явных соглашений. |
Разные React-стеки #
Middle #
Какие технологии чаще встречаются вокруг React?
|
React сам по себе закрывает UI layer, поэтому вокруг него команда выбирает router, data fetching, forms, styling, testing, auth, hosting и иногда fullstack framework. Это не список библиотек для заучивания. На интервью важнее объяснить, какие требования продукта влияют на выбор и чем этот подход отличается от Angular platform. |
Выбор React-стека #
Middle #
Почему в React нужно выбирать больше библиотек, чем в Angular?
|
Angular - framework с большим количеством официальных решений: router, forms, DI, HTTP integration, CLI conventions. React чаще является UI library, вокруг которой команда собирает стек. Поэтому в React-интервью часто спрашивают не только React Core, но и routing, server state, forms, styling, testing, SSR, auth и hosting. |
Какие решения Angular дает из коробки, а React оставляет команде?
|
Angular дает официальный router, forms API, DI, HttpClient, CLI, application builder и opinionated project structure. В React обычно отдельно выбирают React Router или framework router, TanStack Query или другой data layer, form library, styling strategy, test stack и deployment model. |
Почему это одновременно плюс и минус?
|
Плюс в том, что можно подобрать стек под продукт: SPA, content site, dashboard, fullstack app или mobile. Минус в том, что команда должна принимать больше архитектурных решений и поддерживать их consistency. Без соглашений React-проект быстро превращается в набор локальных предпочтений. |
Как отвечать на интервью, если спрашивают "какой React-стек выбрать"?
|
Начните с требований: SPA или SSR, SEO, сложность форм, объем server state, дизайн-система, уровень команды, monorepo, deployment target, accessibility и testing. Хороший ответ не называет одну любимую библиотеку, а показывает критерии выбора и trade-offs. |
Почему Angular-разработчику важно понимать React ecosystem?
|
Даже без перехода на React это помогает обсуждать micro frontends, shared design systems, hiring, architecture reviews и frontend platform decisions. Angular-разработчику важно понимать, где Angular дает встроенный контракт, а где React команда создает контракт сама. |
Старт проекта #
Middle #
Как выбрать старт проекта?
|
Когда выбрать Vite + React + TypeScript?
|
Когда нужен быстрый SPA-проект: админка, внутренний интерфейс, кабинет, прототип или учебный проект. Vite дает простой dev server и build setup, но не решает SSR, file-based routing и backend-задачи сам по себе. |
Когда выбрать Next.js?
|
Next.js подходит, когда важны SSR, SSG, SEO, file-based routing, server-side data fetching или fullstack-подход в одном репозитории. В отличие от Vite SPA, это framework вокруг React со своими routing, cache и deployment trade-offs. |
Чем Next.js отличается от Vite SPA?
|
Vite SPA обычно рендерит приложение на клиенте и требует отдельного решения для routing/data/backend. Next.js добавляет server rendering, file-based routing, server components и server functions. Это больше возможностей, но и больше framework-specific правил. |
Когда может подойти Astro?
|
Astro уместен для content-heavy и static сайтов, где важно доставлять минимум JavaScript. React-компоненты можно использовать точечно как islands, но приложение не обязано становиться полноценной React SPA. |
Почему React fundamentals все равно нужны, даже если проект на Next.js?
|
Next.js добавляет routing, server rendering, cache и fullstack conventions, но компоненты, props, state, hooks, events, keys и composition остаются React. Без React fundamentals разработчик будет путать framework-specific правила с базовой моделью UI. |
Middle+ or Senior #
Что такое TanStack Start?
|
TanStack Start - fullstack framework из TanStack ecosystem вокруг TanStack Router. Его обычно рассматривают, когда команде важны type-safe routing, loaders и интеграция с TanStack Query без перехода в Next.js-модель. |
Чем React Router library mode отличается от framework mode?
|
В library mode React Router - это router для client-side navigation внутри приложения. В framework mode он становится ближе к application framework: появляются file routes, loaders, actions, server rendering и conventions вокруг данных. |
Package manager и monorepo #
Middle #
Чем npm, pnpm и Bun отличаются на уровне выбора для проекта?
|
|
Когда достаточно npm?
|
Когда проект небольшой, команда не упирается в скорость install, нет сложного monorepo и важна максимальная предсказуемость окружения. Для интервью это нормальный boring default, а не признак слабого стека. |
Когда pnpm может быть лучше?
|
|
Когда нужен monorepo?
|
Когда несколько приложений и библиотек должны вместе версионироваться, переиспользовать design tokens, shared UI, domain logic или tooling. Если в репозитории один маленький app, monorepo может добавить лишнюю сложность. |
Чем Turborepo отличается от Nx?
|
Turborepo чаще воспринимается как task pipeline и cache для JS/TS monorepo. Nx - более полноценная monorepo platform с project graph, generators, affected commands и сильной историей в Angular. Поэтому Angular-разработчику часто проще понять Nx в mixed Angular + React workspace. |
Какие риски есть у monorepo?
|
Риски: медленный CI без affected/cache, неясные boundaries, случайные зависимости между features, сложный ownership и обновления tooling. Monorepo полезен только тогда, когда команда реально поддерживает правила архитектуры. |
Routing и fullstack frameworks #
Middle #
Что выбрать для routing и fullstack?
|
Что такое client-side routing?
|
Это навигация, где URL меняется без полной перезагрузки страницы, а React перерисовывает нужный route на клиенте. Для SPA это привычная модель, но SEO, initial load и data fetching нужно продумывать отдельно. |
Что такое file-based routing?
|
Это подход, где структура файлов определяет routes. Он привычен в Next.js и некоторых fullstack/framework режимах: меньше ручной конфигурации, но больше зависимости от conventions конкретного framework. |
Что такое loader/action подход?
|
Loader загружает данные для route, action обрабатывает mutation или form submission. Это похоже на route-level contract:
данные и навигация проектируются вместе, а не размазываются по |
Что такое React Server Components?
|
React Server Components позволяют части component tree выполняться на сервере и не попадать в client bundle. Это мощно для data fetching и bundle size, но требует понимать границы server/client code, cache, serialization и ограничения framework-а. |
Какие риски у RSC для команды?
|
Риски: новая mental model, путаница server/client boundaries, framework lock-in, сложнее debugging и миграции. Перед выбором важно понять, есть ли реальные требования к SSR, SEO, cache и bundle size. |
Middle+ or Senior #
Чем React Router отличается от Angular Router?
|
Angular Router - официальный router framework-а с DI, guards, resolvers и lazy loading. React Router - отдельная библиотека или framework mode, которую команда подключает и настраивает отдельно от React Core. |
Что такое SSR и hydration?
|
SSR рендерит HTML на сервере, чтобы пользователь и поисковик раньше получили содержимое. Hydration подключает React на клиенте к уже полученному HTML. Риски начинаются, когда server HTML и первый client render не совпадают. |
Что спросить у команды перед выбором React Router, TanStack Router или Next.js?
|
Нужны ли SSR/SSG, SEO, route-level data loading, type-safe routes, server functions, file-based routing и какой deployment target. Если нужен только client-side routing, framework может быть лишним; если нужен fullstack rendering, обычной router library может не хватить. |
State management #
Middle+ or Senior #
Как выбрать state management?
|
Когда достаточно useState?
|
Когда состояние локально для одного компонента или небольшой ветки: открыта модалка, выбран tab, текст input. Если state не нужен другим distant features, не стоит сразу добавлять global store. |
Когда нужен useReducer?
|
Когда обновления связаны правилами и transitions становятся важнее отдельных setters: wizard, сложный фильтр, локальная state machine. Это не замена Redux, а способ сделать локальные изменения предсказуемее. |
Когда выбрать Redux Toolkit, Zustand, Jotai или XState?
|
Redux Toolkit подходит для сложного shared client state, strict conventions и devtools. Zustand проще для небольшого shared state. Jotai может быть удобен для atom-based модели. XState стоит брать, когда домен естественно описывается состояниями и переходами. |
Почему filters/pagination/tabs иногда лучше хранить в URL?
|
URL state можно шарить ссылкой, восстанавливать после reload и использовать в browser history. Для React есть обычные
query params и специализированные helpers вроде |
Чем React state management отличается от Angular services + RxJS/signals?
|
В Angular shared state часто живет в injectable services и опирается на RxJS или signals. В React shared state обычно собирается из hooks, Context, store libraries и query layer. Главное в обоих мирах - разделять local UI state, server state, URL state и domain transitions. |
Data fetching #
Junior #
Что такое server state?
|
Server state принадлежит серверу, может устаревать, требует cache, refetch, retry, invalidation и обработки concurrent updates. Это не то же самое, что global client state вроде открытого sidebar или выбранной темы. |
Middle #
Как выбрать data fetching?
|
Когда достаточно useEffect + fetch?
|
Для маленького учебного примера или одноразового запроса без cache, retry, invalidation и shared ownership. В продукте эта схема быстро обрастает ручной логикой loading/error/refetch и начинает дублироваться. |
Когда использовать RTK Query?
|
RTK Query логичен, если команда уже использует Redux Toolkit и хочет держать API layer рядом с Redux conventions. Если Redux в проекте не нужен, TanStack Query часто будет проще как отдельный server-state layer. |
Когда нужны Apollo Client, urql или Relay?
|
Это GraphQL-клиенты. Apollo часто выбирают за ecosystem и привычный DX, urql - за более легкий и модульный подход, Relay - за строгую модель data requirements и масштабирование больших GraphQL-приложений. |
Middle+ or Senior #
Какие задачи решает TanStack Query?
|
TanStack Query управляет server state: loading/error, cache, refetch, invalidation, retries, pagination и optimistic updates. Это не replacement для Redux Toolkit, потому что Redux Toolkit обычно отвечает за client state и business flow. |
Как это сравнить с Angular HttpClient + service + RxJS?
|
В Angular запросы часто оформляют в services на |
Forms #
Middle+ or Senior #
Как выбрать forms layer?
|
Что такое controlled и uncontrolled input?
|
Controlled input хранит значение в React state и обновляет его через |
Почему большие формы неудобно писать только на useState?
|
Появляется много boilerplate: touched/dirty, validation, nested fields, arrays, server errors, submit state и accessibility. Form library помогает держать эти состояния явно и не смешивать validation с JSX. |
Что дает React Hook Form?
|
React Hook Form упрощает регистрацию полей, validation, errors и submit flow, часто с меньшим количеством re-render-ов. Его часто комбинируют с Zod, чтобы одна schema описывала форму и типы. |
Когда смотреть в сторону TanStack Form или Conform?
|
TanStack Form интересен, когда нужна строгая typed form model и хороший field-level API. Conform полезен в server-first подходах, где form submission и validation тесно связаны с route actions или server actions. |
Чем React forms отличаются от Angular Reactive Forms?
|
Angular Reactive Forms дают официальную модель |
Styling и UI libraries #
Junior #
Что такое runtime CSS-in-JS и какие у него минусы?
|
Runtime CSS-in-JS генерирует стили во время выполнения приложения. В современных SSR/RSC-приложениях это может добавить runtime cost, усложнить streaming/rendering и создать интеграционные ограничения. Поэтому CSS Modules, Tailwind и build-time варианты часто проще. |
Middle #
Как выбрать styling и UI layer?
|
Какие подходы к styling есть в React?
|
Обычный CSS, CSS Modules, Tailwind, build-time CSS-in-JS, runtime CSS-in-JS, design tokens и готовые UI libraries. Это общие frontend-решения, не только React-темы; React лишь задает способ привязать их к component tree. |
Когда достаточно plain CSS или CSS Modules?
|
Plain CSS подходит для небольших проектов и глобальных слоев. CSS Modules дают локальный scope классов без runtime cost и хорошо работают в долгоживущих продуктах, где не нужен тяжелый styling framework. |
Почему Tailwind часто выбирают в React-проектах?
|
Tailwind ускоряет сборку UI, хорошо сочетается с headless libraries и уменьшает переключение между JSX и CSS-файлами. Минус - риск шумной разметки и необходимость дисциплины в design tokens и component boundaries. |
Middle+ or Senior #
Чем component library отличается от headless UI library?
|
Component library вроде MUI, Ant Design, Mantine или PrimeReact дает готовый внешний вид и поведение. Headless/primitives подход вроде Radix, Base UI, React Aria, Ark UI, Ariakit или Headless UI дает accessibility и state behavior, но внешний вид команда строит сама. |
Почему accessibility нельзя перекладывать только на UI library?
|
Library может помочь с keyboard behavior и ARIA patterns, но не знает ваш контент, labels, error messages, focus flow и product context. Как и в Angular, ответственность за итоговую доступность остается у команды. |
Animation и charts #
Middle #
Когда достаточно CSS animations?
|
Для hover/focus, простых transitions, skeletons и небольших enter/exit effects лучше начать с CSS. Animation library нужна, когда есть сложные timelines, gestures, physics или координация нескольких элементов. |
Чем Motion отличается от GSAP?
|
Motion хорошо ложится на React components и declarative UI transitions. GSAP сильнее в сложных timeline-анимациях, скролл-сценариях и production motion design, но требует аккуратной интеграции с React lifecycle. |
Когда выбирать physics-based animation?
|
Когда движение должно ощущаться как физическое: drag, spring transitions, gestures, interactive panels. Для обычного fade/slide это часто лишняя зависимость и лишняя сложность. |
Middle+ or Senior #
Когда использовать D3 напрямую, а когда chart library?
|
D3 напрямую нужен для нестандартной визуализации, кастомных scales/layouts и полного контроля. Для dashboard чаще
быстрее взять Recharts, Tremor, nivo, Victory или react-chartjs. |
Какие performance-риски есть у charts в React?
|
Большие datasets, частые re-render-ы, тяжелые SVG trees, resize handlers и animations могут быстро стать hot path. Важно агрегировать данные, memoize дорогие расчеты, виртуализировать списки рядом с charts и не пересоздавать config без причины. |
Testing #
Middle+ or Senior #
Как выбрать testing stack?
|
Чем Vitest отличается от Jest?
|
Vitest хорошо интегрируется с Vite, быстрее стартует в Vite-проектах и использует похожий API. Jest остается зрелым вариантом для старых проектов и ecosystem, но в новых Vite React apps Vitest часто проще. |
Что тестирует React Testing Library?
|
RTL помогает тестировать поведение компонента глазами пользователя: текст, роли, формы, клики, ошибки. Она намеренно отталкивает от проверки internal state и implementation details. |
Когда нужен Playwright?
|
Для критичных end-to-end flows: login, checkout, создание сущности, routing, permissions, интеграция с backend или browser APIs. Как и в Angular, E2E стоит использовать точечно, потому что они дороже unit/component tests. |
Что такое MSW и зачем он нужен?
|
MSW перехватывает network requests и позволяет тестировать UI без настоящего backend. Это удобно для component и integration tests, где важна реалистичная работа API layer. |
Когда snapshot tests полезны, а когда вредят?
|
Полезны для стабильного generated output или маленьких структур, где snapshot действительно читают. Вредят, когда снимок большой, часто обновляется и заменяет нормальные behavioral assertions. |
Auth, backend и database #
Middle+ or Senior #
Почему auth - это не React-задача сама по себе?
|
Auth связан с backend, cookies, sessions, OAuth/OIDC, CSRF/XSS, storage и deployment. React может показать login UI и читать session state, но модель безопасности определяется сервером и инфраструктурой. |
Где хранить auth session?
|
Для web-приложений часто безопаснее httpOnly cookies и server/session validation, чем хранить access token в
|
Когда использовать hosted auth provider?
|
Clerk, Auth0, WorkOS AuthKit, Supabase Auth, Firebase Auth или AWS Cognito уместны, когда команда хочет быстрее получить OAuth, SSO, MFA, user management и compliance features. Self-hosted auth оправдан, если есть сильные требования к контролю, стоимости, данным или интеграции. |
Чем Next.js API routes отличаются от отдельного backend?
|
API routes/server functions живут рядом с frontend и удобны для BFF, simple endpoints и server-side integration. Отдельный backend лучше, когда есть независимый lifecycle, несколько клиентов, сложная domain model, очереди, фоновые jobs или отдельная backend-команда. |
Когда Hono, Fastify, Express, NestJS или tRPC подходят для React-проекта?
|
Hono/Fastify/Express подходят для легкого Node или edge backend. NestJS ближе Angular-разработчикам из-за DI, decorators и module structure. tRPC особенно полезен, когда frontend и backend на TypeScript и команда хочет end-to-end type safety. |
Чем Drizzle отличается от Prisma на уровне выбора?
|
Prisma дает высокий DX, schema-first workflow и зрелый ecosystem. Drizzle ближе к SQL-like typed query builder и может быть привлекательнее для команд, которым нужен более явный контроль SQL. В любом случае database layer не должен зависеть от React. |
Hosting #
Middle #
Как выбрать hosting?
|
Почему Vercel часто выбирают для Next.js?
|
Vercel тесно поддерживает Next.js features: SSR, ISR, App Router, serverless/edge functions и previews. Это хороший DX, но важно понимать vendor lock-in и переносимость нестандартных возможностей. |
Когда Cloudflare интересен для React/fullstack React?
|
Когда важны edge runtime, глобальная близость к пользователю, Cloudflare Pages/Workers и интеграция с KV, D1 или R2. Но edge runtime имеет ограничения Node APIs, поэтому совместимость нужно проверять заранее. |
Middle+ or Senior #
Чем hosting SPA отличается от hosting SSR-приложения?
|
SPA можно раздать как static files через CDN. SSR-приложению нужен runtime: serverless functions, edge runtime или long-running server. Это влияет на cache, secrets, logs, cold starts и стоимость. |
Что спросить перед выбором hosting provider?
|
Нужен ли SSR, где живет backend, какие требования к regions, secrets, logs, previews, cache, compliance, budget и rollback. Frontend-разработчик не обязан быть DevOps, но должен понимать, как deployment model влияет на React-стек. |
i18n, rich text, upload и drag and drop #
Middle+ or Senior #
Почему i18n - это не просто словарь строк?
|
i18n включает plural rules, dates, numbers, currencies, direction, fallback languages, routing, SEO и перевод контента. Для React часто встречаются react-i18next, next-intl, Lingui и FormatJS, но базовые проблемы общие для всего frontend. |
Когда выбирать react-i18next или next-intl?
|
react-i18next подходит для обычных React SPA и проектов, где нужен зрелый i18next ecosystem. next-intl логичен в Next.js, особенно когда i18n связан с routing, server rendering и переводом metadata. |
Какие риски есть у rich text editor?
|
Rich text - это schema, serialization, paste handling, history, collaboration, accessibility, security и migration content model. Tiptap, BlockNote, Plate, Lexical и Slate выбирают не по названию, а по требованиям к редактору и данным. |
Как безопасно работать с HTML из rich text editor?
|
Нужно sanitization, allowlist tags/attributes, осторожность с links/media и понимание, где HTML хранится и рендерится. React escaping помогает для text nodes, но намеренный render HTML требует отдельной security проверки. |
Какие риски есть у file upload?
|
Размеры файлов, типы, вирусы, private access, presigned URLs, retry, progress, cancellation и обработка ошибок. Иногда достаточно native file input, иногда нужны Uppy, UploadThing или собственный flow через storage provider. |
Почему drag and drop сложнее, чем кажется?
|
Нужно учитывать keyboard access, screen readers, touch devices, auto-scroll, collision detection, virtualization и reordering state. dnd-kit часто лучше современного выбора, а react-beautiful-dnd стоит воспринимать как legacy context. |
Mobile и desktop #
Middle #
Чем React Native отличается от React DOM?
|
React Native использует React-модель компонентов, но рендерит native UI, а не DOM. Поэтому знание React помогает, но не заменяет понимание mobile navigation, gestures, native modules, platform APIs и performance. |
Когда Expo упрощает разработку?
|
Expo дает быстрый старт, managed workflow, OTA updates и готовые APIs для типовых mobile-задач. Он особенно полезен, когда команда не хочет сразу погружаться в native build infrastructure. |
Когда нужен Electron, а когда Tauri может быть альтернативой?
|
Electron подходит, когда нужно desktop-приложение на web stack и важна зрелая ecosystem. Tauri может быть легче по ресурсам и размеру bundle, но требует учитывать Rust/backend integration и зрелость нужных plugins. |
Какие части можно переиспользовать между web и mobile?
|
Обычно переиспользуют domain types, validation schemas, API client, query keys, business rules и design tokens. UI components между React DOM и React Native обычно не переиспользуются напрямую, потому что primitives и accessibility contracts разные. |
Выбор стека на интервью #
Middle #
Какие требования продукта влияют на выбор React-стека?
|
SPA или SSR, SEO или internal app, простые или enterprise forms, много server state или почти все локально, готовая UI library или своя дизайн-система, monorepo или один app, deployment target, уровень команды, testing, accessibility, performance и security. |
Как выбрать между Vite SPA, Next.js и Astro?
|
Vite SPA - для client-side apps без сильных SEO/SSR требований. Next.js - для SSR/SSG/fullstack и routing conventions. Astro - для content/static сайтов, где React нужен точечно и важно доставлять минимум JavaScript. |
Как объяснить trade-off между "меньше зависимостей" и "быстрее delivery"?
|
Меньше зависимостей снижает maintenance и upgrade risk, но команда может тратить время на повторное изобретение сложных вещей: forms, cache, accessibility primitives. Быстрее delivery через libraries оправдан, если команда понимает стоимость ownership и exit strategy. |
Какие признаки overengineering и underengineering в React-проекте?
|
Overengineering: global store для локальной кнопки, monorepo без нескольких packages, SSR без SEO/perf причины, слишком
много UI abstractions. Underengineering: ручной |
Middle+ or Senior #
Как выбрать data, state, forms, UI и testing libraries?
|
Разделите ответственность: server state - query layer, client state - local/store, forms - отдельный form layer, UI - design system или library, tests - pyramid от unit к E2E. Не выбирайте библиотеку, пока не понятно, какую проблему она закрывает. |
Вопросы по уровням #
Junior #
Что такое React component?
|
Функция, которая возвращает JSX и описывает часть UI. |
Что такое JSX?
|
Синтаксис, похожий на HTML внутри JS/TS, который компилируется в вызовы React. |
Что такое props?
|
Входные данные компонента, аналог |
Что такое state?
|
Данные компонента, изменение которых вызывает render. |
Чем props отличаются от state?
|
Props приходят снаружи, state принадлежит компоненту. |
Как обработать click в React?
|
Через
|
Как вывести список?
|
Через |
Зачем нужен key?
|
Он помогает React сопоставлять элементы между render-ами. По смыслу это похоже на идею |
Что такое controlled input?
|
Input, значение которого хранится в state и обновляется через |
Как передать событие от child к parent?
|
Передать callback prop из parent в child. |
Что такое Vite?
|
Vite - build tool и dev server, с которого часто начинают React SPA. Он не является React framework и не заменяет router, data fetching или backend. |
Чем React Router отличается от React?
|
React отвечает за component model и rendering. React Router - отдельная библиотека для навигации между страницами или routes, поэтому ее нужно выбирать и настраивать отдельно. |
Что такое fetch?
|
|
Что такое CSS Modules?
|
CSS Modules позволяют писать обычный CSS с локальными class names для компонента. Это один из простых способов избежать случайных конфликтов глобальных стилей. |
Что такое component library?
|
Component library дает готовые UI-компоненты: buttons, dialogs, tables, forms и navigation. Важно понимать не только внешний вид, но и accessibility, theming и ограничения API. |
Что такое React Hook Form на базовом уровне?
|
React Hook Form - библиотека для форм, которая помогает регистрировать поля, валидировать данные, показывать ошибки и
обрабатывать submit. Ее обычно берут, когда ручной |
Middle #
Что такое render в React?
|
Вычисление JSX для текущих props и state. Render должен быть предсказуемым и без side effects. |
Почему state считается snapshot?
|
Каждый render видит фиксированные значения state. Setter не меняет переменную в уже выполняющемся render-е. |
Как работает batching обновлений state?
|
React группирует несколько updates и делает один render. Поэтому сразу после setter-а нельзя полагаться на новое значение в текущей snapshot-логике. |
Когда использовать functional updater в setState?
|
Когда новое значение зависит от предыдущего: счетчики, добавление элемента, переключение boolean, обновление очереди. |
Что такое useEffect и когда он не нужен?
|
|
Чем useEffect(..., []) похож и не похож на ngOnInit?
|
Похож частым запуском один раз после mount. Не похож моделью dependencies, cleanup и тем, что React не требует класть инициализацию UI state именно в effect. |
Как отменять fetch в useEffect?
|
Создать |
Что такое custom hook?
|
Функция с именем |
Когда нужен Context?
|
Когда значение нужно многим вложенным компонентам: theme, locale, auth session, настройки приложения. |
Почему Context не всегда замена state manager?
|
Он передает value, но не решает cache, нормализацию, debug tooling, optimistic updates и granular updates. |
Как организовать data fetching?
|
Для простого случая - custom hook с |
Чем server state отличается от client state?
|
Server state живет на сервере и может устаревать. Client state описывает локальное состояние UI и пользовательские черновики. |
Как React Router отличается от Angular Router?
|
React Router подключается отдельно и не является частью React. Angular Router - встроенная часть Angular ecosystem. |
Чем controlled forms отличаются от Angular Reactive Forms?
|
Controlled forms держат значения в React state. Angular Reactive Forms дают готовую модель controls, groups, validators и statuses. |
Какие частые ошибки бывают при работе с forms в React?
|
Мутация form state, слишком много ручного boilerplate, смешение validation и rendering, отсутствие обработки server errors. |
Когда выбирать TanStack Query?
|
Когда приложение много работает с server state: cache, refetch, invalidation, retry, pagination, optimistic updates. Если данные принадлежат серверу, query layer обычно лучше, чем складывать их в global client store. |
Когда нужен Zustand или Redux Toolkit?
|
Zustand подходит для легкого shared client state без большого boilerplate. Redux Toolkit лучше, когда нужен строгий data flow, devtools, middleware и единые conventions для сложного client state. |
Когда Context становится плохим решением?
|
Когда через него пытаются хранить часто меняющийся большой state, cache server data или сложную business logic. Context лучше использовать для передачи value вроде theme, locale или session summary. |
Чем server state отличается от global client state?
|
Server state принадлежит backend и требует синхронизации. Global client state принадлежит UI или frontend domain flow: например открытая панель, выбранные элементы, wizard state или локальные настройки. |
Как выбрать form library?
|
Смотрите на размер формы, validation model, nested fields, server errors, accessibility, TypeScript DX и integration со schema вроде Zod. Для простого input form library может быть лишней, для enterprise forms она часто окупается. |
Как тестировать React-компонент через RTL?
|
Проверять то, что видит и делает пользователь: роли, labels, текст, ввод, click, submit, error messages. Не стоит тестировать внутренний state компонента, если это не публичный contract. |
Когда нужен Playwright?
|
Когда нужно проверить реальный пользовательский сценарий через browser: навигация, auth, формы, permissions, критичные flows. Для маленькой pure-функции Playwright не нужен. |
Чем CSS Modules отличаются от Tailwind?
|
CSS Modules дают локальный scope обычным CSS-классам. Tailwind дает utility classes и быстрый workflow прямо в JSX. Оба подхода нормальны; выбор зависит от design process, команды и требований к UI consistency. |
Чем headless UI отличается от component library?
|
Headless UI дает behavior, accessibility primitives и state API без готового визуального слоя. Component library дает готовые компоненты с дизайном, но может сильнее ограничивать кастомизацию. |
Middle+ or Senior #
Как спроектировать структуру React-приложения?
|
Начать с features/pages/shared, отдельно выделить API layer, domain types, reusable UI и routing. Структура должна помогать искать use cases, а не просто сортировать файлы по типу. |
Где хранить бизнес-логику: component, hook, service/module function, store?
|
UI logic можно держать в component или hook. Pure domain logic лучше вынести в module functions. Shared client state - в store. Server state - в query layer. |
Как сравнить Angular DI и React Context?
|
DI - система зависимостей с tokens и injectors. Context - передача value через React tree. Они пересекаются по задачам, но не являются одинаковыми механизмами. |
Как сравнить Angular services и React custom hooks?
|
Angular service - injectable dependency с lifecycle в injector. Custom hook - reusable React logic, которая вызывается внутри component tree. |
Как сравнить Angular signals и React state/memoization?
|
Signals дают fine-grained reactivity, React чаще re-render-ит component function. |
Как избежать лишних render-ов?
|
Держать state ближе к месту использования, не поднимать его без необходимости, использовать стабильные keys, избегать лишнего Context value churn, применять memoization только там, где есть измеримая причина. |
Когда нужны useMemo и useCallback, а когда это premature optimization?
|
Они нужны для дорогих вычислений, стабильных props в memoized children и корректных dependencies. Если вычисление дешевое и нет проблемы с render-ами, это лишний шум. |
Как проектировать reusable components?
|
Делать API маленьким, называть props по домену, не смешивать data fetching с presentation, оставлять escape hatches для сложных cases. |
Как делать compound components?
|
Разделить большой компонент на согласованные части, например |
Как построить форму со сложной валидацией?
|
Выбрать form library, описать schema или validators отдельно от UI, разделить client validation, async validation и server errors. |
Как выбрать между Redux, Zustand, Context и TanStack Query?
|
Context - для передачи value. TanStack Query - для server state. Redux Toolkit - для сложного client state и строгого debug flow. Zustand - для легкого shared client state. |
Как тестировать React-компоненты?
|
Проверять поведение через React Testing Library: что пользователь видит и делает. Внутренние hooks и functions тестировать отдельно, если там есть самостоятельная логика. |
Как устроить error boundary?
|
Error boundary ловит ошибки render-а ниже по дереву и показывает fallback UI. В React это class component API или готовая библиотека-обертка. |
Как делать lazy loading?
|
Через dynamic import, |
Как React встраивается в micro frontend архитектуру рядом с Angular?
|
Через независимые bundles, module federation, web components или shell-level integration. Важно договориться о routing, auth, design system, events и shared dependencies. |
Как выбрать React stack для продукта?
|
Начать с требований: SPA/SSR, SEO, forms, server state, design system, team skill, deployment, testing и accessibility. Затем выбрать минимальный набор решений, который закрывает эти требования без лишней platform complexity. |
Как спроектировать data layer?
|
Разделить API client, query keys, server state, mutations, invalidation и error model. UI-компоненты не должны знать низкоуровневые детали endpoint-ов, а domain logic не должна зависеть от React без причины. |
Как спроектировать forms layer?
|
Выбрать form library, договориться о schema validation, server errors, field components, accessibility и submit flow. Для Angular-разработчика это аналог решения, где проходит граница между Reactive Forms model и UI. |
Как спроектировать UI layer?
|
Определить tokens, primitives, component API, theming, accessibility rules и ownership дизайн-системы. В mixed Angular + React окружении лучше разделять общие tokens/specs и framework-specific adapters. |
Как избежать хаоса в dependencies?
|
Фиксировать критерии выбора библиотек, назначать owners, обновлять зависимости регулярно и не добавлять новую library для локальной задачи без review. Хороший React stack - это не максимальный список packages, а понятные boundaries. |
Как ввести React в Angular-команду?
|
Начать с ограниченного use case, shared coding guidelines, обучения React mental model и code review checklist. Особенно важно проговорить отличия: hooks, immutable state, effects, Context и отсутствие встроенных Angular-like слоев. |
Как организовать monorepo с Angular и React?
|
Выделить apps и libs, запретить случайные зависимости между фреймворками, вынести framework-agnostic domain logic, tokens и tooling. Nx часто удобен для Angular + React monorepo, потому что дает project graph и affected commands. |
Как выбрать между Next.js, Vite SPA и Astro?
|
Vite SPA - для client-side приложений, Next.js - для SSR/SSG/fullstack и SEO, Astro - для content/static сайтов с точечной интерактивностью. Выбор должен идти от продукта, а не от популярности framework-а. |
Как оценить риски SSR/hydration?
|
Проверить browser-only code, auth/session model, cache, dates/locales/random values, third-party widgets и deployment runtime. Hydration mismatch часто появляется там, где server render и первый client render видят разные данные. |
Какие архитектурные trade-offs есть между Angular и React?
|
Angular дает больше структуры и единых решений. React дает больше свободы выбора. Trade-off между предсказуемостью платформы и гибкостью стека. |
Почему Angular дает больше структуры из коробки, а React требует выбора стека?
|
Angular проектировался как framework. React фокусируется на UI layer, поэтому router, forms, server state, SSR и styling команда выбирает отдельно. |
Как выбирать React-стек для enterprise-продукта?
|
Смотреть на требования к routing, SSR, формам, server state, дизайн-системе, найму, observability, testing и lifecycle поддержки. |
Когда React хуже подходит, чем Angular?
|
Когда команде нужна строгая единая платформа из коробки, много одинаковых enterprise-форм, сильная зависимость от DI и желание минимизировать архитектурный выбор. |
Когда React лучше подходит, чем Angular?
|
Когда нужен легкий UI layer, гибкий подбор libraries, быстрая интеграция в существующий стек или команда уже сильна в React ecosystem. |
Как мигрировать часть Angular-приложения на React или наоборот?
|
Идти feature by feature, стабилизировать contracts, вынести domain logic, договориться о routing/auth/design system и не переписывать все сразу без продуктовой причины. |
Как проектировать design system, который используют Angular и React?
|
Разделить tokens, accessibility contract, visual specs и framework adapters. Компоненты могут быть разными, но поведение и дизайн-правила должны быть общими. |
Как разделять domain logic и UI logic между разными frameworks?
|
Domain logic держать в pure TypeScript modules без зависимости от Angular или React. UI logic оставлять в components, hooks, services и adapters конкретного framework. |
Как проектировать state model для долгоживущего продукта?
|
Разделять server state, client state, form drafts и derived values. Описывать ownership данных и правила invalidation. |
Как оценивать риски Next.js / SSR / hydration?
|
Проверять, какие страницы реально требуют SSR, какие данные доступны на сервере, есть ли browser-only код, как устроены cache, auth и deployment. |
Какие проблемы бывают при hydration mismatch?
|
HTML с сервера не совпадает с первым client render: разные даты, random values, browser-only данные, условный rendering
по |
Как контролировать bundle size?
|
Следить за dependencies, lazy loading, route splitting, tree shaking, design system imports и анализом bundle report. |
Как построить стратегию тестирования React-приложения?
|
Pure logic покрыть unit tests, components - behavior tests, critical flows - Playwright, data fetching - mock server или query layer tests. |
Как выстроить code review React-кода для Angular-команды?
|
Проверять data flow, immutable updates, корректные dependencies hooks, отсутствие лишних effects, доступность, тестируемость и понятный выбор libraries. |
Какие вопросы задать команде перед переходом с Angular на React?
|
Зачем нужен переход, какие проблемы он решает, кто владеет архитектурой, какой стек выбран, как мигрировать без остановки разработки и как обучать команду. |
Как принимать архитектурное решение о React-стеке?
|
Зафиксировать требования, альтернативы, trade-offs, риски, migration path и критерии пересмотра решения. Senior-ответ должен показывать не вкус к библиотекам, а ownership и способность поддерживать стек несколько лет. |
Как сравнить Angular platform и React ecosystem?
|
Angular platform дает единый framework contract и официальные решения для многих слоев. React ecosystem дает гибкость, но требует больше локальных соглашений, dependency governance и архитектурного review. |
Какие риски vendor lock-in в Next.js/Vercel?
|
Риск не в самом Next.js, а в использовании platform-specific функций без exit strategy: edge/runtime assumptions, deployment APIs, cache behavior, analytics, image pipeline. Перед выбором нужно понять, насколько легко перенести app на другой runtime. |
Когда React ecosystem становится минусом?
|
Когда команда постоянно меняет libraries, спорит о вкусе вместо требований, дублирует решения и не имеет platform ownership. В таком контексте Angular-like единая платформа может быть продуктивнее. |
Как контролировать dependency sprawl?
|
Вести approved stack, dependency review, bundle checks, upgrade policy и ownership. Любая новая library должна иметь понятную проблему, альтернативы и план поддержки. |
Как сделать framework-agnostic domain layer?
|
Держать domain types, validation, business rules и pure transformations в TypeScript modules без React и Angular imports. Framework-specific code должен быть adapter layer: components, hooks, services, effects и routing. |
Как выбрать state/data/forms libraries на 3-5 лет?
|
Оценивать зрелость, maintenance, release cadence, TypeScript support, ecosystem, hiring, migration path и соответствие продуктовым требованиям. Популярность важна, но не заменяет ownership cost. |
Как оценить зрелость библиотеки?
|
Смотреть на active maintenance, breaking changes, issue velocity, docs, adoption, bundle impact, testability, security history и совместимость с текущим framework/runtime. Для critical path нужна более высокая планка, чем для dev-only tooling. |
Как выстроить frontend platform для нескольких стеков?
|
Разделить общие стандарты и framework adapters: design tokens, accessibility rules, CI, testing conventions, observability, security и release process. Angular и React apps могут отличаться реализацией, но platform contract должен оставаться единым. |
Практические задачки #
Все задачи ниже связаны с мини-проектом Travel Planner.
Junior tasks #
- Создать компонент
TripCard. - Вывести список поездок через
map. - Добавить
key. - Добавить empty state.
- Добавить controlled input для поиска.
- Добавить форму добавления поездки.
- Передать обработчик
onAddTripиз parent в child. - Добавить простую фильтрацию по стране.
Middle tasks #
- Вынести типы
TripиPlace. - Вынести логику в
useTrips. - Добавить загрузку mock data через
fetch. - Добавить
loading,error,empty. - Добавить отмену запроса через
AbortController. - Добавить React Router routes:
/trips,/trips/new,/trips/:tripId. - Добавить
localStorage. - Добавить custom hook
useLocalStorage. - Добавить валидацию формы.
- Добавить optimistic update для добавления поездки, если уместно.
Middle+ tasks #
- Разделить приложение на
pages,entities,features,shared. - Добавить слой API.
- Добавить TanStack Query вместо ручного
useEffect + fetch. - Добавить Context для настроек приложения.
- Сравнить, что должно быть в Context, а что в Query/cache/store.
- Добавить tests для формы, списка и hook.
- Добавить error boundary.
- Добавить lazy route для страницы деталей.
- Добавить debounce для фильтра.
- Добавить сортировку поездок без мутации массива.
Senior tasks #
- Описать архитектурные решения в README.
- Объяснить, как этот проект выглядел бы на Angular.
- Объяснить, что изменится при переходе на Next.js.
- Объяснить, как разделить domain logic так, чтобы ее можно было переиспользовать между Angular и React.
- Спроектировать design system components:
Button,TextField,Card. - Описать стратегию тестирования.
- Описать риски SSR/hydration, если проект перенести на Next.js.
- Описать, где нужен global state, а где достаточно local state.
- Описать trade-offs между Redux Toolkit, Zustand, Context и TanStack Query.
- Описать, как провести code review React-кода для Angular-разработчика.
Мини-проект: Travel Planner #
Middle+ or Senior #
Какие функции должен покрывать Travel Planner?
|
Travel Planner - небольшой проект для тренировки React-мышления без ухода в абстрактные примеры. Функции:
Минимальная модель данных:
|
Что важно не перепутать на интервью #
Middle+ or Senior #
Какие React-вещи чаще всего путают на интервью?
|
Рекомендуемый порядок изучения #
Middle+ or Senior #
В каком порядке изучать React Angular-разработчику?
|
React и Next.js #
Middle #
Как сравнить Context, Redux и Zustand на интервью?
|
Context удобен для редко меняющихся сквозных значений: theme, locale, current user. Он не является полноценным store: при изменении value все consumers могут получить render work, если не разделить context или не мемоизировать value. Redux уместен, когда важны предсказуемые transitions, devtools, middleware, time travel, строгие правила обновления и большая команда. Zustand проще и легче для локальных client stores без большого boilerplate. Angular-разработчику важно сравнить это не с DI, а с управлением состоянием: Angular service с signals или RxJS может занимать ту же нишу, что store, а DI только доставляет зависимость.
|
Middle+ or Senior #
Чем useTransition отличается от useDeferredValue?
|
Для Angular-разработчика полезная аналогия: это не то же самое, что
Follow-up вопросы:
|
Что важно знать про Next.js App Router?
|
App Router строится вокруг С Angular SSR это похоже только верхнеуровнево: оба подхода могут отдавать HTML с сервера, но Next.js сильнее связывает routing, data fetching, server/client boundary и deployment runtime с framework conventions.
Частые ошибки:
|
Практика по React #
Middle #
Практическая задача: напишите useWindowSize с SSR-safe поведением.
|
Что проверяет: custom hooks, cleanup, SSR, browser APIs.
На интервью стоит обсудить initial value для SSR, throttle/debounce для частых resize events и то, почему доступ к
|
Middle+ or Senior #
Практическая задача: реализуйте autocomplete в React.
|
Кандидат должен показать controlled input, loading/error/empty states, отмену устаревших запросов, keyboard navigation и доступную разметку combobox/listbox. Минимальная production-форма:
Angular-разработчику можно предложить сравнить решение с Angular Signals + |