Skillshub angular-ssr
Hydration, TransferState, and Prerendering standards. Use when implementing Angular Universal SSR, hydration, or static prerendering. (triggers: **/*.server.ts, server.ts, hydration, transferState, afterNextRender, isPlatformServer, RenderMode)
install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/HoangNguyen0403/agent-skills-standard/angular-ssr" ~/.claude/skills/comeonoliver-skillshub-angular-ssr && rm -rf "$T"
manifest:
skills/HoangNguyen0403/agent-skills-standard/angular-ssr/SKILL.mdsource content
SSR (Server-Side Rendering)
Priority: P2 (MEDIUM)
Principles
- Hydration: Run ng add @angular/ssr. In
add provideClientHydration(withEventReplay()) to providers. This enables full app hydration where Angular reuses server-rendered DOM instead of wiping and re-rendering on the client.app.config.ts - Platform Checks: Use afterNextRender(() => { /_ window access _/ }) or
for browser-only code (e.g., accessing window, document, or localStorage). For recurring access, inject PLATFORM_ID and check isPlatformBrowser(platformId).afterRender - TransferState: Use withHttpTransferCacheOptions() or manual TransferState service to prevent double-fetching by caching server responses for client replay.
Render Modes (Angular 17+)
Configure per-route via app.routes.server.ts by exporting ServerRoute[]:
- RenderMode.Prerender — Static HTML at build time (blogs, marketing)
- RenderMode.Server — Dynamic SSR per request (user-specific pages)
- RenderMode.Client — Client-only SPA (authenticated dashboards)
Incremental Hydration (Angular 19+)
Defer hydration of heavy components using @defer (hydrate on viewport):
- Triggers:
,viewport
,interaction
,idle
,timer(ms)
,immediatenever - Add withEventReplay() to
to capture user events before hydration completes.provideClientHydration()
Guidelines
- Browser Objects: Never access window directly in component logic. Implement abstractions or use
.afterNextRender - Prerendering: Use
in server routes to enumerate dynamic slugs.getPrerenderParams()
Anti-Patterns
- No direct window/document access: Use
orafterNextRender()
check for browser APIs.PLATFORM_ID - No double-fetching: Use
orwithHttpTransferCacheOptions()
to avoid re-fetching on client.TransferState - No SSR for auth-gated pages: Set
for authenticated dashboards.RenderMode.Client