Aller au contenu principal

NX Monorepo

NX est un système de build open-source qui orchestre les monorepos. Il ajoute du cache, des graphes de dépendances, des générateurs de code et des commandes affected par-dessus un workspace Angular (ou multi-framework).

Structure d'un monorepo

my-workspace/
├── apps/
│ ├── shop/ ← Application Angular
│ └── admin/ ← Autre application Angular
├── libs/
│ ├── ui/ ← Bibliothèque de composants partagés
│ ├── data-access/ ← Services et modèles partagés
│ └── utils/ ← Fonctions utilitaires pures
├── nx.json ← Config globale NX
├── tsconfig.base.json ← Aliases de chemins partagés
└── package.json

Créer un workspace

npx create-nx-workspace@latest my-workspace
# → Choisir : Angular / Integrated Monorepo

Commandes essentielles

# Démarrer une app
nx serve shop

# Builder une app
nx build shop --configuration=production

# Lancer les tests
nx test shop
nx test ui

# Générer une nouvelle app
nx g @nx/angular:app admin

# Générer une bibliothèque partagée
nx g @nx/angular:lib ui --directory=libs/ui

# Générer un composant dans une lib
nx g @nx/angular:component button --project=ui --export

Bibliothèques partagées et aliases de chemins

Quand vous générez une lib, NX enregistre automatiquement un alias de chemin dans tsconfig.base.json :

{
"compilerOptions": {
"paths": {
"@my-workspace/ui": ["libs/ui/src/index.ts"],
"@my-workspace/data-access": ["libs/data-access/src/index.ts"]
}
}
}

Consommez-la depuis n'importe quelle app :

import { ButtonComponent } from '@my-workspace/ui';

Aucun npm publish nécessaire — les bibliothèques sont résolues localement.

Graphe de dépendances

nx graph

Ouvre une vue navigateur interactive montrant quelles apps dépendent de quelles libs. Les dépendances circulaires sont signalées automatiquement.

Règle : les apps dépendent des libs, jamais l'inverse. Les libs peuvent dépendre d'autres libs.

Commandes affected (optimisation CI)

NX analyse le graphe de dépendances pour savoir ce qu'un changement impacte :

# Ne builder que ce qui a changé + ses dépendants
nx affected --target=build

# Ne tester que ce qui a changé + ses dépendants
nx affected --target=test

# Exécuter en parallèle
nx affected --target=build --parallel=3

En CI, cela évite de reconstruire et retester tout le monorepo à chaque commit.

Conventions de nommage des bibliothèques

TypeContenuExemple de nom
featureComposants smart, pages, routingfeature-checkout
uiComposants présentationnelsui-button, ui-form
data-accessServices, store, appels HTTPdata-access-products
utilFonctions pures, helpersutil-formatting

NX vs Workspace Angular natif

FonctionnalitéWorkspace AngularNX
Multi-appsBasiqueAvancé
Cache de buildAucunLocal + Cloud
Graphe de dépendancesAucunVisuel
Générateurs de codeLimitéÉcosystème de plugins
Builds affectésAucunnx affected