Stop Circular Dependencies With SDP

Le dipendenze circolari sono killer silenziosi. Non causano errori di build. Non causano eccezioni a runtime durante l'importazione. Invece, causano sottili valori undefined che compaiono in produzione settimane dopo.

Un ciclo si verifica quando il Modulo A importa da B, e B importa a sua volta da A.

JavaScript risolve queste importazioni silenziosamente. Se il Modulo A è ancora in fase di caricamento quando il Modulo B lo richiede, JavaScript restituisce un oggetto vuoto. Il codice fallisce in un secondo momento e lo stack trace punta al posto sbagliato.

Puoi risolvere il problema con dependency-cruiser. Questo strumento scansiona i tuoi file e mappa il tuo grafo delle dipendenze. Funziona con TypeScript e i monorepo.

Come configurarlo:

  • Aggiungilo alle tue dev dependencies: yarn add -D dependency-cruiser
  • Aggiungi uno script al tuo package.json: "depcruise": "depcruise packages --config .dependency-cruiser.js"
  • Crea un file .dependency-cruiser.js per intercettare i cicli.

Ma trovare un ciclo è solo metà della battaglia. Devi impedire che si formino.

Usa il Stable Dependencies Principle (SDP). Questa regola afferma che devi dipendere nella direzione della stabilità.

La stabilità è una proprietà strutturale. Un modulo è stabile quando molti altri moduli dipendono da esso. Se modifichi un modulo stabile, influenzi molte persone. Questo costo lo rende stabile.

Usa la formula dell'instabilità: I = Fan-Out / (Fan-In + Fan-Out)

• I = 0 significa che un modulo è massimamente stabile. Tutto dipende da esso, ed esso non dipende da nulla. • I = 1 significa che un modulo è massimamente instabile. Dipende da molte cose, e nulla dipende da esso.

La regola: il punteggio di instabilità di un modulo deve essere superiore al punteggio di ogni modulo che importa. Le tue frecce devono puntare verso una minore instabilità.

Le tue utility di basso livello (I ≈ 0) non dovrebbero mai importare dalle tue pagine di alto livello (I ≈ 1).

Puoi trasformare questo principio in una regola automatizzata con dependency-cruiser. Invece di limitarti a cercare i cicli, controlla la direzione:

  • Impedisci alle utility di importare dalle feature.
  • Impedisci alle feature di importare dalle pagine.

Questo interrompe le condizioni strutturali che creano i cicli. Smetti di reagire ai bug e inizi a prevenirli.

Fonte: https://dev.to/wojciech_kot_b82f5d7cbfc6/stop-circular-dependencies-before-they-stop-you-dependency-cruiser-the-stable-dependencies-34ho