ไม่มีชื่อบทความ
ตั้ง Monorepo (pnpm + Turbo + Next.js) ตั้งแต่ 0
TL;DR
- ใช้
pnpmworkspace +TurboRepoตั้งโครงสร้าง Monorepo - สร้างแอปแรกด้วย Next.js (App Router) พร้อม
apps/และpackages/ - ใช้งานได้ทั้งบน macOS และ Windows ภายใน 30 นาที
1. ตรวจสอบเวอร์ชันเครื่องมือที่ต้องใช้
# Node.js (ควร >= 18.x)
$ node -v
# pnpm (ควร >= 8.x)
$ pnpm -v
# git
$ git --version
💡 ถ้ายังไม่มี
pnpm:
$ npm install -g pnpm
2. สร้างโฟลเดอร์โปรเจกต์หลัก
$ mkdir nokfa-monorepo
$ cd nokfa-monorepo
$ git init
3. สร้างไฟล์ตั้งค่า pnpm workspace
$ touch pnpm-workspace.yaml
📄 pnpm-workspace.yaml
packages:
- 'apps/*'
- 'packages/*'
4. สร้าง package.json ส่วนกลาง + ติดตั้ง Turbo
$ pnpm init -y
$ pnpm add -D turbo
📄 package.json (บางส่วน)
{
"name": "nokfa-monorepo",
"private": true,
"scripts": {
"dev": "turbo run dev",
"build": "turbo run build",
"lint": "turbo run lint"
}
}
5. สร้างไฟล์ turbo.json
$ touch turbo.json
📄 turbo.json
{
"$schema": "https://turborepo.org/schema.json",
"pipeline": {
"dev": {
"cache": false
},
"build": {
"dependsOn": ["^build"],
"outputs": [".next/**", "dist/**"]
},
"lint": {
"outputs": []
}
}
}
6. สร้างแอปแรกใน apps/
$ mkdir -p apps/web
$ cd apps/web
$ pnpm create next-app --no-tailwind --ts --app --import-alias "@/*"
✅ เลือก
apps/webเป็นโฟลเดอร์ติดตั้ง ⌨️ ตั้งชื่อโปรเจกต์:web❌ ไม่ต้องเลือก Tailwind (ถ้าทีมยังไม่ใช้) ✅ ใช้ TypeScript ✅ ใช้ App Router ✅ ใช้ ESLint ✅ ใช้ src/ directory หรือไม่ก็ได้ (แนะนำ ไม่ใช้)
7. ตั้ง alias ให้ cross-import ได้
📄 สร้างไฟล์ tsconfig.base.json ที่ root:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@nokfa/ui": ["packages/ui/src"],
"@nokfa/utils": ["packages/utils/src"]
}
}
}
📄 แล้วให้ apps/web/tsconfig.json เพิ่ม extends:
{
"extends": "../../tsconfig.base.json",
...
}
8. สร้าง packages แชร์โค้ด
$ mkdir -p packages/ui/src
$ mkdir -p packages/utils/src
$ touch packages/ui/package.json
$ touch packages/utils/package.json
📄 packages/ui/package.json
{
"name": "@nokfa/ui",
"version": "0.1.0",
"main": "src/index.ts",
"private": true
}
📄 packages/utils/package.json
{
"name": "@nokfa/utils",
"version": "0.1.0",
"main": "src/index.ts",
"private": true
}
📄 ตัวอย่าง packages/ui/src/index.ts
export const Button = () => <button>Click</button>;
📄 ตัวอย่าง apps/web/app/page.tsx
'use client';
import { Button } from '@nokfa/ui';
export default function Home() {
return <Button />;
}
9. ติดตั้ง dependency ที่ root
$ cd ../../
$ pnpm install
10. สั่งรันแอป
# ทั้งระบบ (build dev ทั้งหมด)
$ pnpm dev
# หรือเฉพาะเว็บ
$ pnpm --filter web dev
11. โครงสร้างที่ได้ (เบื้องต้น)
/nokfa-monorepo
├── apps/
│ └── web/
│ ├── app/
│ ├── public/
│ ├── package.json
│ └── tsconfig.json
├── packages/
│ ├── ui/
│ │ ├── src/
│ │ └── package.json
│ └── utils/
│ ├── src/
│ └── package.json
├── package.json
├── pnpm-workspace.yaml
├── tsconfig.base.json
└── turbo.json
Tips สำหรับ macOS / Windows
- ✅ macOS: เปิดด้วย
iTermหรือ Terminal.app ได้เลย - ✅ Windows: ใช้
PowerShellหรือGit Bash - ✅ Editor: แนะนำ
VSCodeพร้อม plugin: ESLint, Prettier - ✅ pnpm บน Windows อาจต้องใช้
Set-ExecutionPolicyครั้งแรก
FAQ
Q: ทำไมต้องใช้ pnpm แทน npm?
- เร็วกว่า, ประหยัดพื้นที่, รองรับ workspace โดยตรง
Q: Turbo ใช้ทำอะไร?
- รัน pipeline ข้ามหลายแอปแบบขนาน, แชร์ cache, ข้ามขั้นตอนที่ไม่เปลี่ยน
Q: ถ้าจะเพิ่มแอปอีก ต้องทำอย่างไร?
$ mkdir apps/admin-dashboard
$ pnpm create next-app apps/admin-dashboard
แล้วเชื่อม tsconfig เหมือนที่
webทำ
Q: ถ้าจะ import UI component มาใช้ในหลายแอป?
- สร้างที่
packages/ui/src, แล้ว import ด้วย alias@nokfa/ui
Q: ใช้กับ Git ยังไง?
$ git init
$ git add .
$ git commit -m "Initial monorepo setup"
ถ้าทำครบขั้นตอนนี้แล้ว = พร้อมพัฒนาแอปจริงได้เลยในโครงสร้างแบบ Monorepo 🚀