learn.chetana.fr

Pinia et l'architecture d'un front temps réel

13 min readCore

Pinia : l'état qui appartient à l'application

Les composables donnent de l'état par appelant ; certaines données appartiennent à l'application entiÚre (l'utilisateur connecté, le panier, les préférences). C'est le rÎle du store Pinia :

export const useCartStore = defineStore('cart', () => {
  const lines = ref<QuoteLine[]>([])                          // state
  const total = computed(() => lines.value.reduce(...))        // getter
  async function addLine(variant: Variant, qty: number) { ... }  // action
  return { lines, total, addLine }
})

MĂȘme grammaire que les composables (ref/computed/fonctions) — mais singleton : tous les composants qui appellent useCartStore() voient LE mĂȘme Ă©tat. La rĂšgle de partage : Ă©tat local d'une feature → composable ; Ă©tat transverse de l'app → store. Le projet copilot suit exactement ça : Pinia pour l'app (session, prĂ©fĂ©rences, avec persistedstate), composables pour le copilot.

Le cas d'école : anatomie du front copilot

Le dĂ©fi : un chat streamĂ© en SSE, une UI gĂ©nĂ©rĂ©e par le LLM, des tools qui s'exĂ©cutent au navigateur, un state synchronisĂ© par patches — sans plat de spaghettis. La rĂ©ponse, en couches :

[protocole]   sse-stream.ts, ag-ui-protocol.ts   ← parser le flux, typer les Ă©vĂ©nements
[état]        useCopilotRun / Messages / CanvasPanel / Hitl / FrontendTools
              chaque composable possÚde SA tranche d'état, le run les orchestre
[rendu]       registry ag-ui : spec de bloc validĂ©e → composant NuxtUI montĂ©
[pages]       assemblent — et ne savent presque rien

Les trois décisions qui font que ça tient :

  1. le protocole est isolĂ© : un seul fichier sait parser du SSE — tout le reste consomme des Ă©vĂ©nements typĂ©s (changer de transport ne toucherait qu'un fichier) ;
  2. l'Ă©tat est dĂ©coupĂ© par responsabilitĂ© (les ~25 composables) — pas un « mĂ©ga-store copilot » que tout le monde mute ;
  3. le rendu est dĂ©claratif : les Ă©vĂ©nements muettent l'Ă©tat, le template dĂ©rive de l'Ă©tat — personne ne touche le DOM Ă  la main. Le flux est Ă  sens unique : Ă©vĂ©nement SSE → Ă©tat → rendu, la boucle rĂ©active de la leçon 1 Ă  l'Ă©chelle d'une app.
đŸ§© Quiz1/3

Store Pinia vs composable : la rĂšgle de partage :

🃏 Flashcards1/4