Modules vs Standalone
Standalone Components (Modern - Default)
Section intitulée « Standalone Components (Modern - Default) »Standalone est l’approche par défaut et recommandée pour Angular 17+.
import { Component } from '@angular/core';import { CommonModule } from '@angular/common';
@Component({ selector: 'app-user', standalone: true, imports: [CommonModule], template: `<p>User component</p>`})export class UserComponent {}Bootstrapping Standalone
Section intitulée « Bootstrapping Standalone »import { bootstrapApplication } from '@angular/platform-browser';import { provideHttpClient } from '@angular/common/http';import { provideRouter } from '@angular/router';
bootstrapApplication(AppComponent, { providers: [ provideHttpClient(), provideRouter(routes), UserService ]});Standalone App Component
Section intitulée « Standalone App Component »import { Component } from '@angular/core';import { RouterOutlet, RouterLink } from '@angular/router';import { CommonModule } from '@angular/common';
@Component({ selector: 'app-root', standalone: true, imports: [ CommonModule, RouterOutlet, RouterLink, UserListComponent ], template: ` <nav> <a routerLink="/">Home</a> <a routerLink="/users">Users</a> </nav> <router-outlet></router-outlet> `})export class AppComponent {}Routes Standalone
Section intitulée « Routes Standalone »import { Routes } from '@angular/router';
export const routes: Routes = [ { path: '', loadComponent: () => import('./home/home.component') .then(m => m.HomeComponent) }, { path: 'users', loadComponent: () => import('./users/user-list.component') .then(m => m.UserListComponent) }, { path: 'admin', loadChildren: () => import('./admin/admin.routes') .then(m => m.ADMIN_ROUTES) }];Chargement Différé Standalone
Section intitulée « Chargement Différé Standalone »import { Routes } from '@angular/router';
export const ADMIN_ROUTES: Routes = [ { path: '', loadComponent: () => import('./admin-dashboard.component') .then(m => m.AdminDashboardComponent) }, { path: 'users', loadComponent: () => import('./admin-users.component') .then(m => m.AdminUsersComponent) }];Mélanger Modules et Standalone
Section intitulée « Mélanger Modules et Standalone »// Importer un composant standalone dans NgModule@NgModule({ imports: [ BrowserModule, UserComponent // Composant standalone ], declarations: [AppComponent]})export class AppModule {}
// Importer NgModule dans un composant standalone@Component({ standalone: true, imports: [ CommonModule, ReactiveFormsModule // NgModule ]})export class FormComponent {}Providers dans Standalone
Section intitulée « Providers dans Standalone »// Niveau composant@Component({ standalone: true, providers: [UserService] // Nouvelle instance par composant})export class UserComponent {}
// Niveau applicationbootstrapApplication(AppComponent, { providers: [ { provide: API_URL, useValue: 'https://api.example.com' }, UserService // Singleton ]});
// Niveau service@Injectable({ providedIn: 'root' })export class UserService {}Imports Courants
Section intitulée « Imports Courants »// Toujours importer ces modules quand nécessaireimport { CommonModule } from '@angular/common'; // *ngIf, *ngFor, pipesimport { FormsModule } from '@angular/forms'; // ngModelimport { ReactiveFormsModule } from '@angular/forms'; // Reactive formsimport { RouterModule } from '@angular/router'; // routerLink, router-outletimport { HttpClientModule } from '@angular/common/http'; // Legacy// Ouimport { provideHttpClient } from '@angular/common/http'; // StandaloneConseils de Migration
Section intitulée « Conseils de Migration »De NgModule vers Standalone:
- Ajouter
standalone: trueau@Component - Ajouter le tableau
imports: [] - Importer les modules/composants nécessaires
- Retirer des
declarationsdu NgModule - Mettre à jour le routing pour utiliser
loadComponent
Exemple:
// Avant@Component({ selector: 'app-user'})
@NgModule({ declarations: [UserComponent]})
// Après@Component({ selector: 'app-user', standalone: true, imports: [CommonModule]})Avantages de Standalone
Section intitulée « Avantages de Standalone »- Plus simple - Pas besoin de NgModules
- Plus rapide - Meilleur tree-shaking
- Explicite - Dépendances claires
- Lazy loading - Au niveau du composant
- Moins de boilerplate
- Meilleure DX - Plus facile à comprendre
NgModules (Legacy)
Section intitulée « NgModules (Legacy) »Utiliser uniquement les NgModules pour les applications legacy ou lors de la maintenance de code existant.
import { NgModule } from '@angular/core';import { BrowserModule } from '@angular/platform-browser';
@NgModule({ declarations: [AppComponent, UserComponent], imports: [BrowserModule], providers: [UserService], bootstrap: [AppComponent]})export class AppModule {}Quand Utiliser Chacun
Section intitulée « Quand Utiliser Chacun »Utiliser Standalone (Recommandé)
Section intitulée « Utiliser Standalone (Recommandé) »- Toutes les nouvelles applications (Angular 17+)
- Bibliothèques de composants
- Meilleur tree-shaking et performance
- Dépendances plus simples et plus explicites
Utiliser NgModules (Legacy uniquement)
Section intitulée « Utiliser NgModules (Legacy uniquement) »- Maintenir des applications basées sur NgModule existantes
- Migration graduelle depuis une ancienne base de code
Bonnes Pratiques
Section intitulée « Bonnes Pratiques »- Toujours utiliser standalone pour les nouvelles applications Angular 17+
- Utiliser
bootstrapApplication()pour l’initialisation de l’application - Utiliser
provideHttpClient()au lieu deHttpClientModule - Importer uniquement ce dont vous avez besoin dans chaque composant
- Utiliser
loadComponentpour le lazy loading - Garder le tableau
importsorganisé et minimal

