การเปลี่ยนเป็น Monorepo ด้วย Turborepo
Monorepo คืออะไร?
Monorepo คือโครงสร้างการจัดการโค้ดที่เก็บหลายโปรเจคไว้ใน repository เดียวกัน โดยแต่ละโปรเจคสามารถเป็น:
- แอปพลิเคชัน ที่ทำงานแยกกัน (เช่น Web App, Mobile App, API)
- Shared Packages ที่ใช้ร่วมกันระหว่างโปรเจค (เช่น UI Components, Utility Functions)
ข้อดีของ Monorepo
- Code Sharing: แชร์โค้ดระหว่างโปรเจคได้ง่าย
- Consistency: รักษาความสม่ำเสมอของโค้ด
- Collaboration: ทีมสามารถทำงานร่วมกันได้ดีขึ้น
- Dependency Management: จัดการ dependencies ได้ง่ายขึ้น
เปรียบเทียบ Turborepo กับเครื่องมืออื่น
Feature | Turborepo | Lerna | Nx |
---|---|---|---|
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
Operation | Time (Bun) | Time (npm/yarn/pnpm) |
---|---|---|
Install Dependencies | 1.2s | 5.8s |
Run Build | 3.4s | 7.2s |
Run Tests | 2.1s | 4.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
ข้อควรระวัง
Dependencies Management
- ตรวจสอบ dependencies ซ้ำกันระหว่าง packages
- ใช้
peerDependencies
สำหรับ shared libraries
Versioning
- ใช้ semantic versioning (semver)
- ใช้ tools เช่น
changesets
สำหรับจัดการ version
Environment Variables
- ใช้
.env
files สำหรับแต่ละ environment - ใช้
dotenv
สำหรับ loading environment variables
- ใช้
Testing
- ตั้งค่า test runner ที่สามารถรันแบบ parallel ได้
- ใช้ code coverage tools เช่น
istanbul
CI/CD
- ตั้งค่า CI/CD pipeline ที่รองรับ Monorepo
- ใช้ caching เพื่อเพิ่มประสิทธิภาพ