Lab 19: Deferrable Views
📖 Ressources
Section intitulée « 📖 Ressources »🚀 Code de départ
Section intitulée « 🚀 Code de départ »step-18-album-wholesale-v21-post-signal-form
Dans ce lab, vous allez implémenter le chargement différé pour les composants en utilisant les blocs @defer d’Angular. Vous convertirez le rendu conditionnel avec @if pour utiliser @defer avec des déclencheurs d’interaction, ajouterez des états de chargement et de placeholder, et optimiserez la taille du bundle en séparant les composants lourds.
📝 Instructions
Section intitulée « 📝 Instructions »Étape 1: Remplacer @if par @defer
Section intitulée « Étape 1: Remplacer @if par @defer »Convertissez le composant des commentaires du rendu conditionnel au chargement différé.
Avant (step-18):
@if (showComments()) { <app-comments [albumId]="data.album.id"></app-comments>}@else { <a class="primary" (click)="showComments.set(true)">Charger les commentaires</a>}Après (step-19):
@defer (on interaction) { <app-comments [albumId]="data.album.id"></app-comments>} @placeholder { <a class="primary">Charger les commentaires</a>} @loading { <p>Chargement des commentaires…</p>} @error { <p>Impossible de charger les commentaires.</p>}Étape 2: Supprimer le state Signal
Section intitulée « Étape 2: Supprimer le state Signal »Puisque @defer gère l’état, supprimez le signal showComments du composant:
export class DetailComponent { // ❌ Supprimez ceci - plus nécessaire // showComments = signal(false);
albumCommentsService = inject(AlbumCommentsService);
constructor(@Inject(MAT_DIALOG_DATA) public data: {album: Album}) {}}Étape 3: Supprimer l’import CdkScrollable
Section intitulée « Étape 3: Supprimer l’import CdkScrollable »Nettoyez les imports inutilisés du composant:
// Avantimports: [CdkScrollable, MatDialogContent, ...]
// Aprèsimports: [MatDialogContent, MatDialogTitle, ...]Étape 4: Tester le chargement différé
Section intitulée « Étape 4: Tester le chargement différé »- Lancez l’application:
npm start - Ouvrez l’onglet Network des DevTools du navigateur
- Ouvrez une fenêtre de détail d’album
- Remarquez que le composant des commentaires n’est PAS chargé initialement
- Cliquez sur “Charger les commentaires”
- Observez le chunk lazy chargé dans l’onglet Network
Étape 5: Ajouter un délai de chargement (Optionnel)
Section intitulée « Étape 5: Ajouter un délai de chargement (Optionnel) »Évitez l’affichage flash du chargement sur les connexions rapides:
@defer (on interaction) { <app-comments [albumId]="data.album.id"></app-comments>} @loading (after 200ms; minimum 1s) { <p>Chargement des commentaires…</p>} @placeholder { <a class="primary">Charger les commentaires</a>}Étape 6: Ajouter le prefetching (Optionnel)
Section intitulée « Étape 6: Ajouter le prefetching (Optionnel) »Préchargez le composant quand le navigateur est inactif:
@defer (on interaction; prefetch on idle) { <app-comments [albumId]="data.album.id"></app-comments>} @placeholder { <a class="primary">Charger les commentaires</a>}✅ Critères de réussite
Section intitulée « ✅ Critères de réussite »- Le composant des commentaires utilise
@defer (on interaction) - Les blocs
@placeholder,@loadinget@errorsont implémentés - Le signal
showCommentsest supprimé - Les imports inutilisés sont nettoyés
- Le composant se charge en différé uniquement quand l’utilisateur clique
- L’analyse du bundle montre un chunk séparé pour le composant des commentaires
🎯 Différences clés: @if vs @defer
Section intitulée « 🎯 Différences clés: @if vs @defer »| Fonctionnalité | @if | @defer |
|---|---|---|
| Bundle | Inclus dans le principal | Chunk séparé |
| Timing de chargement | À l’initialisation du composant | Au déclenchement |
| Gestion d’état | Manuelle (signal) | Automatique |
| États de chargement | Manuelle | Intégrés |
| Gestion d’erreur | Manuelle | Intégrée (@error) |

