Schema concettuale dell’architettura di un progetto React basata su responsabilità e composizione

Architettura React: come strutturare un progetto senza framework mentali sbagliati

Molti progetti React diventano fragili per colpa di strutture mentali sbagliate. Qui trovi un approccio architetturale coerente con stato, composizione e cambiamento.

Dopo aver chiarito che React non è HTML, non è MVC e non vive di hook accumulati, resta l’ultimo errore strutturale da eliminare:

👉 organizzare il progetto React copiando modelli mentali che non gli appartengono.

Cartelle controllers, models, views.
Oppure separazioni forzate per “tipo di file”.
O peggio: una struttura che cresce per imitazione, non per necessità.

Il risultato è sempre lo stesso:

  • codice frammentato
  • responsabilità confuse
  • onboarding lento
  • refactor costosi

Il problema non è la struttura in sé.
È il criterio con cui la scegli.


React non chiede una struttura “giusta”. Chiede una struttura coerente

Una verità scomoda:

React non impone un’architettura.

Ed è proprio questo che manda in crisi.

Chi viene da framework opinionati cerca:

  • regole rigide
  • cartelle standard
  • pattern “ufficiali”

React invece ti chiede di fare una cosa più difficile:
👉 pensare in termini di responsabilità e cambiamento nel tempo.

Questo approccio è coerente con quanto spiegato nella documentazione ufficiale quando React parla di composizione e separazione logica, non di layer architetturali fissi (vedi Thinking in React su react.dev).


L’errore più comune: separare per “tipo” invece che per “dominio”

Struttura tipica sbagliata:

components/
hooks/
services/
utils/
pages/

Sembra ordinata.
Ma nasconde un problema serio: la logica di una feature è sparsa ovunque.

Per capire come funziona una singola funzionalità devi:

  • saltare tra cartelle
  • tenere tutto in testa
  • ricostruire il flusso

Questa non è architettura.
È frammentazione.


Un criterio migliore: separare per responsabilità funzionale

In React funziona meglio un approccio feature-oriented.

Non separi per “cos’è” un file.
Separi per cosa fa nel dominio dell’app.

Esempio concettuale:

features/
  auth/
    AuthForm.jsx
    useAuth.js
    authService.js
  profile/
    ProfileView.jsx
    useProfile.js
    profileService.js

Qui:

  • tutto ciò che cambia insieme sta insieme
  • la logica è localizzata
  • l’impatto di una modifica è prevedibile

Questo modello riduce:

  • accoppiamento
  • dipendenze nascoste
  • paura del refactor

I componenti non sono “view”: sono unità di comportamento

Altro errore mentale:

“Questo è un componente di presentazione, questo è logica.”

In React questa distinzione è spesso artificiale.

Un componente può:

  • gestire stato
  • reagire a eventi
  • renderizzare UI

E va bene così.

Forzare separazioni premature crea:

  • wrapper inutili
  • prop drilling
  • componenti fantasma

React non ti chiede purezza architetturale.
Ti chiede chiarezza.


Dove mettere lo stato (e dove NO)

Una struttura sana riflette ciò che abbiamo già chiarito sullo stato:

  • stato locale → vicino a chi lo usa
  • stato condiviso → sale solo quando serve
  • stato globale → raro e intenzionale

Se la struttura ti obbliga a:

  • spostare stato “perché la cartella lo impone”
  • centralizzare tutto “per ordine”

stai facendo architettura contro React, non con React.


Attenzione ai “framework mentali importati”

Alcuni segnali che stai importando modelli sbagliati:

  • cartelle MVC in un progetto React
  • servizi che “decidono cosa fare”
  • componenti passivi che aspettano istruzioni
  • logica nascosta fuori dal flusso di rendering

React funziona meglio quando:

  • le decisioni emergono dallo stato
  • il rendering è conseguenza, non comando
  • la struttura segue il dominio, non la tecnologia

Questo è coerente anche con le linee guida MDN su React, dove il focus è sempre su flusso dei dati e responsabilità, non su layer architetturali rigidi.


Una struttura “giusta” è quella che regge il cambiamento

La domanda corretta non è:

“Questa struttura è elegante?”

Ma:

“Quando cambierà questa feature, quante cose dovrò toccare?”

Se la risposta è:

  • “poche, e so dove” → stai facendo bene
  • “dipende, devo cercare” → stai accumulando debito

Una buona architettura React:

  • non impressiona
  • non è accademica
  • sopravvive al cambiamento

Conclusione: l’architettura non è una cartella, è una decisione continua

React non ti dà un’architettura perché:

  • ogni app è diversa
  • ogni dominio ha priorità diverse
  • ogni team evolve

Ma ti dà un modello chiaro:

  • stato come fonte di verità
  • composizione come strumento
  • flusso unidirezionale come garanzia

Se costruisci la struttura seguendo questi principi,
non avrai bisogno di “pattern salvifici”.

Avrai un progetto:

  • leggibile
  • manutenibile
  • onesto

E questo, nel tempo, vale più di qualunque struttura “perfetta”.