Angular Best Practices
Comprehensive performance optimization and modern Angular guide, containing 55+ rules across 12 categories, prioritized by impact to guide automated refactoring and code generation.
When to Apply
Reference these guidelines when:
- Writing new Angular components or services
- Implementing change detection strategies
- Reviewing code for performance issues
- Refactoring existing Angular code
- Optimizing bundle size or load times
- Working with RxJS observables and state management
- Implementing forms and validation
- Writing unit and integration tests
Rule Categories by Priority
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Signals & Reactivity | CRITICAL | signals- |
| 2 | Change Detection | CRITICAL | cd- |
| 3 | Bundle Size Optimization | CRITICAL | bundle- |
| 4 | Template Performance | HIGH | template- |
| 5 | RxJS & Async Operations | HIGH | rxjs- |
| 6 | Component Architecture | HIGH | component- |
| 7 | Dependency Injection | HIGH | di- |
| 8 | Routing & Navigation | MEDIUM | routing- |
| 9 | HTTP & Data Fetching | MEDIUM | http- |
| 10 | Forms & Validation | MEDIUM | forms- |
| 11 | Accessibility | MEDIUM | a11y- |
| 12 | Testing & Debugging | MEDIUM | testing- |
| 13 | Tooling | MEDIUM | tooling- |
Quick Reference
1. Signals & Reactivity (CRITICAL)
signals-overview- Use signals for reactive state managementsignals-linked-signal- Use linkedSignal for dependent writable statesignals-resource- Use resource for async data fetchingsignals-effects- Use effects only for side effects, never for state sync
2. Change Detection (CRITICAL)
cd-onpush- Use OnPush change detection strategycd-trackby- Always use trackBy in *ngForcd-pure-pipes- Prefer pure pipes over methods in templatescd-immutable-data- Use immutable data patternscd-detach-reattach- Detach change detection for heavy computationscd-run-outside-angular- Run non-UI code outside NgZone
3. Bundle Size Optimization (CRITICAL)
bundle-lazy-loading- Lazy load feature modulesbundle-tree-shaking- Ensure tree-shakeable providersbundle-standalone-components- Use standalone componentsbundle-defer-views- Use @defer for heavy componentsbundle-preload-strategies- Implement smart preloadingbundle-avoid-barrel-exports- Import directly, avoid barrel files
4. Template Performance (HIGH)
template-avoid-function-calls- Avoid function calls in templatestemplate-async-pipe- Use async pipe instead of manual subscriptionstemplate-ng-container- Use ng-container for structural directivestemplate-control-flow- Use new control flow syntax (@if, @for)template-optimize-ngif-ngfor- Never use *ngIf and *ngFor on same elementtemplate-image-optimization- Use NgOptimizedImage directive
5. RxJS & Async Operations (HIGH)
rxjs-avoid-nested-subscriptions- Never nest subscriptionsrxjs-unsubscribe- Always unsubscribe (takeUntilDestroyed, DestroyRef)rxjs-share-replay- Use shareReplay for HTTP cachingrxjs-switchmap-vs-mergemap- Choose correct flattening operatorrxjs-signals-vs-observables- Prefer signals for synchronous staterxjs-debounce-throttle- Debounce user input events
6. Component Architecture (HIGH)
component-smart-presentational- Separate smart and presentational componentscomponent-signal-inputs- Use signal-based inputs and outputscomponent-input-transforms- Use input transforms for data conversioncomponent-output-naming- Follow output naming conventionscomponent-content-projection- Use content projection effectivelycomponent-dynamic-components- Load components dynamically when neededcomponent-host-directives- Compose behavior with host directives
7. Dependency Injection (HIGH)
di-inject-function- Use inject() function over constructor injection
8. Routing & Navigation (MEDIUM)
routing-guards- Use functional route guardsrouting-rendering-strategies- Choose correct rendering strategy (CSR/SSR/SSG)
9. HTTP & Data Fetching (MEDIUM)
http-interceptors- Use interceptors for cross-cutting concernshttp-caching- Implement HTTP caching strategieshttp-retry-logic- Add retry logic for resiliencehttp-cancel-requests- Cancel pending requests on navigationhttp-typed-responses- Always type HTTP responseshttp-error-handling- Implement centralized error handling
10. Forms & Validation (MEDIUM)
forms-signal-forms- Use signal forms for Angular v21+ appsforms-reactive-over-template- Prefer reactive forms for complex formsforms-typed-forms- Use strictly typed reactive formsforms-custom-validators- Create reusable custom validatorsforms-async-validation- Debounce async validatorsforms-control-value-accessor- Implement ControlValueAccessor correctlyforms-form-arrays- Handle dynamic form arrays efficiently
11. Accessibility (MEDIUM)
a11y-angular-aria- Use Angular Aria for accessible components
12. Testing & Debugging (MEDIUM)
testing-zoneless-async- Use zoneless async-first testing patterntesting-component-harness- Use component harnessestesting-mock-services- Mock services properlytesting-async-testing- Use fakeAsync/tick for async teststesting-change-detection- Trigger change detection in teststesting-marble-testing- Use marble testing for RxJStesting-performance-profiling- Profile with Angular DevTools
13. Tooling (MEDIUM)
tooling-cli-generate- Use Angular CLI for code generation and dependencies
How to Use
Read individual rule files for detailed explanations and code examples:
rules/cd-onpush.md
rules/bundle-lazy-loading.md
rules/_sections.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