Dans le monde du développement web, on a souvent l'impression de courir après les dernières tendances, et parfois, on se demande si tout ça ne pourrait pas être un peu plus simple. La réactivité, c'est un peu le Graal du développement moderne, mais est-ce qu'on ne se complique pas un peu la vie ? Imaginez un monde où la réactivité serait à la fois puissante et simple à gérer. C'est ce qu'on va explorer aujourd'hui avec les signaux et RxJS. Prêts à plonger dans le vif du sujet ?
La Réactivité : Un Voyage à Travers le Temps
Alors, parlons un peu de l'évolution de la réactivité, parce que franchement, c'est un voyage qui en dit long sur notre manière de développer. À l'époque, avant les frameworks modernes, on faisait tout à la main avec du JavaScript pur et des bibliothèques comme jQuery. C'était le Far West, et souvent, on se retrouvait avec un code spaghetti difficile à maintenir. On écoutait des événements avec des addEventListener
et on mélangeait tout : la logique métier, la manipulation du DOM et la gestion des événements. Bref, c'était le bazar, et on se demandait parfois pourquoi on avait choisi ce métier.
Ensuite, les frameworks modernes sont arrivés avec leurs promesses de simplification et de structuration. AngularJS, par exemple, a introduit les watchers. L'idée était simple : on déclarait des variables dans notre contrôleur, on les utilisait dans notre template, et le framework s'occupait de tout mettre à jour. Sauf que, vous vous en doutez, ce n'était pas si simple. Les watchers, c'était bien, mais ça avait un coût. Plus votre application grossissait, plus les performances se dégradaient. On se retrouvait avec des applications lentes et des boucles de détection de changements qui nous donnaient des maux de tête.
Puis, Angular 2 est arrivé avec Zone.js. Là, c'était une révolution. Zone.js a permis de gérer la réactivité de manière plus intelligente. Au lieu de vérifier constamment si quelque chose avait changé, Zone.js écoutait les événements et prévenait Angular quand quelque chose changeait. C'était plus performant, mais ça restait complexe. On avait toujours cette sensation de magie noire qui se passait sous le capot, et on se demandait parfois comment tout cela fonctionnait vraiment.
Bref, la réactivité, c'est un peu comme un voyage à travers le temps. On est passés de solutions artisanales à des frameworks de plus en plus complexes, mais aussi de plus en plus puissants. Et aujourd'hui, avec les signaux, on a l'impression de faire un pas en avant vers quelque chose de plus simple et de plus efficace. Mais ça, on en parlera plus tard.
Les Signaux : La Nouvelle Ère de la Réactivité
Alors, parlons des signaux, parce que franchement, c'est un peu la révolution tranquille dans le monde de la réactivité. Imaginez un monde où vous n'avez plus à vous soucier de la manière dont les changements sont détectés et propagés. C'est exactement ce que les signaux promettent : une approche plus simple et plus efficace pour gérer la réactivité.
Les signaux, c'est un peu comme une boîte magique qui contient une valeur. Chaque fois que cette valeur change, la boîte envoie un signal pour dire "Hey, j'ai changé !". Et le framework, lui, il écoute ces signaux et met à jour uniquement ce qui est nécessaire. Plus besoin de vérifier constamment si quelque chose a changé, comme avec les watchers. Plus besoin de s'appuyer sur une mécanique complexe comme Zone.js. Non, là, c'est simple : une valeur change, un signal est envoyé, et hop, tout est mis à jour.
Prenons un exemple concret. Imaginez que vous avez une variable dans votre composant, et que cette variable est utilisée dans votre template. Avec les signaux, vous déclarez simplement votre variable comme un signal, et le tour est joué. Chaque fois que vous mettez à jour cette variable, le template est automatiquement mis à jour. Pas besoin de faire des pieds et des mains pour que tout fonctionne. C'est simple, c'est efficace, et c'est puissant.
@Component({
template: ` <p>{{ text() }}</p> `,
})
export class PlaygroundComponent {
text = signal('');
constructor() {
setInterval(() => {
this.text.set(this.text() + '!');
}, 1000);
}
}
Et ce n'est pas tout. Les signaux introduisent aussi le concept de "computed signals". Imaginez que vous avez une variable qui dépend d'une autre variable. Avec les computed signals, vous pouvez déclarer cette dépendance, et le framework s'occupe du reste. Chaque fois que la variable de base change, la variable dépendante est automatiquement recalculée. Plus besoin de gérer manuellement ces dépendances. C'est le framework qui s'en charge pour vous.
@Component({
template: `
<p>{{ text() }}</p>
<p>{{ questionText() }}</p>
`,
})
export class PlaygroundComponent {
text = signal('');
questionText = computed(() => this.text().replaceAll('!', '?'));
constructor() {
setInterval(() => {
this.text.set(this.text() + '!');
}, 1000);
}
}
Bref, les signaux, c'est un peu comme un souffle d'air frais dans le monde de la réactivité. C'est simple, c'est efficace, et ça change la manière dont on conçoit les applications web. Et le meilleur dans tout ça ? C'est que c'est déjà là, prêt à être utilisé. Alors, prêts à sauter le pas ?
RxJS : Un Outil Complémentaire
Alors, parlons un peu de RxJS, parce que franchement, c'est un outil qui a sa place dans notre boîte à outils de développeur. RxJS, c'est un peu le couteau suisse de la gestion des flux de données et des événements asynchrones. Imaginez que vous avez un flux de données qui arrive en continu, et que vous voulez les traiter de manière réactive. C'est là que RxJS entre en jeu.
RxJS, c'est basé sur le concept d'Observable. Un Observable, c'est un peu comme un flux de données qui peut émettre des valeurs au fil du temps. Vous pouvez vous abonner à ce flux et réagir chaque fois qu'une nouvelle valeur est émise. C'est puissant, mais ça peut aussi être un peu complexe à comprendre au début. Prenons un exemple concret pour illustrer ça.
import { interval } from 'rxjs';
import { map } from 'rxjs/operators';
const observable = interval(1000).pipe(
map(value => `Value: ${value}`)
);
const subscription = observable.subscribe(value => console.log(value));
// Pour arrêter l'observation après un certain temps
setTimeout(() => {
subscription.unsubscribe();
}, 5000);
Dans cet exemple, on crée un Observable qui émet une valeur toutes les secondes. On utilise l'opérateur map
pour transformer cette valeur, et on s'abonne à l'Observable pour afficher chaque valeur dans la console. C'est simple, mais ça montre bien la puissance de RxJS pour gérer des flux de données.
Mais RxJS, ce n'est pas juste pour les flux de données simples. Vous pouvez aussi combiner plusieurs Observables, filtrer les valeurs, et bien plus encore. Par exemple, imaginez que vous avez deux flux de données et que vous voulez réagir seulement quand les deux flux émettent une valeur en même temps. Avec RxJS, c'est possible.
import { interval } from 'rxjs';
import { combineLatest } from 'rxjs/operators';
const observable1 = interval(1000);
const observable2 = interval(1500);
const combined = combineLatest(observable1, observable2);
const subscription = combined.subscribe(([value1, value2]) => {
console.log(`Value 1: ${value1}, Value 2: ${value2}`);
});
// Pour arrêter l'observation après un certain temps
setTimeout(() => {
subscription.unsubscribe();
}, 5000);
Dans cet exemple, on utilise l'opérateur combineLatest
pour combiner les deux Observables. Chaque fois que l'un des Observables émet une valeur, combineLatest
émet un tableau avec les dernières valeurs des deux Observables. C'est puissant, et ça montre bien comment RxJS peut vous aider à gérer des flux de données complexes.
Bref, RxJS, c'est un outil complémentaire qui peut vraiment vous aider à gérer des flux de données et des événements asynchrones de manière réactive. C'est un peu complexe au début, mais une fois que vous avez compris les concepts de base, c'est un outil incroyablement puissant.
Le Meilleur des Deux Mondes
Alors, parlons un peu de comment tirer le meilleur des deux mondes, parce que franchement, c'est un peu le Graal du développement moderne. On a d'un côté les signaux, simples et efficaces, et de l'autre RxJS, puissant et polyvalent. Mais comment choisir entre les deux ? Et surtout, comment les utiliser ensemble pour obtenir le meilleur des deux approches ?
Commençons par un petit récapitulatif. Les signaux, c'est simple et efficace pour gérer la réactivité dans vos composants. Vous déclarez une variable comme un signal, et hop, tout est mis à jour automatiquement. Plus besoin de se soucier de la manière dont les changements sont détectés et propagés. C'est magique, et ça simplifie vraiment la vie.
D'un autre côté, on a RxJS, qui est parfait pour gérer des flux de données complexes et des événements asynchrones. Vous pouvez combiner des flux, les filtrer, les transformer, et bien plus encore. C'est puissant, mais ça peut être un peu complexe à comprendre au début.
Mais alors, comment choisir entre les deux ? Et bien, tout dépend de ce que vous voulez faire. Si vous avez besoin de gérer la réactivité dans vos composants, les signaux sont parfaits. Ils sont simples, efficaces, et ils font le travail sans se prendre la tête. Mais si vous avez besoin de gérer des flux de données complexes, alors RxJS est votre meilleur allié.
Et le meilleur dans tout ça, c'est que vous n'avez pas à choisir. Vous pouvez utiliser les deux ensemble pour obtenir le meilleur des deux mondes. Par exemple, vous pouvez utiliser RxJS pour gérer vos flux de données, et les signaux pour gérer la réactivité dans vos composants.
import { toSignal } from '@angular/core/rxjs-interop';
@Component({
template: ` <p>{{ text() }}</p> `,
})
export class PlaygroundComponent {
text$ = interval(1000).pipe(map(value => `Value: ${value}`));
text = toSignal(this.text$, { initialValue: 'Initial value' });
}
Dans cet exemple, on utilise toSignal
pour convertir un Observable en un Signal. C'est un pont entre les deux mondes, qui vous permet de profiter de la puissance de RxJS pour la gestion des flux de données, tout en utilisant les signaux pour la réactivité dans vos composants.
Mais quand est-ce qu'il faut utiliser l'un plutôt que l'autre ? Les signaux sont parfaits pour la réactivité locale dans vos composants, pour des états simples et des mises à jour directes. Ils sont idéaux pour des cas où vous avez besoin de simplicité et d'efficacité.
RxJS, en revanche, est plus adapté pour des flux de données complexes, des événements asynchrones, et des combinaisons de flux. Si vous avez besoin de gérer des flux de données qui viennent de différentes sources, ou si vous avez besoin de transformer et de combiner ces flux, alors RxJS est votre meilleur allié.
Bref, les signaux et RxJS, c'est un peu comme le yin et le yang du développement moderne. Ils sont différents, mais ils se complètent parfaitement.
Conclusion
Alors, on arrive à la fin de notre petit voyage à travers les signaux et RxJS. On a vu comment les signaux simplifient la gestion de la réactivité dans nos composants, et comment RxJS nous offre une puissance inégalée pour gérer des flux de données complexes.

Transcription et traduction :
Angular folks,
Quelques infos Signals vs Observables...
- Utilisez les signals pour de la gestion d'état, par les observables.
- Utilisez les observables pour l'annulation et d'autres coordinations d'événements.
- N'ESSAYEZ PAS D'UTILISER LES SIGNALS COMME RXJS. C'est une mauvaise idée voir une idée stupide.
Ce sont des technologies complémentaires.
Alors, prêts à sauter le pas et à tirer le meilleur parti de ces outils dans vos projets ? N'oubliez pas, le choix entre les signaux et RxJS dépend de vos besoins spécifiques, alors soyez pragmatiques et choisissez l'outil qui convient le mieux à votre cas d'utilisation.
Source :