Skip to content

Why Monorepo

Monorepo (Single Repository) เป็นการเก็บหลายโปรเจคไว้ใน repository เดียว มีข้อดีหลักๆ ดังนี้:

ข้อดีรายละเอียดตัวอย่าง
แบ่งปันโค้ดใช้โค้ดร่วมกันระหว่างโปรเจคได้ง่ายสร้าง shared package สำหรับ UI components
จัดการ dependenciesควบคุมเวอร์ชันของ dependencies จากจุดเดียวกำหนดเวอร์ชัน React ทุกที่ในไฟล์ root package.json
ความสอดคล้องทุกโปรเจคใช้ tooling และ configuration เดียวกันใช้ eslint config เดียวกันทั้ง monorepo
การเปลี่ยนแปลงข้ามโปรเจคแก้ไขหลายโปรเจคใน commit เดียวได้แก้ไข component ใน shared package และใช้งานในหลายโปรเจคพร้อมกัน

Comparison

แนะนำให้ดูที่ moonrepo.dev faviconMoonrepo Comparison คือตาราง จะเห็นว่า แม้ว่า moonrepo จะดีได้มากกว่าในหลายมิติ แต่ข้อดีของ turborepo คือใช้ง่าย

Quick Start

Installation

ตดตั้ง Turborepo ด้วย package manager ที่คุณใช้:

bash
bun add -D turbo
bash
npm install turbo -D
bash
yarn add turbo -D
bash
pnpm add turbo -D

Configuration (turbo.json)

ไฟล์ turbo.json เป็นหัวใจหลักของการทำงาน:

turbo.json
json
{
  "$schema": "https://turbo.build/schema.json",
  "tasks": {
    "build": {
      "outputs": ["dist/**"],
      "dependsOn": ["^build"]
    },
    "test": {
      "outputs": [],
      "dependsOn": ["build"]
    }
  }
KeyDescription
tasksกำหนด task และ dependencies
dependsOnระบุ task ที่ต้องรันก่อน
outputsไฟล์ที่สร้างจาก task (สำหรับ caching)
inputsไฟล์ที่ trigger การรัน task ใหม่
shEnvironment variables ที่ใช้ใน task
cacheเปิด/ปิด caching สำหรับ task
persistentสำหรับ long-running processes เช่น dev server
outputModeกำหนดรูปแบบ output (full, hash-only, etc.)
interactiveเปิด/ปิด interactive mode
extendsสืบทอด configuration จากไฟล์อื่น

Features แนวคิดหลัก

Workspaces

โครงสร้างพื้นฐานของ monorepo ที่ช่วยจัดการหลายโปรเจคในที่เดียว:

  1. โครงสร้างพื้นฐาน
json
{
  "workspaces": [
    "apps/*",    // แอปพลิเคชันหลัก
    "packages/*" // ไลบรารีที่แชร์
  ]
}
  1. ข้อดี
  • แบ่งโค้ดเป็น module ย่อย
  • ควบคุม dependencies จากจุดเดียว
  • รันคำสั่งข้ามโปรเจคได้
  1. ตัวอย่างโครงสร้าง
.
├── apps/
│   ├── web-app/
│   └── mobile-app/
└── packages/
    ├── ui-components/
    └── shared-utils/

Caching

ระบบ caching ที่ช่วยเพิ่มความเร็วการทำงาน:

  1. หลักการทำงาน
  • เก็บผลลัพธ์ของ task ที่รันแล้ว
  • ตรวจสอบความเปลี่ยนแปลงผ่าน inputs
  • ใช้ cache เมื่อ inputs เหมือนเดิม
  1. การตั้งค่า
json
{
  "tasks": {
    "build": {
      "inputs": ["src/**"],
      "outputs": ["dist/**"]
    }
  }
}
  1. Remote Cache
  • แชร์ cache ระหว่างทีม
  • ลดเวลาการ build บน CI/CD
  • ตั้งค่าโดย turbo login และ turbo link

Taks

ระบบจัดการ task dependencies:

  1. dependsOn
  • ^build = รัน build ของ dependencies ก่อน
  • build = รัน build ในโปรเจคปัจจุบันก่อน
  1. ตัวอย่าง
package.json
json
{
  "tasks": {
    "test": {
      "dependsOn": ["build"]
    }
  }
}

CLI Commands

ตารางสรุปคำสั่งพื้นฐานของ Turborepo:

คำสั่งคำอธิบายตัวอย่างการใช้งาน
turbo run <task>รัน task ที่กำหนดใน tasksturbo run build
turbo run <task> --filter=<package>รัน task เฉพาะ packageturbo run test --filter=web
turbo loginล็อกอินเข้าสู่ระบบ Turborepoturbo login
turbo linkเชื่อมต่อโปรเจคกับ Turborepo Cloudturbo link
turbo pruneสร้าง standalone project จาก monorepoturbo prune --scope=web
turbo binแสดง path ของ turbo binaryturbo bin
turbo daemonจัดการ Turborepo daemonturbo daemon start

Last updated: