Aller au contenu principal

Lab 21 : Vues différables (@defer)

📖 Ressources

🚀 Code de départ

step-18-album-wholesale-v21-post-signal-form

Dans ce lab, vous utiliserez le bloc @defer d'Angular pour charger des composants lourds uniquement lorsqu'ils sont réellement nécessaires. Vous explorerez les différents types de déclencheurs et observerez l'impact réseau dans les DevTools du navigateur.

📝 Instructions

Étape 1 : Identifier un composant lourd

Trouvez un composant dans l'application qui est rendu sous la ligne de flottaison et qui est relativement coûteux à afficher (ex. : AlbumDetailComponent, un graphique, ou CartSummaryComponent).

Étape 2 : Envelopper le composant avec @defer

Remplacez la référence directe dans le template par un bloc @defer :

<!-- Avant -->
<app-album-detail [album]="selected" />

<!-- Après -->
@defer {
<app-album-detail [album]="selected" />
} @loading {
<p>Chargement des détails…</p>
} @placeholder {
<div class="placeholder-box">Survolez pour prévisualiser</div>
} @error {
<p>Impossible de charger le composant.</p>
}

Étape 3 : Expérimenter avec les déclencheurs

Testez chaque déclencheur en modifiant la ligne @defer :

<!-- Charger quand le navigateur est inactif -->
@defer (on idle) { ... }

<!-- Charger quand le bloc entre dans le viewport -->
@defer (on viewport) { ... }

<!-- Charger quand l'utilisateur clique sur un bouton -->
<button #loadBtn>Charger les détails</button>
@defer (on interaction(loadBtn)) { ... }

<!-- Charger quand l'utilisateur survole -->
@defer (on hover(loadBtn)) { ... }

<!-- Charger après un délai fixe -->
@defer (on timer(3s)) { ... }

<!-- Charger immédiatement (mais dans un chunk différé) -->
@defer (on immediate) { ... }

Ouvrez l'onglet Réseau du navigateur, filtrez par JS, et vérifiez que le chunk du composant ne se télécharge que lorsqu'il est déclenché.

Étape 4 : Ajouter le préchargement

Préchargez le chunk tôt tout en retardant le rendu :

@defer (on interaction(loadBtn); prefetch on idle) {
<app-album-detail [album]="selected" />
} @placeholder {
<button #loadBtn>Afficher les détails</button>
}

Observez dans l'onglet Réseau : le chunk JS est téléchargé pendant la période d'inactivité, il n'y a donc aucun délai au clic.

Étape 5 : Définir les options de timing

Ajoutez un temps d'affichage minimum pour @loading afin d'éviter les scintillements :

@defer (on viewport; prefetch on idle) {
<app-album-detail [album]="selected" />
} @loading (after 200ms; minimum 500ms) {
<p>Chargement…</p>
} @placeholder (minimum 300ms) {
<div class="placeholder-box"></div>
}

Étape 6 : Vérifier le découpage du bundle

Exécutez le build de production et confirmez que le composant est dans un chunk séparé :

ng build

Inspectez la sortie dans dist/ — le composant différé devrait apparaître comme un fichier JS séparé.