Вопросы на собеседовании: Angular-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior Angular-инженер.
Смотреть пример резюме: Angular-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Я разделю код по бизнес-доменам и оставлю у каждого домена один небольшой публичный API.
- Каждый домен владеет своими роутами, UI, доступом к данным и состоянием, а общие библиотеки содержат только нейтральные к домену примитивы.
- Между доменами импорты проходят через типизированные контракты или оркестрацию уровня приложения, но не через внутренние пути компонентов или store.
- Правила зависимостей Nx проверяют теги доменов и слоёв, поэтому недопустимая связь ломает CI.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат превратить владение доменами в контролируемое направление зависимостей.
Я буду использовать standalone-компоненты по умолчанию, оставив NgModules только на доказанной границе совместимости.
- Каждый компонент импортирует директивы, пайпы и компоненты своего шаблона, поэтому зависимости остаются локальными и статически видимыми.
- Возможности приложения собираются при bootstrap через providers вроде provideRouter и provideHttpClient, а не через AppModule.
- Границы фич по-прежнему задают роуты, библиотеки и публичные API, потому что standalone сам по себе не определяет архитектуру.
Зачем это спрашивают: Сильный ответ использует standalone как современный способ композиции, но не путает его с доменной архитектурой.
Я зарегистрирую аналитику в EnvironmentInjector приложения, а состояние checkout в ElementInjector компонента checkout shell.
- bootstrapApplication получает глобальный environment provider, поэтому все роуты используют один экземпляр адаптера аналитики.
- Checkout shell предоставляет свой state service, поэтому каждый экземпляр компонента создаёт одно состояние и уничтожает его вместе с view.
- Route EnvironmentInjector подходит для общего сервиса дочерних роутов, но нельзя считать, что он сбрасывается при каждой навигации.
Зачем это спрашивают: Интервьюер оценивает размещение providers по точному времени жизни инжектора, а не по общему правилу global-versus-local.
Я выберу @if, чтобы во view существовали только выбранная панель и её зависимости.
- @if и @else напрямую выражают взаимоисключающие ветки без импорта NgIf в standalone-компонент.
- Удаление неактивной ветки также уничтожает её дочерние views и принадлежащие им подписки вместо фоновой работы скрытой панели.
- Состояние, которое должно пережить переключение панелей, находится выше условной границы, а не внутри пересоздаваемой панели.
Зачем это спрашивают: Интервьюер проверяет понимание последствий встроенного control flow для жизненного цикла.
Я буду отслеживать строку по неизменяемому ID заказа, а не по ссылке на объект или $index.
- track order.id позволяет Angular перемещать существующие views строк при сортировке вместо их уничтожения и пересоздания.
- $index безопасен только для статического списка, у которого никогда не меняются порядок и состав.
- Повторяющиеся или изменяемые ключи ломают идентичность, поэтому API-контракт гарантирует один стабильный ID на заказ.
Зачем это спрашивают: Сильный ответ связывает track в @for со стабильной идентичностью, переиспользованием DOM и корректностью при сортировке.
Я размещу преобразование транспорта за типизированным адаптером на границе каждого семейства роутов.
- Адаптеры HttpClient владеют URL, сгенерированными DTO, обработкой статусов и преобразованием в общий контракт Price.
- Компоненты потребляют доменную модель и не ветвятся по версии API или необязательным полям транспорта.
- Providers роута выбирают нужную реализацию адаптера через InjectionToken без изменения кода компонентов.
Зачем это спрашивают: Интервьюер оценивает, локализована ли изменчивость API на конкретной архитектурной границе.
Я сделаю каждый целостный workflow ленивым поддеревом роутов, оставив eager только оболочку и первый роут.
- loadChildren или loadComponent сохраняет границу динамического импорта вокруг каждого workflow.
- Вложенные роуты держат guards, resolvers и providers рядом с workflow, который они координируют.
- Общая библиотека может содержать стабильные примитивы, но импорт lazy-фичи из оболочки разрушит разделение.
Зачем это спрашивают: Интервьюер проверяет композицию роутов, lazy-границы и защиту от случайных eager-импортов.
Я опубликую один сфокусированный компонент карточки с явными точками расширения для четырёх областей действий.
- Типизированные inputs передают данные клиента, outputs сообщают нейтральные к домену намерения пользователя, а content projection добавляет необязательные действия.
- Общий компонент владеет layout и доступностью, а продуктовые правила остаются в потребляющей фиче.
- Я не допущу растущую матрицу boolean inputs, потому что их комбинации превращаются во вторую недокументированную продуктовую модель.
Зачем это спрашивают: Интервьюер оценивает переиспользование через стабильные контракты вместо копий или компонента с десятками флагов.
Я оставлю writable только вводимые пользователем значения, а налог и итог получу через computed.
- Количество, цена, скидка и налоговая юрисдикция являются writable signals, потому что действия пользователя заменяют эти значения.
- computed мемоизирует итог и перезапускается только при изменении signal, прочитанного во время последнего выполнения.
- Отдельное сохранение рассчитанного итога создаст два writable-источника, которые могут разойтись.
Зачем это спрашивают: Интервьюер проверяет, отличает ли кандидат исходное состояние от производного состояния signals.
Я получу итог корзины через computed, а effect оставлю только для императивной синхронизации графика.
- Шаблон читает computed напрямую, поэтому Angular отслеживает зависимость без effect, записывающего новое состояние.
- Effect вызывает API графика и регистрирует очистку, если библиотека удерживает ресурсы или listeners.
- Копирование одного signal в другой через effect создаёт риски задержки и циклов записи, которых нет у computed.
Зачем это спрашивают: Сильный ответ использует effect только на императивной границе и сохраняет вычисления декларативными.
Я прочитаю accountId обычным способом, а locale внутри effect через untracked.
- Отслеживаемое чтение accountId перезапускает effect при смене выбранного аккаунта.
- untracked(() => locale()) получает текущую локаль, не добавляя её в граф зависимостей.
- Я не буду использовать untracked для сокрытия реальной зависимости, иначе синхронизируемый результат устареет.
Зачем это спрашивают: Интервьюер оценивает точное управление динамическими зависимостями signals, а не бездумное применение untracked.
Я экспортирую required signal input для dataset и signal input с transform для precision.
- input.required<Dataset>() превращает отсутствие значения в ошибку типов шаблона и даёт внутреннему коду Signal<Dataset>.
- Input transform преобразует строковый атрибут в ограниченное число на границе компонента при каждом обновлении binding.
- Внутренние computed values получают серии графика из этих inputs без копирования в ngOnChanges.
Зачем это спрашивают: Интервьюер проверяет актуальные контракты signal inputs, преобразование и дизайн производного состояния.
Я экспортирую model<DateRange>(), если двусторонняя привязка является намеренной частью контракта компонента.
- Вызов range.set или range.update меняет локальное состояние и отправляет родителю соответствующее событие rangeChange.
- Значение только для чтения должно остаться input(), потому что model даёт дочернему компоненту право записи.
- Для компонента в роли form control валидация и touched-состояние всё равно требуют контракта Angular forms.
Зачем это спрашивают: Интервьюер оценивает, когда model inputs выражают реальное общее владение, а когда излишне открывают мутацию.
Я буду обновлять его через уведомления, распознаваемые Angular, а не мутацию незамеченного поля.
- Изменённый через Angular input, связанный template или host listener и ComponentRef.setInput могут уведомить view.
- Обновление прочитанного шаблоном signal, emission AsyncPipe или ChangeDetectorRef.markForCheck также планируют проверку.
- Мутация существующего input-объекта внутри произвольного callback сохраняет ссылку и не даёт надёжного уведомления.
Зачем это спрашивают: Интервьюер проверяет точную семантику уведомлений OnPush вместо мифа, что важны только изменения inputs.
Я добавлю provideZonelessChangeDetection() при bootstrap и удалю Zone.js из polyfills приложения.
- Записи в signals, читаемые шаблонами, emissions AsyncPipe, связанные listeners, setInput и markForCheck дают распознаваемые уведомления.
- Сторонние callbacks оборачиваются на одной границе адаптера, который записывает signal или отмечает владеющий view.
- Тесты ожидают фактическую async-операцию или отрендеренное состояние, а не стабилизацию Zone.js.
Зачем это спрашивают: Сильный ответ рассматривает zoneless как явную модель уведомлений, а не переключатель производительности.
Я уберу позднюю мутацию и сделаю title стабильным до проверки завершённого прохода Angular.
- Ошибка означает, что binding вернул одно значение при проверке и другое во время development-прохода верификации.
- Title, производный от inputs, находится в computed или более ранней инициализации, а пользовательские изменения происходят в последующем event handler.
- Вызов detectChanges или перенос записи в timer маскирует проблему владения вместо исправления потока данных.
Зачем это спрашивают: Интервьюер проверяет понимание инварианта ошибки и исправление причинности вместо её подавления.
Я оставлю текущие фильтры и производное UI-состояние в signals, а время запросов в одном RxJS pipeline.
- toObservable один раз преобразует signal фильтра, после чего debounceTime и switchMap реализуют отмену устаревших запросов.
- toSignal один раз преобразует итоговую read model для шаблона с явным начальным состоянием.
- Повторные преобразования в отдельных компонентах создадут неясное владение подписками и дубли холодной работы.
Зачем это спрашивают: Интервьюер оценивает осознанную границу взаимодействия, сохраняющую семантику signals и потоков.
Я добавлю debounce и использую switchMap, потому что каждый новый запрос заменяет предыдущий.
- switchMap отписывается от устаревшего внутреннего Observable HttpClient при появлении нового запроса.
- distinctUntilChanged не позволяет повторно запрашивать одинаковую нормализованную строку.
- Ответ обновляет состояние только последнего запроса, поэтому медленный старый ответ не перезапишет новый результат.
Зачем это спрашивают: Интервьюер проверяет, следует ли политика отмены продуктовому требованию о последнем результате.
Я использую concatMap, потому что принятую ревизию нельзя отменить или переставить.
- Каждая ревизия ждёт завершения Observable предыдущего сохранения, прежде чем запустить свой запрос.
- Очередь нужно ограничить через debounce или объединение снимков, если пользователь создаёт ревизии быстрее, чем API их сохраняет.
- Ошибка внутреннего сохранения обрабатывается внутри projection, чтобы один сбой не завершил навсегда последующие сохранения.
Зачем это спрашивают: Сильный ответ выбирает упорядоченную очередь и учитывает её рост при использовании concatMap.
Я использую exhaustMap, потому что первое нажатие владеет окном авторизации, а пересечения нужно игнорировать.
- Пока внутренний запрос активен, exhaustMap отбрасывает последующие emissions кликов вместо их отмены или постановки в очередь.
- UI также отключает кнопку для обратной связи, но семантика оператора остаётся защитой корректности.
- Запрос всё равно передаёт idempotency key, потому что подавление кликов на клиенте не гарантирует корректность платежа.
Зачем это спрашивают: Интервьюер оценивает точную семантику пересечений и понимание того, что RxJS не является backend-границей корректности.
Закрытые вопросы
- 21
Экран загрузки может отправить 100 файлов, но API допускает только четыре одновременные загрузки; какую RxJS mapping policy реализовать?
rxjsapiconcurrency - 22
Роуту нужны текущее значение пользователя, одноразовое событие refresh, три последних сообщения валидации и один финальный результат экспорта; какие типы Subject подходят?
rxjsvalidation - 23
Dashboard shell подписывается на WebSocket и должен закрыться при каждом уходе shell из outlet; как связать teardown с жизненным циклом Angular?
angularwebsockets - 24
Live-поиск должен продолжать работу после одного HTTP 500; где разместить catchError относительно switchMap?
rxjshttp - 25
Шесть виджетов потребляют один pricing-поток уровня роута, а исходный WebSocket должен отключиться без подписчиков; как разделить поток?
pricingwebsockets - 26
На странице отчёта есть live-фильтр, три одноразовых стартовых запроса и кнопка refresh, которой нужен последний фильтр; какие combination operators назначить?
- 27
Экран телеметрии получает 5000 событий в секунду, но может перерисовываться 60 раз в секунду и отправлять batches каждые 100 мс; как контролировать давление?
renderingbatch - 28
Angular-платформе из 20 доменов нужны междоменные команды с трассировкой через actions, а состояние wizard исчезает при навигации; выбрать classic NgRx Store или SignalStore для каждого?
angularstate-managementsignals - 29
Lazy-роут обращений владеет 200 000 нормализованных claims, которые не читает ни один другой роут; как зарегистрировать NgRx feature?
state-managementnormalization - 30
NgRx-effect заказов обрабатывает 50 команд в секунду и нуждается в текущей политике аккаунта; что положить в action, а что прочитать через concatLatestFrom?
state-management - 31
Дашборд пересчитывает view model на 50 000 строк при несвязанных actions; как переделать NgRx selectors?
state-management - 32
Десять экранов редактируют одних и тех же 300 000 клиентов по ID; хранить отдельные массивы для экранов или использовать NgRx Entity?
state-management - 33
SignalStore роута нужен аутентифицированный account из classic NgRx Store и локальное состояние выбора; как избежать двух источников истины?
state-managementsignals - 34
Pricing-фича из пяти компонентов имеет локальные фильтры, server requests и не имеет потребителей за пределами роута; вводить classic NgRx Store?
componentsstate-managementpricing - 35
У публичного Angular-магазина 2 миллиона посещений в месяц; какие точные Core Web Vitals сделать критериями релиза?
angularweb-vitals - 36
У клиентского портала shell размером 250 KB в сжатом виде и двенадцать lazy-роутов по 120 KB; обычно пользователь следующим открывает один из двух роутов, что предзагрузить?
- 37
Виджет отзывов ниже первого экрана весит 180 KB, и до него доходят только 30 процентов посетителей; какие @defer triggers выбрать?
- 38
Deferred-панель рекомендаций имеет высоту 420 px, а её placeholder сжимается до 40 px перед загрузкой; как предотвратить layout shift?
web-vitals - 39
На сайте 30 000 стабильных help-страниц, 2000 свежих публичных страниц товаров и приватный дашборд; какой modern @angular/ssr render mode назначить каждому семейству роутов?
ssrangular - 40
В server-rendered статье есть интерактивный опрос ниже первого экрана, и пользователь может нажать его до загрузки кода; как его гидратировать?
- 41
SSR-страница аккаунта делает три GET-запроса с пользовательскими данными; как не повторять их в браузере и не раскрыть данные другому пользователю?
ssr - 42
Server-rendered роут карты читает window при создании, а его HTML зависит от locale cookie; как сделать рендер детерминированным?
htmlcookies - 43
Provider приложения и provider поддерева компонента связывают один token; какой экземпляр должна получить директива внутри этого поддерева?
componentsdirectivestokens - 44
Четыре платёжных плагина должны регистрировать validators без импорта друг друга; как смоделировать DI-контракт и время жизни?
validation - 45
Сборка библиотеки проходит TypeScript, но шаблон потребителя передаёт string в number input; какие стадии компиляции Angular должны это найти?
angulartemplatestypescript - 46
Библиотека компонентов поддерживает три major-версии Angular, а потребители импортируют только 20 из 200 компонентов; как упаковать её для совместимости и tree shaking?
componentsangulartree-shaking - 47
Пять команд работают в одном Angular-репозитории, выпускаются вместе раз в неделю и не требуют независимого деплоя; вводить Module Federation?
angularfederationdeployment - 48
Host Module Federation деплоится раз в месяц, а три Angular remote ежедневно; какой version contract нужен для общих Angular-пакетов?
angularfederationdeployment - 49
В Nx workspace 60 Angular-проектов в billing, identity и catalog; как запретить UI-библиотекам обращаться к data-access другого домена?
angularmonorepo - 50
CI для 60 проектов Nx занимает 45 минут, хотя обычное изменение затрагивает две библиотеки; как использовать affected и cache без устаревших результатов?
monorepocaching - 51
На торговом экране число проверок компонентов за tick выросло с 1 400 до 9 200, а INP с 180 до 480 мс; production должен оставаться доступным во время диагностики. Что вы сделаете?
components - 52
Angular DevTools показывает проверку одной из 600 строк таблицы за 95 мс, но Chrome Performance фиксирует 260 мс на layout; в этом спринте можно менять только компонент строки. Как действовать?
componentsangularperformance - 53
После перевода 80 карточек на OnPush цены зависли у 7% пользователей, хотя WebSocket по-прежнему получает 20 сообщений в секунду; откатывать все 80 карточек нельзя. Как исправить?
websockets - 54
Live-grid на 12 000 строк после сортировки каждые 5 секунд падает с 55 до 18 fps, потому что @for использует track по $index; виртуализацию DOM нельзя выпустить в этом месяце. Что изменить?
griddomindexes - 55
Итог checkout показывает старую сумму 1 кадр после платёжного callback через 2 000 мс, а в development воспроизводится ExpressionChangedAfterItHasBeenCheckedError; добавлять setTimeout запрещено. Как исправить поток?
callbacks - 56
Heap растёт со 180 до 620 МБ после 30 переходов между двумя роутами, и каждый визит добавляет одного RxJS-подписчика; общий API-сервис должен остаться в root scope. Как найти и исправить утечку?
rxjsapidata-structures - 57
После 40 открытий и закрытий modal Chrome показывает 40 detached-деревьев dialog, а heap вырос на 96 МБ; библиотеку overlay нельзя заменить в этом релизе. Как локализовать проблему?
data-structures - 58
Route-сервис использует takeUntilDestroyed, но удерживает 25 компонентов редактора после 25 переходов, потому что его DestroyRef взят из кешируемого EnvironmentInjector роута; route reuse нужно сохранить. Что изменить?
componentsrxjscaching - 59
Отчёт размером 50 МБ остаётся в памяти через 15 минут после закрытия последнего viewer, потому что root-сервис использует shareReplay(1); новым viewers всё ещё нужен один кешированный результат на 60 секунд. Как переделать?
rxjscaching - 60
Каждое из 6 переподключений добавляет ещё один WebSocket, поэтому одна котировка приходит 7 раз; сервер разрешает только 1 соединение на аккаунт, а автоматический reconnect нужно сохранить. Как исправить владение?
ownershipwebsockets - 61
Релиз увеличил сжатый initial bundle с 310 до 690 КБ, а mobile LCP с 2,4 до 4,1 секунды; новый график должен остаться доступным сегодня. Как действовать?
- 62
Импорт utility размером 90 КБ превращается в 410 КБ в initial chunk, а LCP ухудшается на 0,9 секунды; заменять зависимость нельзя ещё 2 недели. Что проверить?
dependencies - 63
Lazy admin route добавил 280 КБ к initial bundle размером 420 КБ после одного изменения общего barrel, хотя его посещают только 3% сессий; URL роутов менять нельзя. Как восстановить split?
sessions - 64
Панель аналитики в @defer всё равно попадает в initial chunk размером 760 КБ и добавляет 1,2 секунды к LCP; trigger должен остаться on viewport. Почему split не сработал?
css - 65
Виджет отзывов на 240 КБ появляется через 4 секунды и создаёт CLS 0,22, когда @defer заменяет placeholder высотой 48 px; загружать его eagerly нельзя. Что изменить?
- 66
Zone.js запускает 1 100 ticks в минуту на dashboard, хотя UI затрагивают только 60 обновлений цены; таймер поставщика с периодом 50 мс удалить нельзя. Как сократить работу?
procurement - 67
После включения provideZonelessChangeDetection для 10% трафика callback карты обновляет координаты 8 раз в секунду, но marker зависает; глобально возвращать Zone.js нельзя. Что исправить?
callbacks - 68
Приложение на 140 роутов улучшило INP на 14% в zoneless-пилоте, но 9 из 70 сторонних workflows пропускают обновления; релизное окно составляет 3 недели. Продолжать?
change-detectiondependencies - 69
Hydration mismatch вырос с 0,1% до 6% в 24 SSR-локалях после релиза с форматированием времени и генерацией ID карточек; отключать SSR запрещено. Как сделать первый render детерминированным?
hydrationssr - 70
SSR-страница аккаунта при 200 запросах в секунду передаёт 3 API-ответа одного пользователя в другой запрос; TransferState должен по-прежнему предотвращать повторные browser fetches. Как изолировать данные?
ssrapi - 71
SSR-страница товара остаётся пустой у 12% мобильных пользователей, потому что constructor читает window, а график меняет DOM напрямую до hydration; график должен оставаться индексируемым. Что изменить?
domhydrationssr - 72
NgRx effect отправляет 24 запроса на 12 нажатий клавиш, а старый ответ перезаписывает новый результат; API менять нельзя. Какую гонку исправить?
state-managementapi - 73
Effect автосохранения теряет 3 из 10 изменений, потому что switchMap отменяет saves, а backend принимает только 1 запись одновременно и обязан сохранить каждую ревизию. Что использовать?
rxjs - 74
Одни и те же 80 000 товаров хранятся в NgRx Entity и feature SignalStore, удваивая heap до 340 МБ; 14 экранам нужны локальные фильтры, но одна каноническая цена. Как убрать дублирование?
state-managementsignalsdata-structures - 75
Selector для 60 000 заказов выполняется 420 раз при 1 изменении фильтра, потому что потребители создают selector factories в шаблонах; API компонентов нельзя менять в этом спринте. Как вернуть memoization?
componentstemplatesapi - 76
Оптимистичное удаление NgRx скрывает 1 из 500 счетов, API отвечает 409, но счёт не возвращается; заново запрашивать все 500 записей слишком дорого. Как выполнить rollback?
state-managementapilocking - 77
NgRx effect оплаты списывает деньги дважды после 2 быстрых кликов, потому что mergeMap запускает 2 запроса; UI должен оставаться отзывчивым, а обновление API будет только через 6 недель. Что изменить сейчас?
responsivestate-managementrxjs - 78
Один NgRx load action запускает 3 HTTP-запроса и 3 success actions после 4 входов в фичу; по правилам effects регистрируются только один раз. Как найти дублирование?
state-managementhttp - 79
Три вызова toSignal над одним cold-потоком отчёта создают 3 загрузки по 18 МБ; результат нужен 9 компонентам под одной route shell, а отмена при уходе shell должна сохраниться. Как исправить?
componentsresilience - 80
NgRx effect кеширует tenant ID при открытии фичи, а save action через 500 мс после переключения аккаунта пишет предыдущему клиенту; расширять контракт action в этом релизе нельзя. Как убрать устаревшее чтение?
state-managementcaching - 81
За 8 недель нужно перевести 120 роутов с NgModules на standalone, при этом один rollback может затрагивать не больше 2 роутов, а семантика providers не должна измениться. Как выстроить работу?
modulesstandalone-componentsmigrations - 82
После перевода 35 NgModules на standalone состояние checkout переживает 6 повторных входов в роут вместо сброса; rollback ограничен последними 5 модулями. Какую потерю семантики проверить?
modulesstandalone-componentsrollback - 83
За 10 недель нужно перевести RxJS-состояние 180 компонентов на signals, сохранив всю семантику отмены и ошибок и ограничив rollback 10 компонентами. Как спланировать?
componentsrxjssignals - 84
После миграции 20 поисковых компонентов на signals в 4 компонентах появляются устаревшие HTTP-результаты, потому что effect заменил switchMap; остальные 16 откатывать нельзя. Как исправить?
componentssignalsrxjs - 85
Module Federation remote на Angular 21 показывает пустой роут в host на Angular 20 для 18% сессий; remotes деплоятся ежедневно, а host ежемесячно. Как восстановить работу?
angularfederationdeployment - 86
Минифицированная production-сборка показывает пустой экран у 3 200 пользователей, но source maps доступны только error service, а rollback удалит 2 несвязанных исправления. Как локализовать сбой?
source-mapsbuildrollback - 87
Nx remote cache сообщает hit после изменения tsconfig paths, но 11 Angular-библиотек используют устаревший JavaScript, а 6 тестов ошибочно проходят; навсегда отключать cache нельзя. Что исправить?
angularmonorepocaching - 88
Nx affected пропускает 9 Angular-потребителей после изменения сгенерированной OpenAPI-схемы, сокращая CI с 28 до 9 минут, но выпуская устаревшие clients; цель 9 минут нужно сохранить. Как исправить граф?
angularmonoreposchema - 89
После обновления design system успешное завершение с клавиатуры упало с 92% до 61% в 14 dialogs из-за ухода focus; откатывать остальные 7 исправлений запрещено. Как устранить регрессию?
system-designdesignsoft-skills - 90
Zoneless-миграция сделала 37 из 1 800 async-тестов flaky, потому что они полагаются на fixture.whenStable(); возвращать Zone.js в production-код нельзя. Как мигрировать тесты?
flakyfixturesmigrations - 91
Middle-инженер предлагает memoization всех 260 компонентов после роста INP до 360 мс, но Angular DevTools показывает 8 400 проверок из-за 1 родительского signal; до релиза есть 2 парные сессии. Как его менторить?
componentsangularsignals - 92
Junior допустил 2 RxJS-утечки за 6 недель, а последняя удерживает 70 компонентов после навигации; на менторство можно потратить 3 часа, не забирая исправление себе. Что делать?
componentsrxjsmentoring - 93
Pull request меняет switchMap на mergeMap в 4 NgRx effects, и тесты проходят, но один медленный ответ может перезаписать новый поиск; review нужно завершить за 45 минут. Как действовать?
state-managementrxjssoft-skills - 94
Инженер впервые руководит standalone-миграцией 16 роутов, а пилот случайно поднял 3 providers в root; rollback должен оставаться в пределах 1 роута. Как помочь восстановлению?
standalone-componentsmigrationsrollback - 95
Reviewer одобрил dialog, который проходит 24 unit-теста, но удерживает keyboard focus только в 2 из 5 путей закрытия; релиз через 1 день, а визуальный редизайн запрещён. Что попросить исправить?
unit - 96
Новый автор тестов использует setTimeout(500) в 18 async-тестах, из-за чего flaky rate CI достиг 7%, а время выросло на 9 минут; фичу нужно merge за 2 дня. Как помочь и разблокировать?
mentoringasynctesting - 97
Pull request добавляет 330 КБ к initial bundle размером 460 КБ и ухудшает lab LCP на 1,4 секунды, но автор утверждает, что tree shaking исправит production; budget роута составляет 500 КБ. Какие доказательства нужны?
code-reviewtree-shaking - 98
Коллега исправляет 11 hydration mismatches, оборачивая random IDs в isPlatformBrowser, но SSR теперь показывает пустые карточки 4 секунды; patch должен сохранить SEO-контент. Как провести review и объяснить исправление?
hydrationssr - 99
Production-инцидент вызвал eager import, который втянул lazy-фичу на 270 КБ в shell, хотя изменение одобрили 6 reviewers; в этом квартале можно добавить только 1 автоматический guard. Какой?
incidentsrouting - 100
Три инцидента за 60 дней произошли из-за неверных RxJS flattening operators в 12 effects, а команда может потратить на профилактику только 1 день и не хочет запрещать mergeMap. Что внедрить?
rxjsincidents