0Pricing
TypeScript Academy · 课时

App Router 类型;服务器组件与客户端组件

理解 App Router 的默认行为(服务器组件)、何时选择客户端组件,以及如何为路由处理器指定类型。

App Router 类型;服务器组件与客户端组件 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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>
  )
}

路由处理程序

在 app/api/*/route.ts 下使用 NextRequest/NextResponse 编写带类型的处理程序。使用状态码返回 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 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 3 节课。

「App Router 类型;服务器组件与客户端组件」这节课中我会学到什么?

理解 App Router 的默认行为(服务器组件)、何时选择客户端组件,以及如何为路由处理器指定类型。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「App Router 类型;服务器组件与客户端组件」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. App Router 类型;服务器组件与客户端组件
  2. 数据获取与操作类型
  3. 环境变量类型与配置
← 返回 TypeScript Academy