J'ai travaillé avec NgRx depuis plus de trois ans maintenant. Je l'ai utilisé sur de petits projets, où c'était pratique mais pas nécessaire, et je l'ai utilisé dans des applications où c'était parfaitement adapté. Pendant ce temps, j'ai eu l'occasion de travailler sur un projet qui ne l'utilisait pas et je dois dire qu'il en aurait bénéficié.
Sur le projet actuel, j'étais chargé de concevoir l'architecture de la nouvelle application FE. On m'a confié la tâche de refondre complètement l'application existante qui, pour les mêmes besoins, utilisait une approche non NgRx et qui était boguée, difficile à comprendre et à maintenir et sans documentation. J'ai décidé d'utiliser NgRx là et je l'ai fait pour les raisons suivantes :
- L'application a plus d'un acteur sur les données. Le serveur utilise le SSE pour pousser des mises à jour d'état qui sont indépendantes des actions de l'utilisateur.
- Au démarrage de l'application, nous chargeons la plupart des données disponibles qui sont ensuite partiellement mises à jour avec SSE.
- Divers éléments de l'interface utilisateur sont activés/désactivés en fonction de plusieurs conditions provenant du serveur et des décisions de l'utilisateur.
- L'interface utilisateur a plusieurs variations. Les événements du serveur peuvent changer les éléments de l'interface utilisateur actuellement visibles (textes dans les dialogues) et même les actions de l'utilisateur peuvent modifier l'apparence et le fonctionnement de l'interface utilisateur (le dialogue récurrent peut être remplacé par une notification si l'utilisateur cliqué sur un bouton).
- L'état de plusieurs éléments de l'interface utilisateur doit être préservé afin que lorsque l'utilisateur quitte la page et y revienne, le même contenu (ou mis à jour via SSE) soit visible.
Comme vous pouvez le voir, les exigences ne correspondent pas à la page web standard des opérations CRUD. Le faire à la manière "Angular" a apporté une telle complexité au code qu'il est devenu extrêmement difficile à maintenir et, ce qui est pire, lorsque j'ai rejoint l'équipe, les deux derniers membres d'origine partaient sans aucune documentation sur cette solution personnalisée, non NgRx.
Maintenant, après un an depuis la refonte de l'application pour utiliser NgRx, je pense que je peux résumer les avantages et les inconvénients.
Les avantages :
- L'application est mieux organisée. La représentation de l'état est facile à lire, regroupée par but ou origine des données et simple à étendre.
- Nous nous sommes débarrassés de nombreuses usines, façades et classes abstraites qui avaient perdu leur utilité. Le code est plus léger, et les composants sont 'plus simples', avec moins de manipulations cachées venant d'ailleurs.
- Les calculs d'état compliqués sont simplifiés en utilisant des effets et des sélecteurs et la plupart des composants peuvent désormais être entièrement fonctionnels en injectant simplement le store et en envoyant les actions ou en sélectionnant la tranche nécessaire de l'état tout en gérant plusieurs actions en même temps.
- En raison des modifications apportées aux exigences de l'application, nous avons été contraints de refondre le store déjà et c'était principalement du copier-coller et un peu de renommage.
- Grâce aux outils de développement Redux, il est plus facile de déboguer et d'optimiser (oui vraiment)
- C'est le plus important - même si notre état lui-même est unique, la gestion du store que nous utilisons ne l'est pas. Il a un support, il a une documentation et ce n'est pas impossible de trouver des solutions à certains problèmes difficiles sur internet.
- Petit avantage, NgRx est une autre technologie que vous pouvez ajouter à votre CV :)
Les inconvénients :
- Mes collègues étaient nouveaux dans NgRx et il leur a fallu un certain temps pour s'adapter et le comprendre pleinement.
- À certaines occasions, nous avons introduit le problème où certaines actions étaient déclenchées plusieurs fois et il était difficile d'en trouver la cause et de le résoudre
- Nos Effets sont énormes, c'est vrai. Ils peuvent devenir compliqués mais c'est pourquoi nous avons des demandes de tirage. Et si ce code n'était pas là, il finirait quand même quelque part ailleurs :)
- Le plus gros problème ? Les actions sont différenciées par leur type de chaîne. Copiez une action, oubliez de la renommer et boom, quelque chose de différent se produit de ce à quoi vous vous attendiez, et vous n'avez aucune idée de pourquoi.
En conclusion, je dirais que dans notre cas, NgRx était un excellent choix. C'est exigeant au début mais plus tard tout semble naturel et logique. De plus, lorsque vous vérifiez les exigences, vous remarquerez que c'est un cas spécial. Je comprends les critiques contre NgRx et dans certains cas, je les soutiendrais mais pas sur ce projet. Aurions-nous pu le faire en utilisant la manière 'Angular' ? Bien sûr, cela a été fait de cette manière auparavant, mais c'était un gâchis. C'était toujours plein de code de base, de choses se produisant à différents endroits sans raisons évidentes et plus encore.
Toute personne ayant la chance de comparer ces deux versions dirait que la version NgRx est meilleure.
23 votes
L'année dernière, j'ai commencé un nouvel emploi dans une entreprise. Ils utilisaient Angular avec Redux. Je n'ai pas encore touché à Redux, mais je développe en Angular depuis sa sortie en version bêta. Ma première impression a été "mais c'est quoi ce truc?" Tellement de complications juste pour communiquer avec une API et s'abonner à ces données. Ils utilisaient littéralement Redux pour tout! C'était tellement le bazar que c'était impossible de travailler. Il n'y a vraiment aucun besoin d'intégrer Redux / Ngrx à une application Angular. Vous pouvez tout faire "à la manière d'Angular".
12 votes
NgRx augmente exponentiellement la complexité du code avec beaucoup de code redondant inutile. D'autre part, il n'offre guère plus que ce qu'Angular, en tant que framework complet, a déjà offert par défaut. Ce billet de blog couvre toutes les informations dont vous avez besoin : Gestion de l'état de l'application Angular : Vous n'avez pas besoin de magasins de données externes
3 votes
Désolé les gars je ne suis pas d'accord. Quand votre projet atteint une certaine taille, vous commencez à rencontrer des problèmes pour maintenir tout à jour. J'utilisais beaucoup de BehavoirSubjects et l'augmentation de la complexité signifiait que je réinventais NGRX mais maladroitement. J'ai réécrit mon application en utilisant NGRX et j'ai accès au store partout. Les changements de syntaxe de V8 ont réduit la quantité de code redondant également. Mon projet est plus propre, plus facile à lire et plus rapide à exécuter.