Angular 18 : nouvelles fonctionnalités d'Angular qui posent les bases pour l'avenir

March 29th, 2025 - 5-6 minutes read

Introduction

Le framework Angular continue d'évoluer, chaque nouvelle version apportant son lot d'innovations. Sortie en mai 2024, Angular 18 est une version charnière qui ouvre la voie à de profonds changements futurs du framework. Dans cet article, nous allons explorer les nouvelles fonctionnalités d'Angular 18, comprendre leur impact sur les développeurs et voir pourquoi cette version est une étape clé avant les développements d'Angular 19 et 20.

Mode Zoneless (aperçu pour les développeurs)

Traditionnellement, Angular utilise Zone.js pour détecter les changements et actualiser l'interface utilisateur. Avec Angular 18, un premier pas a été franchi vers un Angular sans Zone.js.

En mode Zoneless, vous devez déclencher manuellement la détection des changements, ce qui vous donne plus de contrôle et améliore les performances dans les applications complexes.

Example en mode Zoneless:

import { ApplicationRef, Component, effect, signal } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <h2>Compteur : {{ count() }}</h2>
    <button (click)="increment()">Incrémenter</button>
  `
})
export class AppComponent {
  count = signal(0);

  constructor(private appRef: ApplicationRef) {
    effect(() => {
      console.log('Nouvelle valeur :', this.count());
    });
  }

  increment() {
    this.count.update(v => v + 1);
    this.appRef.tick(); 
  }
}

Ce code montre un compteur basé sur les signals d’Angular 18. Le count stocke l’état, un effect chaque changement, et la méthode increment() met à jour la valeur. Comme le mode zoneless est utilisé, la détection de changements doit être déclenchée manuellement avec this.appRef.tick()offrant plus de contrôle et de performance.

 Zone Coalescing activé par défaut

Angular 18 active par défaut zone coalescing , une optimisation qui regroupe plusieurs événements de changement en un seul cycle de détection.

Résultat : moins de cycles de détection, donc meilleures performances.

Les développeurs bénéficient de cette amélioration sans avoir à modifier leur code.

@Component({
  selector: 'app-form',
  template: `
    <input [(ngmodel)]="firstName" placeholder="Prénom" />
    <input [(ngmodel)]="lastName" placeholder="Nom" />
    <p>Nom complet : {{ firstName }} {{ lastName }}</p>
  `
})
export class FormComponent {
  firstName = '';
  lastName = '';
}

Ce composant définit un formulaire simple avec deux champs liés à firstName et lastName à l'aide d'une liaison bidirectionnelle (ngModel). Chaque fois qu'une entrée est effectuée, Angular met automatiquement à jour les propriétés du composant et affiche à nouveau la valeur complète dans le paragraphe. Avec Angular 18, la fusion de zones, qui est activée par défaut, regroupe ces mises à jour, rendant le rendu plus fluide et plus efficace.

Un Router plus robuste

Le Router Angular évolue aussi avec Angular 18. L’objectif : rendre la navigation encore plus fiable et plus flexible. Parmi les améliorations, on retrouve une gestion plus fine des guards et une meilleure prise en charge de la route pre-activation.

Le Router Angular s’est enrichi dans Angular 18 :

  • meilleure gestion des guards

  • pré-activation plus flexible

  • base plus solide pour SSR et hydratation à venir

Exemple avec un guard simple :

@Injectable({ providedIn: 'root' })
export class AuthGuard implements CanActivate {
  canActivate(): boolean {
    return !!localStorage.getItem('token');
  }
}

// app-routing.module.ts
const routes: Routes = [
  { path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuard] }
];

Cet exemple montre un guard Angular utilisé pour sécuriser une route. La classe AuthGuard implémente CanActivate et vérifie si un token est présent dans le localStorage. Si oui, la navigation est autorisée, sinon elle est bloquée. Dans le fichier de routing, la route /dashboard st protégée par ce guard, ce qui signifie que seuls les utilisateurs authentifiés peuvent y accéder. C’est une pratique courante pour gérer la sécurité et l’accès conditionnel dans une application Angular.

Support natif de await en mode Zoneless

Avec Angular 18, il devient possible d’utiliser await directement dans les templates lorsque l’application tourne en mode Zoneless.

Cela simplifie l’écriture du code asynchrone.

Example: charger des données depuis une API et les afficher sans boilerplate supplémentaire. loading data from an API and displaying it without extra boilerplate.

@Component({
  selector: 'app-user',
  template: `
    <ng-container *ngif="userPromise | async as user; else loading">
      <h3>{{ user.name }}</h3>
      <p>{{ user.email }}</p>
    </ng-container>
    <ng-template #loading>Chargement...</ng-template>
  `
})
export class UserComponent {
  userPromise = this.fetchUser();

  async fetchUser() {
    const response = await fetch('https://jsonplaceholder.typicode.com/users/1');
    return response.json();
  }
}

Ce composant illustre la gestion de données asynchrones avec Angular. La méthode fetchUser() écupère un utilisateur depuis une API externe et retourne une promesse. Dans le template, le pipe async est utilisé pour attendre la résolution de cette promesse : si les données sont disponibles, elles sont affichées name et email; sinon Angular montre le template loading . Cela permet d’écrire un code clair et réactif sans gérer manuellement les abonnements.

Conclusion

Angular 18 n’est pas une version révolutionnaire, mais elle marque un tournant stratégique.En introduisant le mode Zoneless en preview, en améliorant la gestion du Router, et en renforçant la vérification des templates, cette version jette les bases des grandes avancées confirmées par Angular 19 et surtout Angular 20.

Pour les développeurs, Angular 18 est une version de préparation ::

  • Elle offre déjà de meilleures performances grâce au zone coalescing.

  • Elle introduit des concepts (Zoneless, await dans les templates) qui deviendront la norme.

  • Elle permet de se familiariser avec l’évolution de la réactivité Angular, avant l’arrivée des signals stables en Angular 20.

En clair : si vous souhaitez rester à jour sur les nouveautés d’Angular et préparer vos applications au futur, Angular 18 est une étape à ne pas négliger.

Plus d'articles sur la mise en œuvre

Comparatif Angular 16 vs Angular 18 : découvrez les nouveautés d’Angular, l’arrivée des signals, le mode Zoneless, le zone coalescing et leurs impacts sur vos projets.

Discover the Angular Rome Conference: workshops, domain-driven design, signals, state management, micro frontends.

Discover Angular 18: zoneless mode, zone coalescing, native await, and TypeScript 5.4 compatibility.

Gantt Charts

Le TOP 3 des diagrammes de Gantt JavaScript. Découvrez leurs caractéristiques, avantages et inconvénients pour choisir le meilleur outil pour votre projet.

sceenschot example appli Gantt charts

Découvrez comment ScheduleJS s'est intégré en toute transparence à Selligent CRM, améliorant ainsi l'efficacité de la planification pour les consultants d'une grande marque de produits de beauté.

JS Gantt charts example

Cet article présente l'intégration d'un composant ScheduleJS dans un tableau Ag-Grid externe, afin de démontrer la flexibilité de ScheduleJS.

Big Gantt charts

Comment synchroniser plusieurs graphiques ? Apprenez à réutiliser votre ligne de temps ScheduleJS dans plusieurs graphiques afin de les synchroniser.

JS Gantt Screenshot

Menu contextuel

Comment construire un menu contextuel interactif ? Une plongée en profondeur dans la gestion des événements ScheduleJS et les pratiques recommandées pour construire votre propre menu contextuel.

Schedulejs viewer gantt

Cet article montre comment mettre en œuvre un rendu dynamique en fonction du niveau de zoom actuel des graphiques.

Gantt Organnisation

Cet article propose une mise en œuvre pas à pas d'un mécanisme d'animation utilisant l'API JavaScript Date pour vos activités.

S’abonner
Notification pour
guest
0 Commentaires
Commentaires
Show all comments
0
We would love to to have your toughts on this. Please leave a comment below!x