Using deferrable views, we can load cards only when they're about to enter the viewport, significantly improving initial load time and memory usage.
on viewport: Loads when element enters viewport @defer (on viewport) { content }on idle: Loads when browser is idle @defer (on idle) { content }on immediate: Loads as soon as possible @defer (on immediate) { content }on hover: Loads when user hovers over placeholder @defer (on hover) { content }on interaction: Loads on any user interaction with placeholder @defer (on interaction) { content }when: Loads when condition is true @defer (when isReady) { content }@defer (on viewport; on hover) { content }@defer (on viewport; prefetch on idle) { content }@defer (minimum 300ms) { content }@defer (after hero-section) { content }
<div class="cards-container">
@for (card of cards; track card.id) {
@defer (on viewport; prefetch on idle) {
<div class="card">
<img [ngSrc]="card.imageUrl">
</div>
} @placeholder {
<div class="card placeholder">
<div class="placeholder-content"></div>
</div>
}
}
</div>
Scroll down slowly and watch the network tab. Notice how images are only loaded as they enter the viewport.
Total Cards: 100
Cards are loaded as you scroll!