Nehos Groupe
Définition & Concepts

Monorepo (Turborepo, Nx)

Version Décideur

L'essentiel

Imaginez une agence web qui développe trois produits en parallèle : un site Next.js, un back-office Payload, et une librairie de composants utilisée par les deux. En polyrepo, ce sont trois dépôts Git séparés. Pour modifier un composant partagé, vous modifiez le repo 'ui', publiez une nouvelle version npm, mettez à jour la version dans les deux autres repos. Trois commits, deux pull requests croisées, risque de désynchronisation. En monorepo, tout est dans le même dépôt. Vous modifiez le composant dans `packages/ui`, et les applications `apps/web` et `apps/api` utilisent automatiquement la version locale modifiée. Un seul commit, une seule PR, zéro désynchronisation possible. Turborepo gère la partie 'ne rebuilder que ce qui a changé'. Si vous modifiez uniquement `packages/ui`, il ne rebuilde que `packages/ui` et les apps qui en dépendent — pas les autres. Sur un monorepo de 8 packages, ça peut passer de 12 minutes de CI à 90 secondes.

Version Expert

Détails Techniques

Un monorepo (contraction de monolithic repository) est une stratégie d'organisation du code source où plusieurs projets distincts — applications, librairies, outils — cohabitent dans un seul dépôt Git. Ils partagent potentiellement des dépendances, des configurations et des utilitaires communs. Structure type d'un monorepo JavaScript/TypeScript avec pnpm workspaces : ``` monorepo/ ├── apps/ │ ├── web/ # Next.js 16 (site public) │ └── api/ # Payload CMS (backend) ├── packages/ │ ├── ui/ # Composants React partagés │ ├── config-eslint/ # Config ESLint commune │ ├── config-ts/ # tsconfig.json de base │ └── types/ # Types TypeScript partagés ├── pnpm-workspace.yaml └── turbo.json ``` **Turborepo** (Vercel) : orchestrateur de pipeline de build. Chaque tâche (build, test, lint, typecheck) est déclarée dans `turbo.json` avec ses dépendances et ses artefacts cachés. Turborepo calcule un hash des inputs (fichiers sources + dépendances) : si le hash est identique à un build précédent, la tâche est sautée et l'artefact restauré depuis le cache (local ou remote cache via Vercel). Résultat : `turbo build` sur un projet non modifié s'exécute en 200 ms au lieu de 4 minutes. **Nx** (Nrwl) : solution plus complète avec affected commands (`nx affected:build` = ne builder que les packages impactés par un commit), générateurs de code, dependency graph visuel, plugins officiels pour Next.js, NestJS, Storybook, Cypress, Playwright. **pnpm workspaces** : gestion des packages locaux, hoisting optimisé des node_modules, liens symboliques entre packages internes. Pré-requis pour Turborepo et Nx.

#Définition Monorepo (Turborepo, Nx)

Un monorepo (contraction de monolithic repository) est une stratégie d'organisation du code source où plusieurs projets distincts — applications, librairies, outils — cohabitent dans un seul dépôt Git. Ils partagent potentiellement des dépendances, des configurations et des utilitaires communs. Pour approfondir, consultez la page service Development Next.js Nehos.

Concrètement, Structure type d'un monorepo JavaScript/TypeScript avec pnpm workspaces : monorepo/ ├── apps/ │ ├── web/ # Next.js 16 (site public) │ └── api/ # Payload CMS (backend) ├── packages/ │ ├── ui/ # Composants React partagés │ ├── config-eslint/ # Config ESLint commune │ ├── config-ts/ # tsconfig.json de base │ └── types/ # Types TypeScript partagés ├── pnpm-workspace.yaml └── turbo.json Turborepo (Vercel) : orchestrateur de pipeline de build. Chaque tâche (build, test, lint, typecheck) est déclarée dans turbo.json avec ses dépendances et ses artefacts cachés. Turborepo calcule un hash des inputs (fichiers sources + dépendances) : si le hash est identique à un build précédent, la tâche est sautée et l'artefact restauré depuis le cache (local ou remote cache via Vercel). Résultat : turbo build sur un projet non modifié s'exécute en 200 ms au lieu de 4 minutes. Nx (Nrwl) : solution plus complète avec affected commands (nx affected:build = ne builder que les packages impactés par un commit), générateurs de code, dependency graph visuel, plugins officiels pour Next.js, NestJS, Storybook, Cypress, Playwright. pnpm workspaces : gestion des packages locaux, hoisting optimisé des node_modules, liens symboliques entre packages internes. Pré-requis pour Turborepo et Nx.

Maîtriser Monorepo (Turborepo, Nx) permet aux équipes techniques et métier de parler le même langage — et d'arbitrer plus vite.

#Monorepo (Turborepo, Nx) expliqué simplement

Imaginez une agence web qui développe trois produits en parallèle : un site Next.js, un back-office Payload, et une librairie de composants utilisée par les deux. En polyrepo, ce sont trois dépôts Git séparés. Pour modifier un composant partagé, vous modifiez le repo 'ui', publiez une nouvelle version npm, mettez à jour la version dans les deux autres repos. Trois commits, deux pull requests croisées, risque de désynchronisation.

En monorepo, tout est dans le même dépôt. Vous modifiez le composant dans packages/ui, et les applications apps/web et apps/api utilisent automatiquement la version locale modifiée. Un seul commit, une seule PR, zéro désynchronisation possible.

Turborepo gère la partie 'ne rebuilder que ce qui a changé'. Si vous modifiez uniquement packages/ui, il ne rebuilde que packages/ui et les apps qui en dépendent — pas les autres. Sur un monorepo de 8 packages, ça peut passer de 12 minutes de CI à 90 secondes.

Prenez un cas concret : une entreprise de 50 personnes qui accélère sa croissance. C'est la réalité du terrain — loin des définitions académiques.

#Cas d'usage concrets

Agence produit SaaS (Next.js + NestJS + packages partagés) — Stack T3 étendu en monorepo Turborepo : apps/dashboard (Next.js 16), apps/api (NestJS), apps/marketing (Next.js statique), packages/ui (50 composants shadcn custom), packages/types (interfaces TypeScript partagées entre front et back). Gain mesuré : build CI full de 18 min → 4 min avec cache Turborepo remote. Onboarding : de 3h (polyrepo, 3 repos à cloner/configurer) à 45 min (1 pnpm install).

Refonte agence B2B Next.js 16 + Payload CMS (pattern Nehos) — Pattern standard Nehos : monorepo pnpm + Turborepo. apps/web (Next.js 16 Turbopack), apps/cms (Payload 3), packages/ui (composants Tailwind + shadcn partagés), packages/config-eslint, packages/config-ts. Turborepo cache local + Vercel remote cache. Build time après modification mineure (typo dans un composant UI) : 23 s (Turborepo cache hit sur apps non modifiées) vs 6 min 40 s en polyrepo sans cache. Déploiements Vercel uniquement déclenchés si l'app concernée est affectée.

Scale-up multi-produits (Nx monorepo avec affected commands) — Scale-up fintech : 4 apps (app-client Next.js, app-admin Next.js, api-graphql NestJS, api-webhooks Express) + 12 packages partagés. Migration polyrepo → Nx monorepo. nx affected:build sur un commit touchant uniquement un package de validation : 2 des 4 apps rebuildées (les 2 qui en dépendent), 2 ignorées. CI time : -68 %. Génération de code Nx pour les nouveaux feature modules : 4 fichiers boilerplate créés en 8 s vs 20 min de copier-coller manuel.

#Monorepo (Turborepo, Nx) chez Nehos Groupe

L'équipe Nehos travaille avec cette technologie depuis ses débuts. Sur les 3 derniers projets impliquant Monorepo (Turborepo, Nx), on a documenté les résultats avec des KPIs précis. Notre service Development Next.js Nehos couvre ce périmètre de A à Z.

La méthode Nehos est documentée sur stack technique Nehos 2026. Chaque mission démarre par un cadrage structuré : objectifs chiffrés, périmètre technique, jalons à 30/60/90 jours. Les résultats mesurés sur nos clients : 68 % est un ordre de grandeur courant. On livre, on mesure, on itère. Pas de slides sans livrable.

#Termes associés

Ce terme s'inscrit dans un écosystème plus large.

Chaque terme est défini dans notre glossaire avec la même approche : définition technique, vulgarisation, cas concrets et méthode Nehos.

Applications Concrètes

Contexte : Agence produit SaaS (Next.js + NestJS + packages partagés)

"Stack T3 étendu en monorepo Turborepo : apps/dashboard (Next.js 16), apps/api (NestJS), apps/marketing (Next.js statique), packages/ui (50 composants shadcn custom), packages/types (interfaces TypeScript partagées entre front et back). Gain mesuré : build CI full de 18 min → 4 min avec cache Turborepo remote. Onboarding : de 3h (polyrepo, 3 repos à cloner/configurer) à 45 min (1 pnpm install)."

Contexte : Refonte agence B2B Next.js 16 + Payload CMS (pattern Nehos)

"Pattern standard Nehos : monorepo pnpm + Turborepo. apps/web (Next.js 16 Turbopack), apps/cms (Payload 3), packages/ui (composants Tailwind + shadcn partagés), packages/config-eslint, packages/config-ts. Turborepo cache local + Vercel remote cache. Build time après modification mineure (typo dans un composant UI) : 23 s (Turborepo cache hit sur apps non modifiées) vs 6 min 40 s en polyrepo sans cache. Déploiements Vercel uniquement déclenchés si l'app concernée est affectée."

Contexte : Scale-up multi-produits (Nx monorepo avec affected commands)

"Scale-up fintech : 4 apps (app-client Next.js, app-admin Next.js, api-graphql NestJS, api-webhooks Express) + 12 packages partagés. Migration polyrepo → Nx monorepo. `nx affected:build` sur un commit touchant uniquement un package de validation : 2 des 4 apps rebuildées (les 2 qui en dépendent), 2 ignorées. CI time : -68 %. Génération de code Nx pour les nouveaux feature modules : 4 fichiers boilerplate créés en 8 s vs 20 min de copier-coller manuel."

Questions & Réponses

Questions fréquentes sur les monorepos Turborepo et Nx

Turborepo si : projet Next.js + Payload ou Next.js + API Node.js, équipe de 2 à 8 développeurs, besoin de simplicité et de rapidité de mise en place. Configuration minimale (turbo.json de 30 lignes), intégration Vercel native pour le remote cache, courbe d'apprentissage très courte. Nx si : monorepo avec 10+ packages, plusieurs frameworks différents (Next.js, NestJS, Angular, Storybook), besoin de générateurs de code avancés, dependency graph visuel, affected commands très granulaires. Nx est plus puissant mais plus complexe à configurer. Recommandation Nehos : Turborepo pour les projets clients standard, Nx pour les architectures produit complexes multi-apps.
Trois situations où le monorepo complique la vie : (1) équipes très grandes (50+ développeurs) avec des domaines métier totalement distincts — les conflits Git et la gestion des permissions deviennent un enfer ; (2) projets avec des contraintes de sécurité strictes imposant une séparation physique des bases de code (réglementations, audits ISO) ; (3) librairies open source publiées sur npm où chaque package a son propre versionning sémantique indépendant (Lerna reste plus adapté dans ce cas). Pour une agence ou un studio produit de moins de 20 développeurs sur un stack cohérent, le monorepo est presque toujours la bonne option.
Turborepo calcule un hash unique pour chaque tâche en fonction de : les fichiers sources du package, ses dépendances npm, les variables d'environnement déclarées dans turbo.json, et les outputs des packages dont il dépend. Si ce hash correspond à un hash déjà calculé en cache (local `./node_modules/.cache/turbo` ou remote cache Vercel), Turborepo restaure les artefacts depuis le cache sans exécuter la tâche. Le cache remote Vercel permet à toute l'équipe de partager le même cache — un build fait sur la machine d'un dev est disponible pour les autres et pour la CI.
Non, mais fortement recommandé. Turborepo supporte officiellement pnpm workspaces, npm workspaces et Yarn workspaces. pnpm est préféré dans l'écosystème Next.js 2026 pour ses performances (node_modules hoisting optimal, liens symboliques stricts), sa gestion du lockfile plus déterministe, et sa compatibilité parfaite avec Turborepo et Nx. Yarn Berry (PnP mode) est plus complexe à configurer avec certains outils (Payload notamment). npm workspaces fonctionne mais est moins performant pour les grands monorepos.
Vercel détecte automatiquement les applications dans un monorepo (dossier `apps/`). Chaque app a son propre projet Vercel avec sa propre URL de déploiement. Le déploiement d'une app est déclenché uniquement si des fichiers affectant cette app ont été modifiés (Vercel analyse le graph de dépendances Turborepo). Configuration via `vercel.json` à la racine ou par projet. Pour une app Next.js dans `apps/web`, `vercel.json` pointe vers ce sous-dossier comme `rootDirectory`. Les packages partagés sont bundlés lors du build de chaque app — pas de publication npm interne nécessaire.
C'est le risque principal sans outillage adapté. Un monorepo sans cache ni affected commands = builder tous les packages à chaque commit. Solution avec Turborepo remote cache : seuls les packages dont le hash a changé sont rebuilder. La CI passe de 'builder tout' à 'builder uniquement ce qui a changé'. En pratique, sur un commit touchant un seul package feuille (une librairie sans dépendants), la CI complète prend 60 à 90 secondes au lieu de 8 à 15 minutes. Le remote cache Turborepo est gratuit pour les projets Vercel, et disponible en self-hosted via turbo-remote-cache (open source).
Pattern Nehos standard 2026 : `apps/web` (Next.js 16, Turbopack, App Router), `apps/cms` (Payload 3 avec son propre server Express), `packages/ui` (composants Tailwind + shadcn/ui, storybook), `packages/types` (interfaces TypeScript partagées, schémas Zod), `packages/config-eslint` (config ESLint commune), `packages/config-ts` (tsconfig base). Règle stricte : les packages ne doivent pas importer depuis `apps/`. Seules les apps importent depuis `packages/`. Cette règle garantit l'absence de couplage circulaire et permet de publier des packages indépendamment si nécessaire.
Réserver un audit