Ecosystem และ Toolchain
การรัน TypeScript ใน Node.js
หัวข้อที่มีชื่อว่า “การรัน TypeScript ใน Node.js”TypeScript ไม่ได้รับการรองรับโดยตรงจาก Node.js — ต้องถูก strip หรือ compile ก่อน คุณมีตัวเลือกหลักสามตัวใน ecosystem สมัยใหม่:
ตัวเลือกที่ 1: --experimental-strip-types (Node 20.6+ / stable Node 22)
หัวข้อที่มีชื่อว่า “ตัวเลือกที่ 1: --experimental-strip-types (Node 20.6+ / stable Node 22)”Node สามารถลบ type annotations ของ TypeScript ออกเมื่อ startup โดยไม่ต้องใช้ package เพิ่ม แต่ ไม่ได้ตรวจสอบ type — แค่ลบ types แล้วรัน JavaScript:
# Node 22 — stablenode --experimental-strip-types src/app.ts
# Node 20.6+node --experimental-strip-types --input-type=module src/app.tsข้อจำกัด: ไม่รองรับ enum, namespace, experimentalDecorators สำหรับฟีเจอร์เหล่านั้นให้ใช้ tsx หรือ ts-node
ตัวเลือกที่ 2: tsx — TypeScript runner ที่เร็ว
หัวข้อที่มีชื่อว่า “ตัวเลือกที่ 2: tsx — TypeScript runner ที่เร็ว”tsx เป็น wrapper เบา ๆ รอบ esbuild รองรับ TypeScript ทุกฟีเจอร์และเริ่มในเวลามิลลิวินาที:
# รันครั้งเดียวnpx tsx src/app.ts
# Watch mode — auto-restart เมื่อไฟล์เปลี่ยนnpx tsx watch src/app.ts
# ติดตั้งเป็น dev dependencynpm install --save-dev tsxตัวเลือกที่ 3: ts-node — ตัวคลาสสิก
หัวข้อที่มีชื่อว่า “ตัวเลือกที่ 3: ts-node — ตัวคลาสสิก”ts-node เป็นมาตรฐานมาหลายปี หนักกว่า tsx แต่มี configuration support ที่ครบครัน:
npm install --save-dev ts-node typescript
# รันไฟล์npx ts-node src/app.ts
# ESM mode (tsconfig ต้องมี "module": "NodeNext")npx ts-node --esm src/app.tsLinters และ Formatters
หัวข้อที่มีชื่อว่า “Linters และ Formatters”ESLint — ตรวจจับ logic errors และบังคับใช้ style rules
หัวข้อที่มีชื่อว่า “ESLint — ตรวจจับ logic errors และบังคับใช้ style rules”# ติดตั้ง ESLint พร้อม TypeScript supportnpm install --save-dev eslint @eslint/js typescript-eslint
# สร้าง flat config (eslint.config.mjs)# จากนั้นรัน:npx eslint src/
# Auto-fix ปัญหาที่แก้ได้อัตโนมัติnpx eslint --fix src/eslint.config.mjs พื้นฐานสำหรับ TypeScript:
import js from '@eslint/js';import tseslint from 'typescript-eslint';
export default tseslint.config( js.configs.recommended, ...tseslint.configs.recommended,);Prettier — code formatter แบบ opinionated
หัวข้อที่มีชื่อว่า “Prettier — code formatter แบบ opinionated”npm install --save-dev prettier
# Format ไฟล์ทั้งหมดnpx prettier --write .
# ตรวจสอบ formatting โดยไม่เปลี่ยนไฟล์ (สำหรับ CI)npx prettier --check .Prettier และ ESLint มุ่งเน้นคนละด้าน: Prettier จัดการ formatting (ช่องว่าง, quotes, semicolons) ส่วน ESLint จัดการ logic และ style rules รันทั้งคู่ตามลำดับหรือใช้ eslint-config-prettier เพื่อปิด formatting rules ของ ESLint
Biome — เครื่องมือเดียวสำหรับทั้ง lint และ format
หัวข้อที่มีชื่อว่า “Biome — เครื่องมือเดียวสำหรับทั้ง lint และ format”Biome แทนที่ ESLint + Prettier ด้วยเครื่องมือเดียวที่เร็วเขียนด้วย Rust:
npm install --save-dev @biomejs/biomenpx biome init
# Lint และ format ในรอบเดียวnpx biome check --apply src/Watch Mode และ nodemon
หัวข้อที่มีชื่อว่า “Watch Mode และ nodemon”Node built-in watch (Node 18+)
หัวข้อที่มีชื่อว่า “Node built-in watch (Node 18+)”# Restart เมื่อไฟล์เปลี่ยน — ไม่ต้องติดตั้งอะไรnode --watch src/app.js
# Watch ไฟล์เฉพาะnode --watch-path=src src/app.jsnodemon — watcher ที่ผ่านการพิสูจน์แล้ว
หัวข้อที่มีชื่อว่า “nodemon — watcher ที่ผ่านการพิสูจน์แล้ว”npm install --save-dev nodemon
# ใช้งานพื้นฐานnpx nodemon src/app.js
# กับ TypeScript ผ่าน tsxnpx nodemon --exec "npx tsx" src/app.ts
# nodemon.json config{ "watch": ["src"], "ext": "ts,js,json", "exec": "npx tsx src/app.ts"}Environment Variables และ .env Files
หัวข้อที่มีชื่อว่า “Environment Variables และ .env Files”Native .env loading (Node 20.6+)
หัวข้อที่มีชื่อว่า “Native .env loading (Node 20.6+)”# โหลด .env โดยไม่ต้องใช้ dotenvnode --env-file=.env src/app.js
# โหลด env files หลายไฟล์ (ไฟล์หลังจะ override ไฟล์ก่อน)node --env-file=.env --env-file=.env.local src/app.jsdotenv — วิธีคลาสสิก
หัวข้อที่มีชื่อว่า “dotenv — วิธีคลาสสิก”npm install dotenv// src/app.js — โหลดที่บรรทัดแรกสุดimport 'dotenv/config';
console.log(process.env.DATABASE_URL); // จาก .envbest practices สำหรับ env files
หัวข้อที่มีชื่อว่า “best practices สำหรับ env files”# .env — ค่า default, commit ใน git (ไม่มี secrets)NODE_ENV=developmentPORT=3000LOG_LEVEL=info
# .env.local — overrides เฉพาะเครื่อง, ไม่ commit (ใน .gitignore)DATABASE_URL=postgres://localhost:5432/mydbSECRET_KEY=dev-only-secret
# .env.example — template แสดง vars ที่ต้องการ, commit ไว้DATABASE_URL=SECRET_KEY=เพิ่ม .env.local และ .env*.local ใน .gitignore เสมอ ห้าม commit secrets จริง ๆ
package.json scripts — ตัวเชื่อมทุกอย่าง
หัวข้อที่มีชื่อว่า “package.json scripts — ตัวเชื่อมทุกอย่าง”{ "scripts": { "dev": "tsx watch src/app.ts", "build": "tsc --noEmit", "start": "node dist/app.js", "test": "node --test", "lint": "eslint src/ && prettier --check .", "format": "prettier --write . && eslint --fix src/" }}