Commencer avec Nx pour la gestion de monorepo

La gestion de plusieurs projets liés peut rapidement devenir complexe. À mesure que votre base de code grandit, vous avez besoin d’outils qui aident à maintenir la cohérence, partager le code efficacement et optimiser les temps de build. Nx est une solution puissante conçue spécifiquement pour ces défis.
Ce guide vous montrera comment configurer et utiliser Nx pour gérer un monorepo efficacement. Vous apprendrez les concepts fondamentaux, créerez un espace de travail de base et comprendrez comment les fonctionnalités intelligentes de Nx peuvent considérablement améliorer votre flux de développement.
Points clés à retenir
- Nx simplifie la gestion de monorepo avec un suivi des dépendances, une mise en cache et une génération de code puissants
- Les graphiques de projet aident à visualiser les relations entre les composants de votre base de code
- Les commandes affected économisent du temps en ne construisant et testant que ce qui a changé
- Les bibliothèques partagées permettent une réutilisation efficace du code entre les applications
- La mise en cache intelligente accélère considérablement les builds dans les environnements de développement et de CI
Qu’est-ce qu’un monorepo ?
Un monorepo est une stratégie de contrôle de version où plusieurs projets sont stockés dans un seul dépôt. Contrairement à avoir des dépôts séparés pour chaque projet (polyrepo), un monorepo contient tous les projets liés en un seul endroit.
Avantages des monorepos
- Partage de code - Réutiliser le code entre projets sans gestion complexe de packages
- Changements atomiques - Mettre à jour plusieurs projets en un seul commit
- Outillage cohérent - Appliquer les mêmes standards de développement à tous les projets
- Dépendances simplifiées - Gérer les relations entre projets en un seul endroit
- Releases coordonnées - Synchroniser les mises à jour entre projets interdépendants
Cependant, les monorepos introduisent des défis comme la gestion des dépendances de build et la montée en charge à mesure que votre base de code grandit. C’est là qu’intervient Nx.
Qu’est-ce que Nx ?
Nx est un système de build extensible conçu spécifiquement pour la gestion de monorepo. Développé initialement pour les applications Angular, Nx prend maintenant en charge plusieurs frameworks frontend et backend incluant React, Vue, Node.js, et plus encore.
Fonctionnalités clés de Nx
- Mise en cache intelligente - Évite de reconstruire le code inchangé
- Graphique de dépendances - Visualise les relations entre projets
- Commandes affected - Ne construit et teste que ce qui est impacté par vos changements
- Générateurs de code - Crée des structures de projet cohérentes
- Plugins extensibles - Prend en charge divers frameworks et outils
Configuration de votre premier espace de travail Nx
Créons un espace de travail Nx de base avec une application React et une bibliothèque partagée.
Prérequis
- Node.js (v14 ou plus récent)
- npm ou yarn
Création d’un espace de travail Nx
# Installer la CLI Nx globalement (optionnel)
npm install -g nx
# Créer un nouvel espace de travail
npx create-nx-workspace@latest my-workspace
Pendant la configuration, vous serez invité à choisir :
- Quelle stack utiliser (sélectionnez “React”)
- Nom de l’application (ex : “web-app”)
- Format de style (CSS, SCSS, etc.)
- Configuration Nx Cloud (optionnel mais recommandé pour les projets d’équipe)
Ceci crée un espace de travail avec la structure suivante :
my-workspace/
├── apps/
│ └── web-app/
├── libs/
├── nx.json
├── package.json
└── tsconfig.base.json
Comprendre la structure de l’espace de travail
- apps/ - Contient vos applications (frontend, backend, mobile)
- libs/ - Contient les bibliothèques de code partagé utilisées dans les applications
- nx.json - Configure le comportement et les plugins de Nx
- package.json - Gère les dépendances pour tout l’espace de travail
Ajouter des projets à votre espace de travail
Ajoutons maintenant une bibliothèque UI partagée et voyons comment Nx gère les dépendances.
Création d’une bibliothèque partagée
nx g @nx/react:lib ui-components
Ceci crée une bibliothèque dans libs/ui-components/
qui peut être importée par n’importe quelle application dans votre espace de travail.
Création d’un composant dans la bibliothèque
nx g @nx/react:component button --project=ui-components --export
Ceci génère un composant Button dans votre bibliothèque UI et l’exporte pour utilisation dans d’autres projets.
Utilisation de la bibliothèque dans votre application
Modifiez votre application pour utiliser le nouveau composant :
// apps/web-app/src/app/app.tsx
import { Button } from '@my-workspace/ui-components';
export function App() {
return (
<div>
<h1>Welcome to My App</h1>
<Button>Click me</Button>
</div>
);
}
Exécution de tâches avec Nx
Nx fournit une façon unifiée d’exécuter des tâches dans vos projets.
Commandes courantes
# Démarrer le serveur de développement
nx serve web-app
# Construire l'application
nx build web-app
# Exécuter les tests
nx test web-app
# Linter le code
nx lint web-app
Exécution de tâches pour tous les projets
nx run-many --target=build --all
Tirer parti des fonctionnalités intelligentes de Nx
La puissance de Nx devient évidente à mesure que votre espace de travail grandit. Explorons ses fonctionnalités les plus précieuses.
Visualisation des dépendances de projet
nx graph
Ceci ouvre une visualisation interactive de vos dépendances de projet, vous aidant à comprendre l’architecture de votre monorepo.
Comprendre les projets affectés
Quand vous apportez des changements, Nx peut déterminer quels projets sont affectés :
nx affected:graph
Ceci montre seulement les projets impactés par vos changements récents.
Construire seulement ce qui a changé
nx affected --target=build
Ceci construit seulement les projets affectés par vos changements, économisant un temps significatif dans les pipelines CI/CD.
Mise en cache pour la vitesse
Nx met automatiquement en cache les résultats des tâches. Si vous exécutez la même tâche avec les mêmes entrées, Nx utilise le résultat en cache au lieu de l’exécuter à nouveau :
# Première exécution (exécute la tâche)
nx build web-app
# Deuxième exécution (utilise le cache)
nx build web-app
Configuration de l’espace de travail Nx
Le fichier nx.json
contrôle le comportement de Nx. Voici une configuration de base :
{
"npmScope": "my-workspace",
"affected": {
"defaultBase": "main"
},
"tasksRunnerOptions": {
"default": {
"runner": "nx/tasks-runners/default",
"options": {
"cacheableOperations": ["build", "lint", "test", "e2e"]
}
}
},
"targetDefaults": {
"build": {
"dependsOn": ["^build"]
}
}
}
Paramètres clés :
- npmScope - Le préfixe pour importer les bibliothèques
- affected.defaultBase - La branche git à comparer
- cacheableOperations - Les tâches qui doivent être mises en cache
- dependsOn - Les dépendances de tâches (ex : construire les bibliothèques avant les applications)
Exemple concret : Application full-stack
Créons un exemple plus complet avec un frontend React et un backend Node.js :
# Créer une app React
nx g @nx/react:app client
# Créer une API Node.js
nx g @nx/node:app api
# Créer une bibliothèque de types partagés
nx g @nx/js:lib shared-types
Ceci vous donne un espace de travail avec :
- Une application client React
- Un serveur API Node.js
- Une bibliothèque partagée pour les types communs
Vous pouvez exécuter les deux applications simultanément :
nx run-many --target=serve --projects=api,client --parallel
Conclusion
Nx rend la gestion de monorepo simple et efficace. En gérant la complexité des dépendances de projet et l’optimisation des builds, il vous permet de vous concentrer sur l’écriture de code plutôt que sur la gestion de la structure de votre dépôt. Commencez avec une configuration simple comme montré dans ce guide, et étendez à mesure que votre projet grandit.
FAQ
Nx fournit des fonctionnalités plus avancées comme la mise en cache de calculs, les commandes affected et la génération de code. Il offre aussi de meilleurs outils de visualisation et prend en charge plus de frameworks prêts à l'emploi.
Oui, Nx fournit des outils pour l'adopter de manière incrémentale dans les projets existants. Vous pouvez commencer par ajouter Nx à votre dépôt et déplacer progressivement les projets dans la structure d'espace de travail Nx.
Oui, Nx fonctionne avec tous les systèmes CI/CD majeurs. Il fournit des intégrations spécifiques pour GitHub Actions, CircleCI et d'autres pour optimiser les temps de build en utilisant ses fonctionnalités de mise en cache.
Nx prend en charge à la fois le versioning unifié (tous les projets partagent la même version) et le versioning indépendant (chaque projet a sa propre version) via des plugins comme @nx/npm-package.
Bien que Nx fonctionne mieux avec JavaScript et TypeScript, il prend en charge d'autres langages via des plugins. Il y a un support croissant pour Go, Python et d'autres langages.
Oui, Nx peut être utilisé pour des projets autonomes pour profiter de ses fonctionnalités de mise en cache, d'exécution de tâches et de génération de code, même sans plusieurs projets.