Dark mode
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 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
เป็นหัวใจหลักของการทำงาน:
json
{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"build": {
"outputs": ["dist/**"],
"dependsOn": ["^build"]
},
"test": {
"outputs": [],
"dependsOn": ["build"]
}
}
Key | Description |
---|---|
tasks | กำหนด task และ dependencies |
dependsOn | ระบุ task ที่ต้องรันก่อน |
outputs | ไฟล์ที่สร้างจาก task (สำหรับ caching) |
inputs | ไฟล์ที่ trigger การรัน task ใหม่ |
sh | Environment 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 ที่ช่วยจัดการหลายโปรเจคในที่เดียว:
- โครงสร้างพื้นฐาน
json
{
"workspaces": [
"apps/*", // แอปพลิเคชันหลัก
"packages/*" // ไลบรารีที่แชร์
]
}
- ข้อดี
- แบ่งโค้ดเป็น module ย่อย
- ควบคุม dependencies จากจุดเดียว
- รันคำสั่งข้ามโปรเจคได้
- ตัวอย่างโครงสร้าง
.
├── apps/
│ ├── web-app/
│ └── mobile-app/
└── packages/
├── ui-components/
└── shared-utils/
Caching
ระบบ caching ที่ช่วยเพิ่มความเร็วการทำงาน:
- หลักการทำงาน
- เก็บผลลัพธ์ของ task ที่รันแล้ว
- ตรวจสอบความเปลี่ยนแปลงผ่าน inputs
- ใช้ cache เมื่อ inputs เหมือนเดิม
- การตั้งค่า
json
{
"tasks": {
"build": {
"inputs": ["src/**"],
"outputs": ["dist/**"]
}
}
}
- Remote Cache
- แชร์ cache ระหว่างทีม
- ลดเวลาการ build บน CI/CD
- ตั้งค่าโดย
turbo login
และturbo link
Taks
ระบบจัดการ task dependencies:
- dependsOn
^build
= รัน build ของ dependencies ก่อนbuild
= รัน build ในโปรเจคปัจจุบันก่อน
- ตัวอย่าง
json
{
"tasks": {
"test": {
"dependsOn": ["build"]
}
}
}
CLI Commands
ตารางสรุปคำสั่งพื้นฐานของ Turborepo:
คำสั่ง | คำอธิบาย | ตัวอย่างการใช้งาน |
---|---|---|
turbo run <task> | รัน task ที่กำหนดใน tasks | turbo run build |
turbo run <task> --filter=<package> | รัน task เฉพาะ package | turbo run test --filter=web |
turbo login | ล็อกอินเข้าสู่ระบบ Turborepo | turbo login |
turbo link | เชื่อมต่อโปรเจคกับ Turborepo Cloud | turbo link |
turbo prune | สร้าง standalone project จาก monorepo | turbo prune --scope=web |
turbo bin | แสดง path ของ turbo binary | turbo bin |
turbo daemon | จัดการ Turborepo daemon | turbo daemon start |