Middle JavaScript и React
Экспресс-шпаргалка 20/20
- React сравнивает предыдущее и новое virtual DOM дерево и применяет в real DOM только минимально необходимые изменения.
keyнужен, чтобы React стабильно идентифицировал элементы между рендерами и корректно обновлял список.- В зависимости нужно включать все внешние значения, которые используются внутри effect, чтобы избежать stale данных.
- Они полезны, когда есть измеримая проблема производительности: дорогие вычисления или лишние ререндеры из-за нестабильных ссылок.
- Контролируемая форма хранит значение в state, неконтролируемая — в DOM через ref.
- State поднимают к ближайшему общему родителю, если нескольким компонентам нужны одни и те же данные.
- При изменении value контекста все подписанные потребители могут перерендериться.
- Error Boundary ловит ошибки рендера в дочернем дереве React-компонентов и показывает fallback UI.
- Для code splitting и отложенной загрузки тяжелых частей интерфейса.
- Нестабильные props (функции/объекты), слишком высокий state, изменения контекста и отсутствие мемоизации в нужных местах.
- CSR рендерит в браузере, SSR рендерит HTML на сервере на каждый запрос, SSG генерирует HTML заранее на этапе сборки.
- Hydration mismatch — несоответствие между HTML с сервера и первым рендером клиента.
- Оба описывают форму данных, но
interfaceпроще расширять через declaration merging, аtypeгибче для union/intersection и утилитарных комбинаций. - Generics позволяют писать переиспользуемые функции/типы с сохранением строгой типизации.
- Это union объектов с общим дискриминатором (например,
type), который позволяет TypeScript безопасно сужать тип. - Чаще всего
Partial,Pick,Omit,Record,Readonly,ReturnType. Promise.allпадает на первой ошибке,Promise.allSettledдожидается завершения всех промисов и возвращает статус каждого.AbortControllerпозволяет отменятьfetchи другие abortable операции, чтобы не держать лишние запросы и состояния.- Это обработка событий на общем родителе вместо подписки на каждый дочерний элемент.
- Tree shaking удаляет неиспользуемые экспорты из бандла, если код и сборка позволяют это статически определить.
1. Как работает reconciliation в React?
Теги: react, reconciliation, rendering, performance
Сложность: Middle
Короткий ответ
React сравнивает предыдущее и новое virtual DOM дерево и применяет в real DOM только минимально необходимые изменения.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Снимаю baseline в профайлере/DevTools, применяю изменение и подтверждаю эффект по LCP/INP/CPU time.
Мини-пример
items.map(item => <Row key={item.id} item={item} />);
Углубление (2-3 минуты)
- Свяжите тему "Как работает reconciliation в React?" с одним production-сценарием и объясните, почему она влияет на результат.
- Сравните поведение на быстром и медленном устройстве/сети.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Переусложняют мемоизацию там, где нет измеримой проблемы.
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как будете валидировать эффект на медленных устройствах?
- Как эта тема влияет на LCP/INP/CLS в реальном интерфейсе?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Профилирование рендера до/после изменения.
- Границы
SSR/CSR/SSG/ISR(если применимо). - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
2. Зачем нужен key в списках?
Теги: react, key, lists, state-preservation
Сложность: Middle
Короткий ответ
key нужен, чтобы React стабильно идентифицировал элементы между рендерами и корректно обновлял список.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Проверяю целевой сценарий под slow network/CPU throttling и подтверждаю улучшение цифрами, а не ощущением.
Мини-пример
todos.map(todo => <Todo key={todo.id} todo={todo} />);
Углубление (2-3 минуты)
- Свяжите тему "Зачем нужен
keyв списках?" с одним production-сценарием и объясните, почему она влияет на результат. - Покажите, как изменение влияет на рендер и стоимость JavaScript.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Переусложняют мемоизацию там, где нет измеримой проблемы.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как будете валидировать эффект на медленных устройствах?
- Что выберете: простоту кода или оптимизацию, и по какому критерию?
- Какой минимальный тест или проверка подтв ердит, что решение действительно работает?
Что повторить
- Критический путь рендера и метрики
LCP/INP/CLS. - Границы
SSR/CSR/SSG/ISR(если применимо). - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
3. Как правильно работать с зависимостями в useEffect?
Теги: react, useeffect, dependencies, async
Сложность: Middle
Короткий ответ
В зависимости нужно включать все внешние значения, которые используются внутри effect, чтобы избежать stale данных.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Делаю воспроизводимый сценарий гонки/таймаута, добавляю логи порядка событий и проверяю стабильность в серии прогонов.
Мини-пример
useEffect(() => {
fetchUser(userId);
}, [userId]);
Углубление (2-3 минуты)
- Свяжите тему "Как правильно работать с зависимостями в
useEffect?" с одним production-сценарием и объясните, почему она влияет на результат. - Покажите, как тема влияет на race conditions, отмену операций и устойчивость состояния.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Игнорируют отмену, таймауты и повторные запросы, из-за чего появляются race conditions.
- Не учитывают поведение при ошибках внешних сервисов.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Где поставите retry, а где запретите его и почему?
- Что изменится в поведении при таймауте внешнего сервиса?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Стратегии timeout, retry, cancellation и их ограничения.
- Метрики latency/error-rate на целевом сценарии.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
4. Когда useMemo и useCallback реально полезны?
Теги: react, usememo, usecallback, optimization
Сложность: Middle
Короткий ответ
Они полезны, когда есть измеримая проблема производительности: дорогие вычисления или лишние ререндеры из-за нестабильных ссылок.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Сравниваю flamegraph и пользовательские метрики до/после, затем фиксирую guard-тест от регрессии.
Мини-пример
const filtered = useMemo(() => heavyFilter(items, query), [items, query]);
const onSelect = useCallback(id => setSelected(id), []);
Углубление (2-3 минуты)
- Свяжите тему "Когда
useMemoиuseCallbackреально полезны?" с одним production-сценарием и объясните, почему она влияет на результат. - Опишите влияние темы на user-centric метрики (
LCP,INP,CLS) и perceived performance. - Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не проверяют сценарий на медленных устройствах и сетях.
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как эта тема влияет на LCP/INP/CLS в реальном интерфейсе?
- Как будете валидировать эффект на медленных устройствах?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?