# Питання співбесіди Angular 19: Signals, SSR і обов'язкові концепції
> Найпоширеніші питання співбесіди з Angular 19: Signals, інкрементальна гідратація, zoneless change detection і нові реактивні API з прикладами коду та очікуваними відповідями.
- Published: 2026-03-28
- Updated: 2026-05-04
- Author: Anthony Fillion-Maillet
- Tags: angular, interview, signals, ssr, angular-19
- Reading time: 9 min
---
Співбесіди з Angular у 2026 році виходять далеко за межі компонентів і сервісів. Angular 19, випущений у листопаді 2024 року, приніс фундаментальні архітектурні зміни: стабільні Signals, SSR з інкрементальною гідратацією та zoneless change detection. Опанування цих концепцій відрізняє мід-кандидатів від сеньйорів.
> **Що оцінюють інтерв'юери у 2026**
>
> Питання з Angular 19 фокусуються на трьох сферах: дрібнозерниста реактивність із Signals, продуктивність SSR через інкрементальну гідратацію та здатність проєктувати застосунки без Zone.js. Очікувані відповіді демонструють архітектурне розуміння, а не лише знання синтаксису.
## Angular 19 Signals: нова модель реактивності
Signals представляють найґрунтовнішу зміну в Angular з моменту запровадження change detection. Signal — це синхронне реактивне значення, яке автоматично сповіщає своїх споживачів про зміни.
**Типове питання: "У чому різниця між Signal і RxJS Observable?"**
Очікувана відповідь чітко розрізняє обидві моделі:
```typescript
// signals-vs-observables.ts
import { signal, computed, effect } from '@angular/core';
// Signal: synchronous, value always available
const count = signal(0);
const doubled = computed(() => count() * 2); // Recomputed only when count changes
// Effect: reacts to signal changes
effect(() => {
console.log(`Count: ${count()}, Doubled: ${doubled()}`);
});
count.set(5); // Immediate, synchronous notification
```
Signals використовують дрібнозернистий граф залежностей. На відміну від RxJS, який обробляє складні асинхронні робочі процеси (retry, debounce, merge), Signals оптимізують синхронну реактивність UI. Angular 19 рекомендує Signals для стану компонентів і RxJS для асинхронних потоків (HTTP-запити, WebSockets).
## Signal Inputs та Queries: міграція з @Input()
Angular 19 стабілізує signal-based API для inputs, outputs і queries. Це питання регулярно з'являється на співбесідах.
**Типове питання: "Як мігрувати класичний @Input() до Signal Input?"**
```typescript
// user-card.component.ts
import { Component, input, computed } from '@angular/core';
@Component({
selector: 'app-user-card',
template: `
{{ fullName() }}
{{ role() }}
`
})
export class UserCardComponent {
// Signal inputs: strict typing, optional default value
firstName = input.required();
lastName = input.required();
role = input('developer'); // Default value
// Computed derived from inputs: automatically recomputed
fullName = computed(() => `${this.firstName()} ${this.lastName()}`);
}
```
Ключова перевага: Signal Inputs дозволяють створювати значення `computed()` напряму, без lifecycle hooks. Більше не потрібен `ngOnChanges` для реакції на зміни input. Angular надає schematic `signal-input-migration` для автоматизації міграції.
## linkedSignal: синхронізація залежного стану
`linkedSignal` — експериментальне API Angular 19, що створює записуваний signal, прив'язаний до джерела. Ця концепція часто з'являється на сеньйорних співбесідах.
**Типове питання: "Як обробляти змінюваний похідний стан за допомогою linkedSignal?"**
```typescript
// product-filter.component.ts
import { signal, linkedSignal } from '@angular/core';
// Category list that can change
const categories = signal(['frontend', 'backend', 'devops']);
// Linked selection: resets when categories change
const selectedCategory = linkedSignal({
source: categories,
computation: (cats) => cats[0] // Reset to first element
});
// Manual modification still possible
selectedCategory.set('backend');
// When categories changes, selectedCategory resets automatically
categories.set(['mobile', 'data', 'cloud']);
// selectedCategory() === 'mobile'
```
Конкретний випадок використання: dropdown фільтра, вибір якого скидається при зміні джерельного списку. Без `linkedSignal` цей патерн вимагав `effect()` із `set()` — антипатерн, що створює цикли оновлення.
> **Пастка на співбесіді: effect() з set()**
>
> Виклик `signal.set()` всередині `effect()` — це антипатерн, який Angular виявляє. Фреймворк видає попередження в режимі розробки. Правильне рішення: використовувати `linkedSignal` або `computed()` залежно від того, чи має похідне значення бути записуваним.
## Resource API: завантаження асинхронних даних із Signals
Angular 19 представляє експериментальне API `resource` для асинхронного завантаження даних. Це API замінює класичний патерн service + subscribe у компонентах.
```typescript
// user-profile.component.ts
import { resource, signal } from '@angular/core';
import { inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
const userId = signal(42);
const http = inject(HttpClient);
// Resource: links a source signal to an async loader
const userResource = resource({
request: () => ({ id: userId() }), // Recomputed when userId changes
loader: async ({ request }) => {
const response = await fetch(`/api/users/${request.id}`);
return response.json();
}
});
// Access in template
// userResource.value() -> data (or undefined)
// userResource.isLoading() -> boolean
// userResource.error() -> error if any
```
Демонстрація знання `resource` versus `rxResource` (RxJS-версія) на співбесіді свідчить про активне технологічне відстеження. `rxResource` використовує Observables як loader, що корисно для команд із наявною кодовою базою RxJS.
## SSR та інкрементальна гідратація в Angular 19
Angular 19 виводить SSR на новий рівень з інкрементальною гідратацією у developer preview. Ця функція, протестована у [масштабах Google Search](https://blog.angular.dev/meet-angular-v19-7b29dfd05b84), стає дедалі частішою темою співбесід.
**Типове питання: "Як працює інкрементальна гідратація в Angular 19?"**
Класична гідратація відтворює все дерево компонентів на стороні клієнта після серверного рендерингу. Інкрементальна гідратація гідратує лише необхідні компоненти, у момент, коли вони стають видимими або інтерактивними.
```typescript
// product-page.component.ts
import { Component } from '@angular/core';
@Component({
template: `
@defer (on viewport) {
}
@defer (on interaction) {
}
`
})
export class ProductPageComponent {
productId = 'angular-19-guide';
}
```
Директива `@defer` точно контролює момент гідратації. Доступні тригери: `on viewport` (видимий), `on interaction` (клік, focus), `on idle` (браузер у простої), `on timer(5s)` (затримка). Контент залишається видимим як статичний HTML до гідратації, без блимання.
## Render mode на рівні маршруту: гранульований SSR за маршрутом
Angular 19 представляє render mode на рівні маршруту, що дозволяє співіснувати SSR, SSG і CSR в межах одного застосунку.
```typescript
// app.routes.server.ts
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
// Marketing pages: pre-rendered at build time (SSG)
{ path: '', renderMode: RenderMode.Prerender },
{ path: 'pricing', renderMode: RenderMode.Prerender },
// Dashboard: server-rendered on each request (SSR)
{ path: 'dashboard/**', renderMode: RenderMode.Server },
// Interactive editor: client-side only (CSR)
{ path: 'editor/**', renderMode: RenderMode.Client },
];
```
На співбесідах здатність обґрунтувати вибір render mode для маршруту демонструє розуміння компромісів між продуктивністю, SEO та інтерактивністю. Статичні сторінки (landing, blog) виграють від prerender. Динамічні сторінки з даними користувача використовують SSR. Високоінтерактивні застосунки залишаються на CSR.
## Zoneless change detection: архітектура без Zone.js
Zoneless change detection — найзначніша архітектурна еволюція Angular 19. Це питання стало обов'язковим на сеньйорних співбесідах.
**Типове питання: "Як працює change detection без Zone.js?"**
```typescript
// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import {
provideExperimentalZonelessChangeDetection
} from '@angular/core';
import { AppComponent } from './app.component';
bootstrapApplication(AppComponent, {
providers: [
provideExperimentalZonelessChangeDetection()
]
});
```
Без Zone.js Angular більше не патчить асинхронні API браузера (setTimeout, Promise, addEventListener). Change detection запускається виключно через Signals. Вимірні переваги:
- Зменшення розміру bundle на 10-15 KB (zone.js видалено)
- Чисті stack trace без фреймів Zone.js
- Цільова change detection: лише компоненти, на які впливає змінений Signal, перевідрендерюються
> **Angular 20.2: zoneless стає стабільним**
>
> З Angular 20.2 zoneless-режим стабільний з `provideZonelessChangeDetection()` (без префікса Experimental). Згадка цього прогресу на співбесіді демонструє активне відстеження екосистеми.
## Standalone за замовчуванням: кінець NgModules
Angular 19 робить standalone-компоненти поведінкою за замовчуванням. Прапор `standalone: true` більше не потрібен. Це рішення спрощує архітектуру і зменшує шаблонний код.
**Типове питання: "Який вплив standalone-by-default на архітектуру Angular-застосунку?"**
```typescript
// dashboard.component.ts
@Component({
selector: 'app-dashboard',
imports: [CommonModule, RouterModule, UserCardComponent],
template: `
@for (user of users(); track user.id) {
}
`
})
export class DashboardComponent {
users = signal([]);
}
```
Кожен компонент явно декларує свої залежності через `imports`. NgModules залишаються доступними для зворотної сумісності, але нові застосунки Angular 19+ більше їх не потребують. На співбесідах цінується вміння пояснити інкрементальну міграцію (компонент за компонентом) замість підходу big bang.
## Стратегії відповідей на співбесідах з Angular 19
Технічні інтерв'юери оцінюють три виміри щодо Angular 19:
- **Архітектурне розуміння**: пояснення, чому Signals поступово замінюють Zone.js, а не лише як їх використовувати
- **Компроміси**: знання, коли використовувати `computed()` versus `linkedSignal` versus `effect()` і коли зберегти RxJS
- **Міграція**: опис інкрементальної стратегії міграції з класичного Angular-застосунку до Signals і zoneless-режиму
Ключ: уникати декламування [офіційної документації Angular](https://angular.dev). Кожна відповідь має бути проілюстрована конкретним випадком використання з реального проєкту, складною формою, e-commerce-сторінкою з SSR, дашбордом у реальному часі.
Для фундаментальних концепцій Angular перед співбесідою див. [повний посібник з 25 питань співбесіди Angular](/blog/angular/top-25-angular-interview-questions).
## Висновок
- Angular 19 Signals замінюють патерни `@Input()` + `ngOnChanges` дрібнозернистою синхронною реактивною моделлю. `signal()`, `computed()` та `input()` покривають 90% випадків використання
- `linkedSignal` вирішує змінюваний похідний стан без звернення до антипатерну `effect()` + `set()`
- Інкрементальна гідратація через `@defer` зменшує Time to Interactive без жертвування SEO. Кожен компонент гідратується відповідно до свого тригера
- Zoneless-режим прибирає Zone.js з bundle і націлює change detection лише на компоненти, на які впливає Signal
- Render mode на рівні маршруту дозволяє змішувати SSG, SSR і CSR в одному застосунку залежно від потреб кожної сторінки
- Компоненти standalone-by-default усувають потребу в NgModules у нових застосунках
- На співбесідах демонстрація компромісів (Signals vs RxJS, SSR vs CSR, zoneless vs Zone.js) важливіша за синтаксис
---
Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack.
HTML version of this page: https://sharpskill.dev/uk/blog/angular/angular-19-interview-questions-signals-ssr-must-know