Tooling, Testing & Deployment
Node toolchain คือชุดของเครื่องมือ — ของ Go คือ binary เดียว
หัวข้อที่มีชื่อว่า “Node toolchain คือชุดของเครื่องมือ — ของ Go คือ binary เดียว”ในฐานะนักพัฒนา TypeScript คุณคงคุ้นเคยกับการต้องประกอบ toolchain เองจากชิ้นส่วนหลาย ๆ อัน:
- Formatting: Prettier
- Linting: ESLint พร้อม plugin ต่าง ๆ
- Type-checking:
tsc - Testing: Jest (หรือ Vitest)
- Bundling: webpack / esbuild / Vite
- Running:
ts-nodeหรือtsx - Dependency management: npm / yarn / pnpm
เครื่องมือแต่ละตัวมี config file ของตัวเอง มี release cycle ของตัวเอง และมี breaking change ของตัวเอง เวลา setup project ไม่น้อยเลยจึงหมดไปกับการเชื่อมเครื่องมือเหล่านี้เข้าด้วยกัน
Go รวมทุกอย่างข้างต้นไว้ใน binary เดียวชื่อ go ที่ติดตั้งมาพร้อมกับตัวภาษา:
| TypeScript / Node | เทียบเท่าใน Go |
|---|---|
| Prettier | gofmt / go fmt (built-in) |
| ESLint | go vet + staticcheck / golangci-lint |
| tsc | go build (type-checking เปิดตลอด) |
| Jest / Vitest | go test (built-in) |
| webpack / esbuild | go build (ได้ binary เดียวแบบ static) |
| ts-node / tsx | go run |
| npm / yarn | go mod |
ไม่มีการเถียงเรื่อง config
หัวข้อที่มีชื่อว่า “ไม่มีการเถียงเรื่อง config”สิ่งที่นักพัฒนา Go รักที่สุดอย่างหนึ่งคือ ไม่มี config สำหรับ style gofmt มีความเห็นเดียวเกี่ยวกับหน้าตาของโค้ด Go และนั่นคือจุดสิ้นสุดการสนทนา ไม่มี .prettierrc ไม่มี .eslintrc ไม่มีการเถียงเรื่อง tab width ใน pull request
นี่เป็นทางเลือกเชิงวัฒนธรรมที่ชุมชน Go ตั้งใจเลือก: เรื่อง style จบไปแล้ว การถกเถียงจึงโฟกัสอยู่ที่ architecture และ logic แทน
ภาพรวมของ module นี้
หัวข้อที่มีชื่อว่า “ภาพรวมของ module นี้”module นี้จะพาคุณไปรู้จักเครื่องมือหลักแต่ละตัวใน suite ของ Go และแมปเข้ากับสิ่งที่คุณรู้อยู่แล้ว:
- gofmt, go vet, lint — การจัดรูปแบบและ static analysis
- Project layout — โค้ดอยู่ที่ไหนและทำไม
internal/ถึงสำคัญ - Docker multi-stage builds — ส่ง Go image ขนาดเล็ก vs image ของ Node ที่มี node_modules
- Cross-compilation — binary เดียวสำหรับทุก OS/arch โดยไม่ต้องมี runtime
- CI กับ GitHub Actions — workflow ของ Go ที่ใช้งานได้จริง vs workflow ของ Node
// package.json (ส่วนหนึ่ง){ "scripts": { "lint": "eslint src --ext .ts", "format": "prettier --write src", "test": "jest", "build": "tsc && webpack", "start": "ts-node src/main.ts" }, "devDependencies": { "eslint": "^8", "prettier": "^3", "jest": "^29", "ts-jest": "^29", "webpack": "^5", "ts-node": "^10", "typescript": "^5" }}# Makefile (wrapper สำหรับความสะดวก — optional)# ทุกอย่างด้านล่างอยู่ใน binary "go" อยู่แล้ว
lint: go vet ./... staticcheck ./...
fmt: go fmt ./...
test: go test ./...
build: go build -o bin/app ./cmd/app
run: go run ./cmd/app