Skip to content

การเปลี่ยนเป็น Monorepo ด้วย Turborepo

Monorepo Structure

Monorepo คืออะไร?

Monorepo คือโครงสร้างการจัดการโค้ดที่เก็บหลายโปรเจคไว้ใน repository เดียวกัน โดยแต่ละโปรเจคสามารถเป็น:

  • แอปพลิเคชัน ที่ทำงานแยกกัน (เช่น Web App, Mobile App, API)
  • Shared Packages ที่ใช้ร่วมกันระหว่างโปรเจค (เช่น UI Components, Utility Functions)

ข้อดีของ Monorepo

  1. Code Sharing: แชร์โค้ดระหว่างโปรเจคได้ง่าย
  2. Consistency: รักษาความสม่ำเสมอของโค้ด
  3. Collaboration: ทีมสามารถทำงานร่วมกันได้ดีขึ้น
  4. Dependency Management: จัดการ dependencies ได้ง่ายขึ้น

เปรียบเทียบ Turborepo กับเครื่องมืออื่น

FeatureTurborepoLernaNx
Build Caching
Remote Caching
Task Pipelines
Framework Support

ขั้นตอนการเปลี่ยนเป็น Monorepo

1. ติดตั้ง Turborepo

bash
bun add turbo --dev

2. สร้างโครงสร้าง Monorepo

.
├── apps/            # แอปพลิเคชันต่างๆ
│   ├── web/         # Web Application
│   └── api/         # API Server
├── packages/        # Shared Packages
│   ├── ui/          # UI Components
│   └── utils/       # Utility Functions
├── package.json     # Root Package
└── turbo.json       # Turborepo Configuration

3. ตั้งค่า turbo.json

json
{
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],  // ต้อง build dependencies ก่อน
      "outputs": ["dist/**"]    // Output directory
    },
    "lint": {
      "outputs": []             // ไม่มี output
    },
    "dev": {
      "cache": false            // ไม่ใช้ cache ในโหมด development
    }
  }
}

4. ตั้งค่า package.json

json
{
  "name": "monorepo",
  "private": true,
  "workspaces": [  // กำหนด workspace
    "apps/*",      // แอปพลิเคชันทั้งหมด
    "packages/*"   // Packages ทั้งหมด
  ],
  "scripts": {
    "build": "turbo run build",      // Build ทั้งหมด
    "dev": "turbo run dev --parallel", // Run dev พร้อมกัน
    "lint": "turbo run lint",        // Lint ทั้งหมด
    "clean": "turbo run clean && rm -rf node_modules" // Clean up
  }
}

5. ตั้งค่าแต่ละ package

แต่ละ package ใน apps/ และ packages/ ควรมี package.json ของตัวเอง โดยมีโครงสร้างพื้นฐานดังนี้:

json
{
  "name": "@monorepo/ui",
  "version": "1.0.0",
  "main": "dist/index.js",
  "scripts": {
    "build": "tsc -p .",
    "dev": "tsc -w -p ."
  }
}

การทำงานร่วมกับ Bun

Turborepo ทำงานได้ดีกับ Bun โดยเฉพาะในด้าน performance ในการติดตั้ง dependencies และการรัน scripts

ประสิทธิภาพของ Bun กับ Turborepo

OperationTime (Bun)Time (npm/yarn/pnpm)
Install Dependencies1.2s5.8s
Run Build3.4s7.2s
Run Tests2.1s4.5s

คำสั่งพื้นฐาน

  • Build ทั้งหมด: bun run build
  • Run dev ทั้งหมด: bun run dev
  • Lint ทั้งหมด: bun run lint
  • Clean up: bun run clean

ตัวอย่างการทำงาน

สร้าง package ใหม่

bash
mkdir packages/new-package
cd packages/new-package
bun init

เพิ่ม dependencies

bash
bun add @monorepo/ui

Build ทั้งหมด

bash
bun run build

ข้อควรระวัง

  1. Dependencies Management

    • ตรวจสอบ dependencies ซ้ำกันระหว่าง packages
    • ใช้ peerDependencies สำหรับ shared libraries
  2. Versioning

    • ใช้ semantic versioning (semver)
    • ใช้ tools เช่น changesets สำหรับจัดการ version
  3. Environment Variables

    • ใช้ .env files สำหรับแต่ละ environment
    • ใช้ dotenv สำหรับ loading environment variables
  4. Testing

    • ตั้งค่า test runner ที่สามารถรันแบบ parallel ได้
    • ใช้ code coverage tools เช่น istanbul
  5. CI/CD

    • ตั้งค่า CI/CD pipeline ที่รองรับ Monorepo
    • ใช้ caching เพื่อเพิ่มประสิทธิภาพ