DevToolBoxGRATUIT
Blog

Outils Monorepo 2026 : Turborepo vs Nx vs Lerna vs pnpm Workspaces

15 minpar DevToolBox

Un monorepo améliore le partage de code, la refactorisation et la gestion des dépendances. En 2026, les trois approches dominantes sont Turborepo, Nx et pnpm Workspaces.

Turborepo : configuration et structure

Turborepo est optimisé pour les monorepos JavaScript/TypeScript avec un cache agressif.

# Create a new Turborepo monorepo
npx create-turbo@latest my-monorepo
cd my-monorepo

# Or add Turborepo to an existing monorepo
npm install turbo --save-dev

# Directory structure
my-monorepo/
├── apps/
│   ├── web/          # Next.js app
│   └── docs/         # Docs site
├── packages/
│   ├── ui/           # Shared React components
│   ├── utils/        # Shared utilities
│   └── tsconfig/     # Shared TypeScript configs
├── turbo.json        # Pipeline configuration
└── package.json      # Root workspace config

Configuration du pipeline Turborepo

Le pipeline turbo.json définit comment les tâches se rapportent les unes aux autres.

// turbo.json — pipeline definition
{
    "$schema": "https://turbo.build/schema.json",
    "pipeline": {
        "build": {
            "dependsOn": ["^build"],   // ^ means: run in dependency order
            "outputs": [".next/**", "!.next/cache/**", "dist/**"]
        },
        "test": {
            "dependsOn": ["^build"],
            "inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts"]
        },
        "lint": {
            "outputs": []
        },
        "dev": {
            "cache": false,            // Never cache dev servers
            "persistent": true         // Long-running task
        },
        "type-check": {
            "dependsOn": ["^build"],
            "outputs": []
        }
    },
    "globalEnv": ["NODE_ENV", "DATABASE_URL"]
}

# Run all build tasks (uses cache if inputs unchanged)
npx turbo build

# Run only for specific apps/packages
npx turbo build --filter=web
npx turbo build --filter=...ui  # ui and all its dependents

# Force re-run (bypass cache)
npx turbo build --force

# View task graph
npx turbo build --graph

Nx : configuration et graphe de projet

Nx offre un ensemble de fonctionnalités plus riche : générateurs de code, commandes affected.

# Create Nx monorepo
npx create-nx-workspace@latest my-nx-repo --preset=ts

# Add Nx to existing monorepo
npx nx@latest init

# Generate a new app or library
nx generate @nx/next:app web
nx generate @nx/react:library ui
nx generate @nx/node:library utils

# nx.json — workspace configuration
{
    "tasksRunnerOptions": {
        "default": {
            "runner": "nx/tasks-runners/default",
            "options": {
                "cacheableOperations": ["build", "test", "lint", "e2e"],
                "parallel": 3
            }
        }
    },
    "targetDefaults": {
        "build": {
            "dependsOn": ["^build"],
            "inputs": ["production", "^production"]
        }
    },
    "namedInputs": {
        "default": ["{projectRoot}/**/*", "sharedGlobals"],
        "production": ["default", "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)"],
        "sharedGlobals": []
    }
}

pnpm Workspaces : approche légère

pnpm workspaces fournit un support natif des monorepos sans outils supplémentaires.

# pnpm-workspace.yaml
packages:
  - 'apps/*'
  - 'packages/*'

# Install all workspace dependencies
pnpm install

# Add a package to a specific workspace
pnpm add react --filter @myapp/web

# Add a local workspace package as dependency
# In apps/web/package.json:
{
    "dependencies": {
        "@myapp/ui": "workspace:*"
    }
}

# Run scripts across all packages
pnpm --filter '*' run build
pnpm --filter './apps/*' run dev
pnpm --filter '...@myapp/ui' run test  # ui and dependents

# Publish all public packages
pnpm publish -r --access public

Cache distant

Le cache distant partage les artefacts entre développeurs et systèmes CI.

# Turborepo Remote Cache (Vercel)
# Enables sharing build cache across developers and CI

# 1. Link to Vercel
npx turbo login
npx turbo link

# 2. Now CI builds share cache with local dev:
# CI run: builds from scratch, uploads to cache
# Developer: pulls cache, gets instant builds

# Self-host with Turborepo Remote Cache (open source)
# docker run -p 3000:3000 ducktors/turborepo-remote-cache

# .turbo/config.json (auto-generated by turbo link)
{
    "teamId": "team_xxx",
    "apiUrl": "https://vercel.com"
}

# Nx Cloud (similar offering from Nx)
# nx connect-to-nx-cloud
# Provides remote caching + task distribution

Versionnage avec Changesets

Changesets est l'outil standard pour versionner et publier des packages dans un monorepo.

# Changesets — versioning and publishing for monorepos
# Works with npm/yarn/pnpm workspaces

pnpm add -D @changesets/cli
pnpm changeset init

# When you make a change that needs a version bump:
pnpm changeset
# → Interactive prompt: which packages changed, bump type (major/minor/patch)

# Creates a markdown file in .changeset/ describing the change
# Example .changeset/funny-bears-dance.md:
---
"@myapp/ui": minor
"@myapp/utils": patch
---

Add new Button component with loading state

# Apply changesets (bumps versions, updates CHANGELOG.md)
pnpm changeset version

# Publish all changed packages
pnpm changeset publish

Turborepo vs Nx vs pnpm Workspaces

FeatureTurborepoNxpnpm Workspaces
Setup complexityLowMediumVery Low
Task cachingBuilt-inBuilt-inManual/external
Remote cacheVercel (free tier)Nx Cloud (paid)None built-in
Code generatorsNoYes (rich)No
Affected detectionBasic (--filter)Advanced (nx affected)Via Changesets
Language supportJS/TS focusedPolyglotAny
Learning curveLowMedium-HighLow

Bonnes pratiques

  • Commencer avec pnpm workspaces + Turborepo.
  • Définir des limites claires : packages partagés dans packages/, applications dans apps/.
  • Utiliser Changesets pour le versionnage et la publication.
  • Activer le cache distant tôt.
  • Garder le package.json de chaque package explicite.

FAQ

Turborepo ou Nx ?

Turborepo est plus simple pour la plupart des projets JavaScript. Nx a plus de fonctionnalités pour les grands dépôts.

Monorepo vs polyrepo ?

Un monorepo stocke tout le code dans un dépôt. Polyrepo a des dépôts séparés par package.

Comment fonctionne le cache Turborepo ?

Turborepo hache les entrées de chaque tâche. Si le hash correspond à une exécution précédente, il restaure les sorties du cache.

Peut-on avoir différents gestionnaires de packages ?

Non. Tous les workspaces doivent utiliser le même gestionnaire de packages.

Comment gérer les variables d'environnement ?

Définir les variables d'environnement par application. Les lister dans turbo.json globalEnv.

Outils associés

𝕏 Twitterin LinkedIn
Cet article vous a-t-il aidé ?

Restez informé

Recevez des astuces dev et les nouveaux outils chaque semaine.

Pas de spam. Désabonnez-vous à tout moment.

Essayez ces outils associés

{ }JSON Formatter.git.gitignore Generator

Articles connexes

Bun Package Manager : Le Runtime JavaScript le Plus Rapide en 2026

Guide complet de Bun 2026 : installation, workspaces, scripts et pourquoi il est plus rapide que npm/yarn/pnpm.

Docker Multi-Stage Builds : Optimiser les Images pour la Production

Maîtriser les builds multi-étapes Docker 2026 : réduire la taille des images, séparer dépendances build et runtime.

Strategies de branchement Git : GitFlow vs Trunk-Based vs GitHub Flow

Comparaison des strategies GitFlow, Trunk-Based Development et GitHub Flow. Structures de branches, workflows de fusion, integration CI/CD et choix de la bonne strategie.