<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yvan NGOUDJOU</title>
    <description>The latest articles on DEV Community by Yvan NGOUDJOU (@yvangoudjou).</description>
    <link>https://dev.to/yvangoudjou</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3300002%2Fd6dbd6a9-e0cd-4ddb-a97e-f21ef3766332.png</url>
      <title>DEV Community: Yvan NGOUDJOU</title>
      <link>https://dev.to/yvangoudjou</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yvangoudjou"/>
    <language>en</language>
    <item>
      <title>Construire une seule image Docker pour une application Angular et l’exécuter sur tous les environnements</title>
      <dc:creator>Yvan NGOUDJOU</dc:creator>
      <pubDate>Sun, 24 Aug 2025 06:45:53 +0000</pubDate>
      <link>https://dev.to/yvangoudjou/construire-une-seule-image-docker-pour-une-application-angular-et-lexecuter-sur-tous-les-320k</link>
      <guid>https://dev.to/yvangoudjou/construire-une-seule-image-docker-pour-une-application-angular-et-lexecuter-sur-tous-les-320k</guid>
      <description>&lt;h2&gt;
  
  
  Contexte
&lt;/h2&gt;

&lt;p&gt;Dans le développement d’applications modernes, il est fréquent de disposer de plusieurs environnements :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dev&lt;/strong&gt; pour les développeurs,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staging&lt;/strong&gt; pour la validation métier,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production&lt;/strong&gt; pour les utilisateurs finaux.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans chacun de ces environnements, on déploie généralement une instance du backend et du frontend.&lt;br&gt;
Côté Angular, cela se traduit par plusieurs fichiers de configuration :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;environment.ts  
environment.staging.ts  
environment.prod.ts  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lors du build, Angular permet de choisir l’environnement à utiliser grâce au flag :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng build &lt;span class="nt"&gt;--configuration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Le problème
&lt;/h2&gt;

&lt;p&gt;Avec cette approche, la configuration est injectée &lt;strong&gt;au moment du build&lt;/strong&gt; de l’image Docker.&lt;br&gt;
Cela pose une contrainte forte en contexte CI/CD :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si vous construisez votre image Docker avec l’option &lt;code&gt;--configuration=staging&lt;/code&gt;, alors même en l’exécutant en &lt;strong&gt;Dev&lt;/strong&gt;, elle utilisera toujours la configuration &lt;strong&gt;staging&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Vous êtes donc obligés de &lt;strong&gt;reconstruire une image par environnement&lt;/strong&gt;, ce qui va à l’encontre du principe &lt;strong&gt;Build Once, Run Everywhere&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  L’approche proposée
&lt;/h2&gt;

&lt;p&gt;Puisqu’Angular ne permet pas encore d’injecter des configurations dynamiquement au runtime, une approche pragmatique consiste à :&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Centraliser la configuration dans un fichier JSON
&lt;/h3&gt;

&lt;p&gt;Placer la configuration dans un fichier &lt;code&gt;env.json&lt;/code&gt; stocké dans &lt;code&gt;/assets/conf&lt;/code&gt;.&lt;br&gt;
Lors du démarrage du conteneur, un script &lt;code&gt;entrypoint.sh&lt;/code&gt; copie le bon fichier selon l’environnement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;env.&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ENVIRONMENT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.json  env.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemple de contenu :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apiUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"featureFlag"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Charger le fichier dynamiquement au lancement de l’application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConfigService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/assets/env.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apiUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Initialiser la configuration avant le bootstrap
&lt;/h3&gt;

&lt;p&gt;Grâce à &lt;code&gt;provideAppInitializer&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;bootstrapApplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AppComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;provideAppInitializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;configService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ConfigService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;configService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. Exécution de l'image Docker
&lt;/h3&gt;

&lt;p&gt;Exécute l'image docker en spécifiant la valeur de la variable ENVIRONMENT:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ENVIRONMENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;staging  IMAGE_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Bénéfices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Une seule image Docker à maintenir et à déployer.&lt;/li&gt;
&lt;li&gt;Déploiements simplifiés dans un pipeline CI/CD.&lt;/li&gt;
&lt;li&gt;Séparation claire entre le code applicatif (figé dans l’image) et la configuration (injectée au runtime).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Cette approche permet de réellement appliquer le principe &lt;strong&gt;Build Once, Run Everywhere&lt;/strong&gt; avec Angular dans un contexte Docker et CI/CD.&lt;/p&gt;

&lt;p&gt;Il serait intéressant qu’Angular propose à terme un mécanisme natif d’injection de configuration au runtime.&lt;br&gt;
En attendant, cette méthode est utilisée dans de nombreux projets en production et reste une solution robuste et pragmatique.&lt;/p&gt;

&lt;p&gt;Et vous, comment gérez-vous la configuration multi-environnements pour vos applications Angular déployées sous Docker ?&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Sur quels critères décider d’utiliser (ou non) un store comme NgRx dans une application Angular ? C’est une question fréquente — et la réponse n’est pas toujours évidente. Dans cet article, je t’explique quand et pourquoi un store peut être pertinent.</title>
      <dc:creator>Yvan NGOUDJOU</dc:creator>
      <pubDate>Fri, 27 Jun 2025 11:15:03 +0000</pubDate>
      <link>https://dev.to/yvangoudjou/sur-quels-criteres-decider-dutiliser-ou-non-un-store-comme-ngrx-dans-une-application-angular-4ma7</link>
      <guid>https://dev.to/yvangoudjou/sur-quels-criteres-decider-dutiliser-ou-non-un-store-comme-ngrx-dans-une-application-angular-4ma7</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/yvangoudjou" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3300002%2Fd6dbd6a9-e0cd-4ddb-a97e-f21ef3766332.png" alt="yvangoudjou"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/yvangoudjou/quand-faut-il-utiliser-un-store-comme-ngrx-dans-une-application-angular--3jgo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Quand faut-il utiliser un store comme NgRx dans une application Angular ?&lt;/h2&gt;
      &lt;h3&gt;Yvan NGOUDJOU ・ Jun 27&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ngrx&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#angular&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#french&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#frontend&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>ngrx</category>
      <category>angular</category>
      <category>french</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Quand faut-il utiliser un store comme NgRx dans une application Angular ?</title>
      <dc:creator>Yvan NGOUDJOU</dc:creator>
      <pubDate>Fri, 27 Jun 2025 11:13:12 +0000</pubDate>
      <link>https://dev.to/yvangoudjou/quand-faut-il-utiliser-un-store-comme-ngrx-dans-une-application-angular--3jgo</link>
      <guid>https://dev.to/yvangoudjou/quand-faut-il-utiliser-un-store-comme-ngrx-dans-une-application-angular--3jgo</guid>
      <description>&lt;p&gt;&lt;em&gt;Cet article est rédigé en français. Si vous souhaitez une version anglaise, faites-le-moi savoir en commentaire !&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;C’est une question que je reçois souvent :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Est-ce que tu utilises souvent un store dans tes applications Angular ?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Et lors des échanges, &lt;strong&gt;deux visions reviennent régulièrement&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;D’un côté, ceux qui pensent que c’est &lt;em&gt;overkill&lt;/em&gt; dans la majorité des cas.&lt;/li&gt;
&lt;li&gt;De l’autre, ceux qui ont tendance à en mettre &lt;em&gt;partout&lt;/em&gt;, parfois par habitude.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alors, &lt;strong&gt;qui a raison&lt;/strong&gt; ? Et &lt;strong&gt;à quoi sert réellement un store&lt;/strong&gt; ?&lt;/p&gt;




&lt;h2&gt;
  
  
  Le rôle d’un store
&lt;/h2&gt;

&lt;p&gt;La documentation officielle de NgRx dit :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“NgRx Store provides reactive state management for Angular apps inspired by Redux. Unify the events in your application and derive state using RxJS.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ce petit paragraphe met en lumière un aspect souvent &lt;strong&gt;négligé&lt;/strong&gt; :&lt;br&gt;&lt;br&gt;
 &lt;strong&gt;l’unification des événements&lt;/strong&gt; dans l’application.&lt;/p&gt;

&lt;p&gt;Un store ne se limite pas à stocker des données. Il peut aussi agir comme un &lt;strong&gt;orchestrateur d’événements métier&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Pourquoi utiliser un store pour orchestrer des intentions métier ?
&lt;/h2&gt;

&lt;p&gt;Cela permet par exemple de &lt;strong&gt;découpler les composants&lt;/strong&gt; des services applicatifs :&lt;br&gt;&lt;br&gt;
les composants n’émettent que des &lt;strong&gt;intentions&lt;/strong&gt; (via des actions),&lt;br&gt;&lt;br&gt;
et ce sont les &lt;strong&gt;effects&lt;/strong&gt; ou handlers qui les traitent.&lt;/p&gt;

&lt;p&gt;Résultat : une &lt;strong&gt;architecture claire, modulaire&lt;/strong&gt;, et surtout &lt;strong&gt;testable&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🛒 Exemple concret : Ajouter un produit au panier
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🔻 Sans store :
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Échec&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isLoading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Avec NgRx (approche orientée événements) :
&lt;/h2&gt;

&lt;p&gt;Le composant ne sait rien de l'objet qui exécute le comportement associé à l'action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//component.ts &lt;/span&gt;

&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;


&lt;span class="c1"&gt;// effect.ts&lt;/span&gt;

&lt;span class="c1"&gt;// effect&lt;/span&gt;
&lt;span class="nf"&gt;createEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;actions$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;ofType&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;addToCart&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;exhaustMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cartService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;addToCartSuccess&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;product&lt;/span&gt; &lt;span class="p"&gt;})),&lt;/span&gt;
        &lt;span class="nf"&gt;catchError&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;addToCartFailure&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Et la gestion d’état ?
&lt;/h2&gt;

&lt;p&gt;Bien sûr, un store permet aussi de &lt;strong&gt;centraliser et structurer l’état global&lt;/strong&gt; de ton application.&lt;/p&gt;

&lt;p&gt;Mais &lt;strong&gt;si tu veux l’utiliser uniquement pour partager du state&lt;/strong&gt;, je te recommande de le faire &lt;strong&gt;seulement&lt;/strong&gt; si &lt;strong&gt;plusieurs composants doivent lire et écrire sur ces mêmes données&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  En résumé : quand utiliser un store ?
&lt;/h2&gt;

&lt;p&gt;Un store devient pertinent si :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tu dois orchestrer une logique métier via des événements&lt;/li&gt;
&lt;li&gt;Tu veux modéliser des intentions utilisateur de manière claire&lt;/li&gt;
&lt;li&gt;Tu partages un même état entre plusieurs composants&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quelques cas typiques :
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Une app de prise de rendez-vous (avec loading, erreurs, confirmations…)&lt;/li&gt;
&lt;li&gt;✅ Une app de chat ou de jeu en WebRTC&lt;/li&gt;
&lt;li&gt;✅ Un tunnel de paiement à étapes multiples&lt;/li&gt;
&lt;li&gt;✅ Des entités partagées dans plusieurs contextes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans tous ces cas, &lt;strong&gt;le store ne sert pas à stocker des données. Il sert à modéliser le comportement métier&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Et quand ne pas utiliser de store ?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pour des données statiques en lecture seule (ex : liste de pays)&lt;/li&gt;
&lt;li&gt;Pour un état local et isolé dans un seul composant&lt;/li&gt;
&lt;li&gt;Quand la logique métier est triviale et linéaire&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  En conclusion
&lt;/h2&gt;

&lt;p&gt;Ne mets pas un store pour chaque jeu de données.&lt;br&gt;
 Mais ne le rejette pas sous prétexte que ton app est “petite”.&lt;/p&gt;

&lt;p&gt;Mets un store quand tu veux &lt;strong&gt;modéliser clairement une interaction utilisateur, même locale.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ce qui compte, ce n’est pas &lt;strong&gt;la taille de ton app,&lt;br&gt;
mais la clarté de l’intention et la prévisibilité du comportement.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;💬 Et toi, dans quels cas choisis-tu d’utiliser un store ?&lt;br&gt;
Partage ton expérience ou pose tes questions en commentaire !&lt;/p&gt;

</description>
      <category>ngrx</category>
      <category>angular</category>
      <category>french</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
