0Pricing
TypeScript Academy · บทเรียน

ชนิดข้อมูลของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชนิดข้อมูลของ App Router; คอมโพเนนต์ฝั่งเซิร์ฟเวอร์เทียบกับฝั่งไคลเอ็นต์
  2. การดึงข้อมูลและการกำหนดชนิดข้อมูลแอ็กชัน
  3. การกำหนดชนิดข้อมูลตัวแปรสภาพแวดล้อมและการตั้งค่า
← กลับไปที่ TypeScript Academy