DevToolBoxฟรี
บล็อก

เครื่องมือ Monorepo 2026: Turborepo vs Nx vs Lerna vs pnpm Workspaces

15 นาทีโดย DevToolBox

Monorepo ช่วยปรับปรุงการแชร์โค้ด การ refactor และการจัดการ dependencies

Turborepo: การตั้งค่าและโครงสร้าง

Turborepo ได้รับการปรับให้เหมาะสมสำหรับ JavaScript/TypeScript monorepos

# 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

การตั้งค่า Pipeline ของ Turborepo

pipeline turbo.json กำหนดความสัมพันธ์ระหว่าง tasks และ outputs ที่จะ cache

// 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: การตั้งค่าและกราฟโปรเจ็กต์

Nx มี feature set ที่หลากหลาย: code generators, คำสั่ง 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: แนวทางน้ำหนักเบา

pnpm workspaces รองรับ monorepo แบบ native โดยไม่ต้องใช้เครื่องมือเพิ่มเติม

# 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 แชร์ build artifacts ระหว่าง developers และ 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

การจัดการเวอร์ชันด้วย Changesets

Changesets คือเครื่องมือมาตรฐานสำหรับการจัดการเวอร์ชันและการเผยแพร่ใน 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

แนวปฏิบัติที่ดีที่สุด

  • เริ่มต้นด้วย pnpm workspaces + Turborepo
  • กำหนดขอบเขตที่ชัดเจน: shared packages ใน packages/, apps ใน apps/
  • ใช้ Changesets สำหรับการจัดการเวอร์ชัน
  • เปิดใช้งาน remote cache ตั้งแต่เนิ่นๆ
  • รักษา package.json ของแต่ละ package ให้ชัดเจน

คำถามที่พบบ่อย

ควรใช้ Turborepo หรือ Nx?

Turborepo ง่ายกว่าสำหรับโปรเจ็กต์ JS ส่วนใหญ่ Nx มี features มากกว่าสำหรับ repo ขนาดใหญ่

Monorepo กับ polyrepo ต่างกันอย่างไร?

Monorepo เก็บโค้ดทั้งหมดในที่เก็บเดียว

Turborepo caching ทำงานอย่างไร?

Turborepo hash input ของแต่ละ task และคืนค่า output จาก cache

สามารถใช้ package manager ต่างกันใน monorepo ได้ไหม?

ไม่ได้ ทุก workspace ต้องใช้ package manager เดียวกัน

จะจัดการ environment variables ใน monorepo อย่างไร?

กำหนด variables ต่อ app และแสดงรายการใน turbo.json globalEnv

เครื่องมือที่เกี่ยวข้อง

𝕏 Twitterin LinkedIn
บทความนี้มีประโยชน์ไหม?

อัปเดตข่าวสาร

รับเคล็ดลับการพัฒนาและเครื่องมือใหม่ทุกสัปดาห์

ไม่มีสแปม ยกเลิกได้ตลอดเวลา

ลองเครื่องมือที่เกี่ยวข้อง

{ }JSON Formatter.git.gitignore Generator

บทความที่เกี่ยวข้อง

Bun Package Manager: JavaScript Runtime ที่เร็วที่สุดในปี 2026

คู่มือ Bun ฉบับสมบูรณ์ 2026: การติดตั้ง, workspace management, scripts และเหตุใดจึงเร็วกว่า npm/yarn/pnpm

Docker Multi-Stage Builds: การเพิ่มประสิทธิภาพ Images สำหรับ Production

เชี่ยวชาญ Docker multi-stage builds 2026: ลดขนาด image อย่างมาก, แยก build และ runtime dependencies

กลยุทธ์การแตก Branch ใน Git: GitFlow vs Trunk-Based vs GitHub Flow

เปรียบเทียบกลยุทธ์ GitFlow, Trunk-Based Development และ GitHub Flow โครงสร้างแบรนช์ เวิร์กโฟลว์การ merge การผสาน CI/CD และวิธีเลือกกลยุทธ์ที่เหมาะสม