Skillshub angular-performance
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/Gentleman-Programming/Gentleman-Skills/performance" ~/.claude/skills/comeonoliver-skillshub-angular-performance && rm -rf "$T"
manifest:
skills/Gentleman-Programming/Gentleman-Skills/performance/SKILL.mdsource content
NgOptimizedImage (REQUIRED for images)
import { NgOptimizedImage } from '@angular/common'; @Component({ imports: [NgOptimizedImage], template: ` <!-- LCP image: add priority --> <img ngSrc="hero.jpg" width="800" height="400" priority> <!-- Regular: lazy loaded by default --> <img ngSrc="thumb.jpg" width="200" height="200"> <!-- Fill mode (parent needs position: relative) --> <img ngSrc="bg.jpg" fill> <!-- With placeholder --> <img ngSrc="photo.jpg" width="400" height="300" placeholder> ` })
Rules
- ALWAYS set
andwidth
(orheight
)fill - Add
to LCP (Largest Contentful Paint) imagepriority - Use
notngSrcsrc - Parent of
image must havefillposition: relative/fixed/absolute
@defer - Lazy Components
@defer (on viewport) { <heavy-component /> } @placeholder { <p>Placeholder shown immediately</p> } @loading (minimum 200ms) { <spinner /> } @error { <p>Failed to load</p> }
Triggers
| Trigger | When to Use |
|---|---|
| Below the fold content |
| Load on click/focus/hover |
| Load when browser is idle |
| Load after delay |
| Load when expression is true |
<!-- Multiple triggers --> @defer (on viewport; on interaction) { <comments /> } <!-- Conditional --> @defer (when showComments()) { <comments /> }
Lazy Routes
// Single component { path: 'admin', loadComponent: () => import('./features/admin/admin').then(c => c.AdminComponent) } // Feature with child routes { path: 'users', loadChildren: () => import('./features/users/routes').then(m => m.USERS_ROUTES) }
SSR & Hydration
bootstrapApplication(AppComponent, { providers: [ provideClientHydration() ] });
| Scenario | Use |
|---|---|
| SEO critical (blog, e-commerce) | SSR |
| Dashboard/Admin | CSR |
| Static marketing site | SSG/Prerender |
Slow Computations
| Solution | When |
|---|---|
| Optimize algorithm | First choice always |
| Pure pipes | Cache single result |
| Memoization | Cache multiple results |
| Derived signal state |
NEVER trigger reflows/repaints in lifecycle hooks (
ngOnInit, ngAfterViewInit).