Питання на співбесіді з Angular з відповідями
Компоненти, шаблони й control flow, сигнали, DI, RxJS, роутинг, форми, change detection, SSR і NgRx.
225 запитань для співбесіди з теми Angular з відповідями й поясненнями - рівні Junior, Middle і Senior. Приклади запитань, онлайн-тести й задачі на код.
- Signals
- RxJS
- DI
- Router
- Forms
- NgRx
Запитання за рівнями
Junior
Базові поняття та синтаксис · 50 запитань
Middle
Практика, нюанси й оптимізація · 50 запитань
Senior
Архітектура, внутрішня будова, edge cases · 50 запитань
Приклади запитань
Кілька запитань із кожного рівня з правильною відповіддю й поясненням.
Angular · Junior
- Що таке Angular?
Правильна відповідь: Повноцінний TypeScript-фреймворк від Google: компоненти, DI, роутинг, форми та HTTP з коробки
Angular - фреймворк «усе включено»: роутер, форми, HTTP-клієнт, DI, інструменти тестування й CLI підтримує команда Angular. React натомість - бібліотека рендерингу, навколо якої стек збирають самостійно.
- Яка команда створює новий проєкт Angular?
Правильна відповідь:
ng new my-appAngular CLI (
npm install -g @angular/cli) створює проєкт черезng new, запускає dev-сервер черезng serve, генерує код черезng generate component nameі збирає черезng build. - Що означає
standaloneдля компонента Angular?Правильна відповідь: Компонент сам оголошує залежності в
imports, а не належить до NgModuleStandalone-компоненти перелічують використані компоненти, директиви й пайпи в
imports. Починаючи з Angular 19 компоненти standalone за замовчуванням; NgModule досі підтримуються, але вже не обов'язкові. - Як запускається standalone-застосунок Angular?
Правильна відповідь:
bootstrapApplication(App, appConfig)уmain.tsbootstrapApplicationрендерить кореневий компонент і приймаєApplicationConfigзproviders, наприкладprovideRouter(routes)іprovideHttpClient().bootstrapModule- старий спосіб на основі NgModule.
Angular · Middle
- Що змінюється, коли компонент використовує
ChangeDetectionStrategy.OnPush?Правильна відповідь: Angular перевіряє його, лише коли він позначений: змінилося посилання у вході, він чи нащадок обробив подію, змінився прочитаний сигнал або
asyncвидав значенняЗа стратегії за замовчуванням кожен компонент перевіряється під час кожного запуску change detection. OnPush пропускає цілі піддерева, які не були позначені, - це головна оптимізація продуктивності в застосунках на Zone.js.
- Коли потрібен
ChangeDetectorRef.markForCheck()?Правильна відповідь: В OnPush-компоненті, коли стан змінюється без відома Angular, наприклад ручний
subscribeприсвоює звичайне полеmarkForCheckпозначає компонент і його предків, щоб їх перевірили під час наступного запуску. Пайпasyncі сигнали роблять це автоматично, тому вони кращі за ручні підписки. - Що означає
ExpressionChangedAfterItHasBeenCheckedError?Правильна відповідь: Прив'язане значення змінилося в тому самому проході change detection після його перевірки (виявляється лише в dev-режимі)
У розробці Angular виконує повторну перевірку, щоб переконатися, що дані течуть в один бік. Зазвичай причина - зміна стану батька в
ngAfterViewInitнащадка або гетери, що щоразу повертають нові значення. Виправте потік даних, а не ховайте помилку черезsetTimeout. - Чим сигнали покращують change detection порівняно зі звичайними полями?
Правильна відповідь: Angular точно знає, які шаблони читають змінений сигнал, і позначає для оновлення лише ці компоненти
Сигнал, прочитаний у шаблоні, реєструє представлення як споживача. За зміни сигналу це представлення позначається брудним - навіть в OnPush-компоненті, - без розрахунку на те, що Zone.js вгадає, що щось могло змінитися.
Angular · Senior
- Як Zone.js повідомляє Angular, коли запускати change detection?
Правильна відповідь: Він патчить асинхронні API браузера (події, таймери, проміси, XHR) і сповіщає Angular про завершення задачі, що запускає
ApplicationRef.tick()Zone.js не знає, *що* змінилося, - лише що завершилася асинхронна робота, тому Angular перевіряє дерево від кореня (пропускаючи непозначені OnPush-піддерева). Це просто, але може давати багато зайвих перевірок.
- Як увімкнути zoneless change detection?
Правильна відповідь: Додати
provideZonelessChangeDetection()у провайдери застосунку й прибратиzone.jsз polyfillsВ останніх версіях Angular нові проєкти за замовчуванням створюються zoneless. Відмова від Zone.js зменшує бандл, робить стектрейси чистішими й позбавляє зайвих перевірок.
- Що з переліченого в zoneless-застосунку НЕ запускає change detection?
Правильна відповідь: Колбек
setTimeout, що присвоює нове значення звичайному полю класуБез Zone.js Angular спирається на явні сповіщення: зміни сигналів,
markForCheck()(його використовує йasync),ComponentRef.setInput, слухачі шаблону/host і під'єднання брудних представлень. Зміна звичайного поля в таймері лишається непоміченою. - Який стиль компонентів уже сумісний із zoneless change detection?
Правильна відповідь: OnPush-компоненти, чий стан живе в сигналах або проходить через
async/markForCheckЯкщо компонент коректно працює з OnPush, він найімовірніше готовий до zoneless. API на кшталт
NgZone.onStable/onMicrotaskEmptyбез Zone.js не спрацьовують - їх замінюють наafterNextRenderабо сигнали.
Збірні тести з цією темою
Запитання з кількох тем одразу - як на співбесіді на конкретну вакансію.
Задачі на код
Напишіть рішення просто в браузері - тести перевірять його одразу. Класика співбесід: debounce, throttle, deepClone, Promise.all, EventEmitter, LRU-кеш та інші.
Відкрити задачі →