Retour au blog

Monorepos avec Nx et Turborepo : Comment Gérer Plusieurs Projets Sans Perdre la Tête

Salut HaWkers, votre entreprise a frontend, backend, app mobile, bibliothèques partagées, le tout dans des dépôts séparés générant un chaos de versionnage ?

Les Monorepos sont apparus comme solution à ce problème. Google, Facebook, Microsoft - les géants de la tech maintiennent DES MILLIONS de lignes de code dans des dépôts uniques. En 2025, des outils comme Nx et Turborepo ont rendu cette approche accessible à n'importe quelle équipe. Explorons.

Qu'est-ce qu'un Monorepo et Pourquoi c'est Important

Monorepo : Un dépôt Git unique contenant plusieurs projets liés (apps, libs, packages).

Ne confondez pas avec :

  • Monolithe : Architecture d'application unique
  • Multirepo : Chaque projet dans un dépôt séparé

Nx : Le Géant Complet

Nx est développé par Nrwl et est le plus puissant et complexe. Google utilise Nx en interne pour gérer Angular, et l'outil supporte N'IMPORTE QUEL stack.

Setup Initial

# Créer un workspace Nx
npx create-nx-workspace@latest my-monorepo

# Choix : integrated (recommandé) ou package-based

# Structure générée :
my-monorepo/
├── apps/
   ├── frontend/          # App React/Vue/Angular
   ├── backend/           # API Node.js
   └── mobile/            # React Native
├── libs/
   ├── ui/                # Composants partagés
   ├── data-access/       # Couche de données
   └── utils/             # Utilitaires
├── nx.json                # Configuration Nx
└── package.json

Création d'Apps et Libs

# Générer une application React
nx g @nx/react:app frontend

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

# Générer une API Node.js
nx g @nx/node:app backend

# Générer une lib TypeScript pure
nx g @nx/js:lib utils --directory=libs/utils

Dependency Graph : Visualisation Puissante

# Voir le graphe de dépendances
nx graph

# Nx génère une visualisation interactive montrant :
# - Quelles apps dépendent de quelles libs
# - Les dépendances circulaires (erreurs !)
# - L'impact des changements

nx dependency graph

Builds Intelligents : Commandes Affected

# Tester UNIQUEMENT ce qui a changé
nx affected:test

# Build seulement les apps/libs affectées
nx affected:build

# Lint seulement le code modifié
nx affected:lint

# Comment Nx sait ce qui a changé ?
# Il compare avec la branche base (ex: main) et analyse les dépendances

Exemple Pratique

# Vous modifiez libs/utils/src/date.ts

# Nx détecte automatiquement :
# - apps/frontend dépend de libs/utils
# - apps/backend dépend de libs/utils
# - apps/mobile NE dépend PAS de libs/utils

# La commande affected:build ne rebuild que :
nx affected:build
# ✓ libs/utils
# ✓ apps/frontend
# ✓ apps/backend
# ⊗ apps/mobile (sauté !)

# Économie : 40-60% du temps de build

Turborepo : Simplicité et Vitesse

Turborepo (créé par Vercel) se concentre sur la simplicité et le caching agressif. Moins de features que Nx, mais setup instantané.

Setup Turborepo

# Créer un monorepo
npx create-turbo@latest my-turborepo

# Structure générée :
my-turborepo/
├── apps/
   ├── web/               # App Next.js
   └── docs/              # Documentation
├── packages/
   ├── ui/                # Component library
   ├── config/            # Configs partagées
   └── tsconfig/          # Configs TypeScript
├── turbo.json             # Config du pipeline
└── package.json

Configuration du Pipeline

// turbo.json
{
  "$schema": "https://turbo.build/schema.json",
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**"]
    },
    "test": {
      "dependsOn": ["build"],
      "outputs": ["coverage/**"]
    },
    "lint": {
      "outputs": []
    },
    "dev": {
      "cache": false
    }
  }
}

Exécution des Tâches

# Build tout (avec cache)
turbo run build

# Test en parallèle maximum
turbo run test

# Mode dev sur plusieurs apps
turbo run dev --parallel

# Cache distant (Vercel)
turbo run build --token=<your-token>
# Cache partagé entre toute l'équipe !

Nx vs Turborepo : Comparaison Directe

Performance : Nx Gagne à l'Échelle

Benchmarks officiels (large-monorepo) :

  • Nx : ~50s pour un build complet
  • Turborepo : ~350s pour un build complet
  • Nx est 7x plus rapide dans les grands monorepos !

Simplicité : Turborepo Gagne

# Turborepo : Setup en minutes
npx create-turbo@latest

# Nx : Plus de décisions initiales
npx create-nx-workspace@latest
# → Choisir le preset
# → Configurer le CI
# → Définir la stratégie de caching

Écosystème : Nx Plus Complet

Nx offre :

  • Plugins officiels (React, Angular, Node, Next, Nest, etc)
  • Generators (scaffolding de code automatique)
  • Migrate (mise à jour automatique des dépendances)
  • Nx Cloud (caching distribué enterprise)

Turborepo offre :

  • Système core de build/cache (extrêmement rapide)
  • Intégration parfaite avec Vercel
  • Simplicité (moins d'abstractions)

Quand Utiliser Chacun ?

Utilisez Nx si :

  • Grand monorepo (10+ apps/libs)
  • Grande équipe (15+ devs)
  • Technologies multiples (React + Angular + Node)
  • Besoin de CI/CD complexe
  • Vous voulez des outils avancés (generators, migrations)

Utilisez Turborepo si :

  • Monorepo petit/moyen (< 10 projets)
  • Stack homogène (ex: uniquement Next.js)
  • Petite équipe (< 10 devs)
  • Vous valorisez la simplicité sur les features
  • Vous utilisez Vercel pour le déploiement

Exemple Pratique : Bibliothèque de Composants Partagés

// packages/ui/src/Button.tsx
import React from 'react';

export interface ButtonProps {
  variant?: 'primary' | 'secondary';
  children: React.ReactNode;
  onClick?: () => void;
}

export function Button({ variant = 'primary', children, onClick }: ButtonProps) {
  return (
    <button
      className={`btn btn-${variant}`}
      onClick={onClick}
    >
      {children}
    </button>
  );
}

// apps/web/pages/index.tsx
import { Button } from '@my-monorepo/ui';

export default function Home() {
  return (
    <div>
      <h1>Mon App</h1>
      <Button variant="primary">Cliquez-moi</Button>
    </div>
  );
}

// apps/admin/pages/dashboard.tsx
import { Button } from '@my-monorepo/ui';

export default function Dashboard() {
  return (
    <div>
      <h1>Dashboard Admin</h1>
      <Button variant="secondary">Paramètres</Button>
    </div>
  );
}

// Les changements dans packages/ui affectent LES DEUX apps
// Nx/Turborepo rebuildent automatiquement

CI/CD Optimisé pour Monorepos

# .github/workflows/ci.yml (Nx)
name: CI

on: [push]

jobs:
  main:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0 # Important pour affected

      - uses: actions/setup-node@v3

      - run: npm ci

      # Exécute UNIQUEMENT les tests affectés
      - run: npx nx affected:test --base=origin/main

      # Build seulement les apps modifiées
      - run: npx nx affected:build --base=origin/main

      # Déploiement conditionnel
      - run: npx nx affected --target=deploy --base=origin/main
# .github/workflows/ci.yml (Turborepo)
name: CI

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - uses: actions/setup-node@v3

      - run: npm ci

      # Cache distant Vercel
      - run: npx turbo run test --token=${{ secrets.TURBO_TOKEN }}

      - run: npx turbo run build --token=${{ secrets.TURBO_TOKEN }}

Pièges Courants

1. Dépendances Fantômes

L'app fonctionne localement mais casse en production car elle dépendait d'une lib non déclarée.

Solution : Utilisez le mode --strict dans Nx, ou externals dans Turborepo.

2. Builds Lents au Début

Le premier build peut être TRÈS lent.

Solution : Configurez le cache distant (Nx Cloud ou Turborepo Remote Cache).

3. Conflits de Version

Plusieurs apps ont besoin de versions différentes de React.

Solution : Utilisez resolutions (Yarn) ou overrides (npm) avec précaution.

L'Avenir des Monorepos

  • Outils basés sur Rust (comme Turbopack) apportant des performances 10x supérieures
  • Refactoring propulsé par l'IA qui comprend les dépendances complexes
  • Exécution distribuée native (builds sur plusieurs machines)

Les Monorepos ne sont pas pour tous les projets, mais pour les équipes qui gèrent plusieurs apps liées, c'est un game changer. Choisissez Nx pour la puissance maximale, Turborepo pour la simplicité maximale.

Si vous voulez comprendre des patterns qui aident dans n'importe quel projet, grand ou petit, consultez : Raccourcis pour les Opérations Conditionnelles où nous explorons du code propre et efficace.

C'est parti !

💻 Maîtrisez JavaScript pour de Vrai

Les connaissances que vous avez acquises dans cet article ne sont que le début. Il existe des techniques, des patterns et des pratiques qui transforment les développeurs débutants en professionnels recherchés.

Investissez dans Votre Avenir

J'ai préparé un matériel complet pour vous aider à maîtriser JavaScript :

Modes de paiement :

  • 9,90€ (paiement unique)

📖 Voir le Contenu Complet

Commentaires (0)

Cet article n'a pas encore de commentaires. Soyez le premier!

Ajouter des commentaires