ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์
ทำความเข้าใจค่าเริ่มต้นของ App Router (คอมโพเนนต์ฝั่งเซิร์ฟเวอร์) เรียนรู้ว่าเมื่อใดควรเลือกใช้คอมโพเนนต์ฝั่งไคลเอ็นต์ และวิธีกำหนดชนิดข้อมูลให้ตัวจัดการเส้นทาง
ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์ เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
บทนำ
เป้าหมาย: ใช้ตัวจัดเส้นทางแอปกับ TypeScript ได้อย่างมั่นใจ คุณจะได้เห็นคอมโพเนนต์ฝั่งเซิร์ฟเวอร์ซึ่งเป็นค่าเริ่มต้น เลือกใช้คอมโพเนนต์ฝั่งไคลเอ็นต์เมื่อจำเป็น และกำหนดชนิดให้ตัวจัดการเส้นทางสำหรับจุดเชื่อมต่อ API
- ความสามารถของฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์
- การส่งพร็อพที่มีชนิดระหว่างทั้งสองฝั่ง
- NextRequest/NextResponse ที่มีชนิด
คอมโพเนนต์ฝั่งเซิร์ฟเวอร์
ไฟล์ภายใต้ app/ เป็นคอมโพเนนต์ฝั่งเซิร์ฟเวอร์โดยค่าเริ่มต้น คุณสามารถเรียกใช้โค้ดเฉพาะฝั่งเซิร์ฟเวอร์และดึงข้อมูลก่อนการเรนเดอร์
// app/page.tsx (server component by default)
export default async function Page() {
// Server code: read env, fetch data, call DB (conceptually)
const data: { message: string } = { message: "Hello from server component" }
return (
<main style={{ display: "grid", gap: 8 }}>
<h1>Home</h1>
<p>{data.message}</p>
</main>
)
}คอมโพเนนต์ฝั่งไคลเอ็นต์
เพิ่มคำสั่ง "use client" ที่ด้านบนเพื่อเปิดใช้ฮุกและตัวจัดการเหตุการณ์ คอมโพเนนต์ฝั่งไคลเอ็นต์จะทำงานในเบราว์เซอร์
"use client"
import { useState } from "react"
// app/components/Counter.tsx (client component)
export default function Counter() {
const [n, setN] = useState(0)
return (
<div style={{ display: "flex", gap: 8, alignItems: "center" }}>
<button onClick={() => setN(n - 1)}>-</button>
<span>{n}</span>
<button onClick={() => setN(n + 1)}>+</button>
</div>
)
}พร็อพจากเซิร์ฟเวอร์ไปไคลเอ็นต์
คำนวณข้อมูลบนเซิร์ฟเวอร์ แล้วส่งข้อมูลนั้นเป็นพร็อพที่มีชนิดไปยังคอมโพเนนต์ฝั่งไคลเอ็นต์ เก็บตรรกะเฉพาะฝั่งเซิร์ฟเวอร์ให้ห่างจากไคลเอ็นต์
// app/page.tsx (server) + client import
import Counter from "./components/Counter"
export default async function Page() {
const initial = 5 // fetched or computed on the server
return (
<main style={{ display: "grid", gap: 12 }}>
<h2>Dashboard</h2>
<CounterWithStart start={initial} />
</main>
)
}
// app/components/CounterWithStart.tsx
"use client"
import { useState } from "react"
export default function CounterWithStart({ start }: { start: number }) {
const [n, setN] = useState(start)
return (
<div style={{ display: "flex", gap: 8, alignItems: "center" }}>
<button onClick={() => setN(n - 1)}>-</button>
<span>{n}</span>
<button onClick={() => setN(n + 1)}>+</button>
</div>
)
}ตัวจัดการเส้นทาง
ใช้ NextRequest/NextResponse สำหรับตัวจัดการที่มีชนิดภายใต้ app/api/*/route.ts ส่งคืน JSON พร้อมรหัสสถานะ
// app/api/hello/route.ts (App Router API)
import { NextRequest, NextResponse } from "next/server"
export async function GET(req: NextRequest) {
const name = req.nextUrl.searchParams.get("name") ?? "world"
const body: { message: string } = { message: `Hello, ${name}!` }
return NextResponse.json(body, { status: 200 })
}
export async function POST(req: NextRequest) {
const payload = (await req.json()) as { name?: string }
const body = { created: true, name: payload.name ?? "anon" }
return NextResponse.json(body, { status: 201 })
}เคล็ดลับ
เคล็ดลับ:
- ใช้คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เป็นค่าเริ่มต้น และเลือกใช้ฝั่งไคลเอ็นต์เฉพาะเมื่อต้องการการโต้ตอบ
- ทำให้พร็อพมีขนาดเล็กและสามารถทำให้เป็นอนุกรมได้เมื่อส่งระหว่างเซิร์ฟเวอร์กับไคลเอ็นต์
- ใช้รูปร่างของ
NextResponse.jsonที่มีชนิดอย่างสอดคล้องกัน
การตรวจสอบไคลเอ็นต์ของตัวจัดเส้นทางแอป
ตรวจสอบอย่างรวดเร็ว: จะเปิดใช้ฮุกในไฟล์คอมโพเนนต์ภายใต้ตัวจัดเส้นทางแอปได้อย่างไร
สรุปทบทวน
สรุปทบทวน: ตัวจัดเส้นทางแอปใช้คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เป็นค่าเริ่มต้น เพิ่ม "use client" เพื่อเปิดใช้การโต้ตอบ ส่งพร็อพที่มีชนิดข้ามขอบเขต และกำหนดชนิดให้ตัวจัดการเส้นทางด้วย NextRequest/NextResponse
คำถามที่พบบ่อย
บทเรียน “ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์”
ทำความเข้าใจค่าเริ่มต้นของ App Router (คอมโพเนนต์ฝั่งเซิร์ฟเวอร์) เรียนรู้ว่าเมื่อใดควรเลือกใช้คอมโพเนนต์ฝั่งไคลเอ็นต์ และวิธีกำหนดชนิดข้อมูลให้ตัวจัดการเส้นทาง คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน
บทเรียน “ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์
- การดึงข้อมูลและการกำหนดชนิดข้อมูลแอ็กชัน
- การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า