Fondations Modernes & Composants Propres
Une journée essentielle pour poser les bases d’un Angular moderne, stable et maintenable. Objectif : maîtriser ES2024, TypeScript strict, les composants Angular propres, et commencer à structurer l’application selon les principes professionnels.
🎯 Objectif du Jour 1
Construire des bases solides pour un code lisible, testable, maintenable et orienté long terme. Vous posez la fondation qui conditionne la qualité du reste de la formation.
🧩 Fil Rouge du Projet
Création d’un mini-catalogue B2B (produits, recherche, interactions) qui évoluera chaque jour.
🧠 Patterns du Jour
Smart/Dumb Components, immuabilité, typage strict, séparation des responsabilités.
Section 1 — JavaScript ES2024 & TypeScript strict
Le but est de maîtriser les nouveautés modernes qui rendent le code plus expressif, plus robuste et beaucoup plus prévisible. **Angular repose sur TypeScript strict**, il est donc impossible d’être productif sans ces concepts.
🚀 Concepts modernes à maîtriser
- Records & Tuples — structures immuables idéales pour des modèles de données propres.
- Pattern Matching — remplace 80% des if/else lourds.
- Pipeline Operator
|>— écriture fluide des transformations. - Async Context Tracking — propagation automatique de contexte async (utile pour logs / monitoring).
- TypeScript Strict — sécurité absolue, meilleure DX, bugs éliminés dès l’écriture.
🧰 Exemple TypeScript propre
interface Product {
id: number;
name: string;
price: number;
}
const formatPrice = (p: Product) =>
`${p.price.toFixed(2)} €`;
const isCheap = (p: Product) => p.price < 100;
- Muter des objets au lieu de créer des copies immuables.
- Désactiver strictNullChecks « temporairement ».
- Utiliser any à la place de types précis.
Section 2 — Architecture des Composants Angular
Angular impose une architecture claire : composants déclaratifs, minimalistes, centrés sur l'affichage et la gestion des événements. La logique métier **n'a rien à faire dans un composant**.
🧱 Anatomie propre d’un composant
@Component({
selector: 'app-product-card',
templateUrl: './product-card.html',
})
export class ProductCardComponent {
@Input() product!: Product;
@Output() add = new EventEmitter();
}
- Dumb Components → rôle : afficher + émettre.
- Smart Components → rôle : charger, orchestrer, appeler les services.
- Encapsulation stricte — le composant doit être autonome et pur.
⚡ Signals (remplace 70% des services avec Subject)
La nouvelle API Reactive "Signals" d'Angular permet un état lisible, prévisible et performant sans Subject / BehaviorSubject.
readonly products = signal([]);
readonly promos = computed(() =>
this.products().filter(p => p.price < 100)
);
effect(() => {
console.log('Promos:', this.promos());
});
- Un composant = 1 responsabilité.
- Jamais de logique réseau dans un composant de présentation.
- Préférer les fonctions pures et l’immuabilité.
- Utiliser Signals → lisibilité + performance.
Ateliers pratiques du Jour 1
Atelier 1 — Construire ProductCard (Dumb)
Objectif : un composant de présentation pur, sans aucune logique métier.
@Component({
selector: 'app-product-card',
template: `
{{ product.name }}
{{ product.price | currency:'EUR' }}
`
})
export class ProductCardComponent {
@Input() product!: Product;
@Output() add = new EventEmitter();
}
Atelier 2 — Construire ProductList (Smart)
Ici, on orchestre les données, les appels réseau, la gestion du panier. C’est le cerveau, pas l’UI.
@Component({
selector: 'app-product-list',
template: `
`
})
export class ProductListComponent {
products: Product[] = [];
constructor(private cart: CartService) {}
addToCart(p: Product) {
this.cart.add(p);
}
}
Atelier 3 — Refactor complet ES5 → ES2024 → TS strict
Mise à niveau du style, lisibilité, sécurité.
Patterns & Anti-patterns du Jour 1
✔ Bonnes pratiques
- Séparer Smart et Dumb Components.
- Immuabilité systématique.
- Typage strict (jamais any).
- Utilisation de Signals pour gérer l’état proprement.
- Favoriser l’injection de services dans Smart Components.
❌ Anti-patterns
- Mettre des appels réseau dans un composant de présentation.
- Accumuler les subscribe() non gérés.
- Laisser Angular compiler sans TypeScript strict.
- Muter les tableaux utilisés dans *ngFor.
- CSS global qui fuit dans l’app.
