Senior Angular Frontend — питання на співбесіді Angular
Senior · 5+ років досвіду
Співбесіда Angular охоплює впровадження залежностей, RxJS, change detection і TypeScript — фреймворк суворий, тому питання перевіряють, чи розумієте ви його механіку. Нижче — найчастіші з еталонними відповідями. Senior: архітектуру, трейд-офи, менторство та прийняття рішень.
Теми для підготовки
✓Dependency Injection
✓RxJS та Observables
✓Change Detection
✓Модулі й компоненти
✓Реактивні форми
✓TypeScript
6 питань рівня Senior з відповідями
1
Поясніть change detection. Чим OnPush відрізняється від Default?
Відповідь
Change detection обходить дерево компонентів після подій, таймерів або HTTP-відповідей і перемальовує змінені привʼязки. Default перевіряє кожен компонент на кожному циклі. OnPush перевіряє компонент лише коли змінилося посилання у вхідній властивості, всередині сталася подія або async pipe видав значення — тому OnPush вимагає імутабельних даних: зміна обʼєкта на місці не змінює посилання, і подання не оновиться.
2
Що таке map, switchMap і mergeMap? У чому різниця?
Відповідь
map перетворює кожне значення, що надійшло. switchMap і mergeMap розгортають вкладений observable: switchMap скасовує попередню внутрішню підписку при надходженні нового значення, mergeMap виконує всі паралельно. switchMap беруть для пошуку або навігації, де важливий лише останній результат, mergeMap — коли кожен запит зобовʼязаний завершитися, а concatMap — коли важливий порядок.
3
Що таке ngOnInit і чим він відрізняється від конструктора?
Відповідь
Конструктор виконується при створенні екземпляра класу, до того як Angular заповнив вхідні привʼязки, тому там вхідні властивості ще undefined. ngOnInit виконується після першого проходу привʼязок, і саме туди належить ініціалізація, що залежить від входів. За домовленістю конструктор лише приймає впроваджені залежності, а реальну підготовку робить ngOnInit.
4
У чому різниця між template-driven і reactive формами?
Відповідь
Template-driven форми будують модель неявно з директив у шаблоні й підходять для простих випадків. Reactive форми описують FormGroup у класі компонента, завдяки чому валідація, динамічні контроли й тестування стають явними та типобезпечними. Reactive рекомендують за замовчуванням для всього складнішого за форму логіну, бо стан форми живе в коді, де про нього можна міркувати.
5
Як уникнути витоків памʼяті при роботі з Observable?
Відповідь
Підписка, яку не закрили, утримує свій колбек і захоплену область видимості живими й після знищення компонента. Найчистіше рішення — async pipe, який підписується й відписується сам. Інакше застосовують takeUntilDestroyed або збирають підписки й відписуються в ngOnDestroy — типова похибка це довгоживучий потік на кшталт подій роутера або вебсокета.
6
Що таке pipe? Як створити свій?
Відповідь
Pipe перетворює значення для відображення в шаблоні, утримуючи форматування поза класом компонента. Свій створюється декоратором @Pipe і методом transform. За замовчуванням pipe чистий, тобто Angular перераховує його лише при зміні посилання на вхід, і це робить його дешевим — позначка pipe як impure змушує виконувати його на кожному циклі change detection і має бути крайнім заходом.
🦎
Прочитати відповіді недостатньо
На співбесіді ти говориш вголос під тиском. Кем поставить ті самі питання, оцінить кожну відповідь і покаже, що саме підтягнути.