--- name: angular-best-practices-v20 description: Angular 20+ performance optimization guidelines with Signals, httpResource, signal inputs/outputs, @defer, and native control flow (@if, @for). Use when writing, reviewing, or refactoring modern Angular code. Triggers on tasks involving Angular components, services, data fetching, bundle optimization, or performance improvements. license: MIT metadata: author: community version: "2.0.0" --- # Angular Best Practices (v20+) Comprehensive performance optimization guide for Angular 20+ applications with modern features like Signals, httpResource, signal inputs/outputs, @defer blocks, and native control flow syntax. Contains 35+ rules across 8 categories, prioritized by impact to guide automated refactoring and code generation. ## When to Apply Reference these guidelines when: - Writing new Angular 20+ components - Using Signals for reactive state (signal, computed, linkedSignal, effect) - Using httpResource/resource for data fetching - Using signal inputs/outputs instead of decorators - Implementing @defer for lazy loading - Using native control flow (@if, @for, @switch) - Implementing SSR with incremental hydration - Reviewing code for performance issues ## Key Features (v20+) - **Signals** - Fine-grained reactivity (signal, computed, linkedSignal, effect) - **httpResource** - Signal-based HTTP with automatic loading states - **Signal inputs/outputs** - input(), output() replacing decorators - **@defer** - Template-level lazy loading with hydration triggers - **@for / @if** - Native control flow with required track - **Standalone by default** - No standalone: true needed - **Host bindings** - host object instead of @HostBinding decorators - **Functional interceptors** - Simpler HTTP interceptors - **takeUntilDestroyed** - Built-in subscription cleanup - **Incremental hydration** - @defer (hydrate on ...) for SSR ## Rule Categories by Priority | Priority | Category | Impact | Prefix | |----------|----------|--------|--------| | 1 | Change Detection | CRITICAL | `change-` | | 2 | Bundle & Lazy Loading | CRITICAL | `bundle-` | | 3 | RxJS Optimization | HIGH | `rxjs-` | | 4 | Template Performance | HIGH | `template-` | | 5 | Dependency Injection | MEDIUM-HIGH | `di-` | | 6 | HTTP & Caching | MEDIUM | `http-` | | 7 | Forms Optimization | MEDIUM | `forms-` | | 8 | General Performance | LOW-MEDIUM | `ssr-` | ## Quick Reference ### 1. Change Detection (CRITICAL) - `change-signals` - Use Signals instead of BehaviorSubject for reactive state - `change-onpush` - Use OnPush change detection strategy - `change-detach-reattach` - Detach change detector for heavy operations - `change-run-outside-zone` - Run non-UI code outside NgZone - `component-signal-io` - Use signal inputs/outputs instead of @Input/@Output decorators - `signal-computed-pure` - Keep computed() pure, no side effects - `signal-effect-patterns` - Use effect() correctly, avoid anti-patterns - `signal-linkedsignal` - Use linkedSignal for derived + writable state ### 2. Bundle & Lazy Loading (CRITICAL) - `bundle-standalone` - Use standalone components (default in v20+) - `bundle-lazy-routes` - Lazy load routes with loadComponent/loadChildren - `bundle-defer` - Use @defer blocks for heavy components - `bundle-preload` - Preload routes on hover/focus for perceived speed - `bundle-no-barrel-imports` - Avoid barrel files, use direct imports ### 3. RxJS Optimization (HIGH) - `rxjs-async-pipe` - Use async pipe instead of manual subscriptions - `rxjs-takeuntil` - Use takeUntilDestroyed for automatic cleanup - `rxjs-share-replay` - Share observables to avoid duplicate requests - `rxjs-operators` - Use efficient RxJS operators - `rxjs-mapping-operators` - Use correct mapping operators (switchMap vs exhaustMap) - `rxjs-no-nested-subscribe` - Avoid nested subscriptions ### 4. Template Performance (HIGH) - `template-trackby` - Use track function in @for loops (required in v20+) - `template-pure-pipes` - Use pure pipes for expensive transformations - `template-ng-optimized-image` - Use NgOptimizedImage for image optimization - `template-no-function-calls` - Avoid function calls in templates - `template-virtual-scroll` - Use virtual scrolling for large lists ### 5. Dependency Injection (MEDIUM-HIGH) - `di-provided-in-root` - Use providedIn: 'root' for singleton services - `di-injection-token` - Use InjectionToken for non-class dependencies - `di-factory-providers` - Use factory providers for complex initialization - `directive-host-composition` - Use hostDirectives for composition ### 6. HTTP & Caching (MEDIUM) - `http-resource` - Use httpResource/resource for signal-based data fetching - `http-interceptors` - Use functional interceptors for cross-cutting concerns - `http-transfer-state` - Use TransferState for SSR hydration - `routing-signal-inputs` - Use signal-based route inputs ### 7. Forms Optimization (MEDIUM) - `forms-reactive` - Use reactive forms with typed FormGroup ### 8. General Performance (LOW-MEDIUM) - `ssr-hydration` - Use incremental hydration with @defer (hydrate on ...) - `perf-memory-leaks` - Prevent memory leaks (timers, listeners, subscriptions) - `perf-web-workers` - Offload heavy computation to Web Workers - `arch-smart-dumb-components` - Use Smart/Dumb component pattern ## How to Use Read individual rule files for detailed explanations and code examples: ``` rules/change-signals.md rules/bundle-defer.md rules/http-resource.md ``` Each rule file contains: - Brief explanation of why it matters - Incorrect code example with explanation - Correct code example with explanation - Additional context and references ## Full Compiled Document For the complete guide with all rules expanded: `AGENTS.md`