Think about how Angular preserves the server HTML but makes it interactive.
Hydration means Angular reuses the server-rendered HTML and attaches event listeners so the app becomes interactive without re-rendering the whole page.
export class CounterComponent { count = 5; increment() { this.count++; } } // Server rendered with count=5, then hydrated on client.
Hydration preserves the initial state from the server.
Angular hydration keeps the initial property values as rendered on the server, so count stays 5 until user changes it.
Look for elements rendered on client but missing on server or vice versa.
Having an element with *ngIf="false" on client but missing on server causes DOM mismatch, breaking hydration.
export class AppComponent { data: string | null = null; ngOnInit() { fetch('/api/data').then(res => res.text()).then(text => this.data = text); } } // Server renders with data=null, client fetches data after hydration.
Think about when the DOM is generated on server vs client.
Server renders with data=null, so the DOM is missing the fetched content. Client updates data after hydration, causing mismatch and error.
Consider how Angular makes the static server HTML interactive without rebuilding it.
Angular attaches event listeners to existing DOM elements during hydration to avoid re-creating the DOM and improve performance.