DevToolBoxGRATIS
Blog

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

15 minby DevToolBox

Een monorepo verbetert code-delen, refactoring en afhankelijkheidsbeheer.

Turborepo: opzet en structuur

Turborepo is geoptimaliseerd voor JavaScript/TypeScript-monorepo's.

# 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

Turborepo-pijplijnconfiguratie

De turbo.json-pijplijn definieert hoe taken met elkaar samenhangen.

// 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: opzet en projectgraph

Nx biedt een rijker functieset: codegenerators, affected-opdrachten.

# 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: lichtgewicht aanpak

pnpm workspaces biedt native monorepo-ondersteuning zonder extra tools.

# 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

Remote cache

Remote caching deelt bouw-artefacten tussen ontwikkelaars en 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

Versiebeheer met Changesets

Changesets is de standaardtool voor versiebeheer en publicatie in monorepo's.

# 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

Best practices

  • Beginnen met pnpm workspaces + Turborepo.
  • Duidelijke grenzen definiëren: gedeelde packages in packages/, apps in apps/.
  • Changesets gebruiken voor versiebeheer.
  • Remote cache vroeg inschakelen.
  • Elk package.json expliciet houden.

FAQ

Turborepo of Nx?

Turborepo is eenvoudiger voor de meeste JS-projecten. Nx heeft meer functies voor grote repo's.

Monorepo vs polyrepo?

Een monorepo slaat alle code op in één repository.

Hoe werkt Turborepo-caching?

Turborepo hasht de invoer van elke taak en herstelt uitvoer uit de cache.

Verschillende pakketbeheerders in monorepo?

Nee. Alle workspaces moeten dezelfde pakketbeheerder gebruiken.

Omgevingsvariabelen in monorepo?

Variabelen per app definiëren en vermelden in turbo.json globalEnv.

Gerelateerde tools

𝕏 Twitterin LinkedIn
Was dit nuttig?

Blijf op de hoogte

Ontvang wekelijkse dev-tips en nieuwe tools.

Geen spam. Altijd opzegbaar.

Try These Related Tools

{ }JSON Formatter.git.gitignore Generator

Related Articles

Bun Package Manager: De Snelste JavaScript Runtime in 2026

Volledige Bun-gids 2026: installatie, workspaces, scripts en waarom het sneller is dan npm/yarn/pnpm.

Docker Multi-Stage Builds: Images Optimaliseren voor Productie

Docker multi-stage builds beheersen 2026: imagegrootte drastisch verkleinen, build- en runtime-afhankelijkheden scheiden.

Git-branching-strategieen: GitFlow vs Trunk-Based vs GitHub Flow

Vergelijk GitFlow, Trunk-Based Development en GitHub Flow. Branch-structuren, merge-workflows, CI/CD-integratie en de juiste strategie kiezen voor je team.