14 Maret 20267 min read

Structuring Scalable Multi-Package Monorepos with pnpm and Turborepo

Building high-performance monorepos sharing TypeScript configs, UI design systems, and database clients across Next.js and Nuxt apps.

MonorepoTurborepopnpmDevOpsArchitecture

Managing multiple repositories for frontend apps, CMS platforms, and shared libraries leads to dependency divergence and duplication. A unified pnpm workspace paired with Turborepo solves this elegantly.


Monorepo Workspace Structure

lana-developer/
├── apps/
│   ├── lana-portfolio/   (Next.js 15 Website)
│   ├── lana-cms/         (Payload 3.0 Headless CMS)
│   └── lana-docs/        (Nuxt 4 Technical Blog)
├── packages/
│   ├── ui/               (Shared Tailwind & Icons)
│   ├── config-typescript/
│   └── database/         (Drizzle / Prisma Client)
├── turbo.json
└── pnpm-workspace.yaml

Turborepo Pipeline Configuration (turbo.json)

{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": [".next/**", "!.next/cache/**", ".output/**", "dist/**"]
    },
    "lint": {
      "dependsOn": ["^build"]
    },
    "dev": {
      "cache": false,
      "persistent": true
    }
  }
}

Turborepo caches previous build outputs remotely, dropping subsequent CI build times from 3 minutes to under 8 seconds.

Bagikan

Artikel lainnya