Next.js 14 App Router 完全指南 – 服务端组件和流式渲染

App Router 简介

Next.js 14 的 App Router 是全新的文件系统路由系统,以 React Server Components(RSC)为核心。它提供了更好的性能、更简单的数据获取方式。

项目结构

app/
├── layout.tsx        # 根布局
├── page.tsx          # 首页 (/)
├── about/
│   └── page.tsx      # 关于页 (/about)
├── blog/
│   ├── page.tsx      # 博客列表 (/blog)
│   └── [slug]/
│       └── page.tsx  # 博客详情 (/blog/:slug)
├── loading.tsx        # 全局加载状态
├── error.tsx         # 全局错误边界
└── not-found.tsx     # 404 页面

布局(Layout)

// app/layout.tsx
export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html>
      <body>
        <nav>导航栏</nav>
        {children}
        <footer>页脚</footer>
      </body>
    </html>
  )
}
// app/blog/layout.tsx
export default function BlogLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <section>
      <aside>博客侧边栏</aside>
      {children}
    </section>
  )
}

页面(Page)

// app/page.tsx
export default function HomePage() {
  return <h1>欢迎来到首页</h1>
}

动态路由

// app/blog/[slug]/page.tsx
export default function BlogPost({
  params,
}: {
  params: { slug: string }
}) {
  return <h1>文章: {params.slug}</h1>
}

路由组

// app/(marketing)/about/page.tsx 和 /about 一样
// app/(marketing)/contact/page.tsx 和 /contact 一样

服务端组件 vs 客户端组件

服务端组件(默认)

// 默认是服务端组件,可以直接访问数据库
async function getPosts() {
  const res = await fetch('https://api.example.com/posts')
  return res.json()
}

export default async function Blog() {
  const posts = await getPosts()
  return (
    <ul>
      {posts.map(post => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  )
}

客户端组件

'use client'

import { useState } from 'react'

export default function Counter() {
  const [count, setCount] = useState(0)
  return (
    <button onClick={() => setCount(c => c + 1)}>
      点击次数: {count}
    </button>
  )
}

数据获取

// 在服务端组件中直接获取数据
async function getData() {
  const res = await fetch('https://api.example.com/data', {
    next: { revalidate: 3600 }, // ISR,每小时重新生成
  })
  return res.json()
}

加载状态

// app/loading.tsx
export default function Loading() {
  return <div>加载中...</div>
}

// app/blog/loading.tsx - 博客页专属加载状态
export default function BlogLoading() {
  return <div>博客加载中...</div>
}

错误处理

// app/error.tsx
'use client'

export default function Error({
  error,
  reset,
}: {
  error: Error
  reset: () => void
}) {
  return (
    <div>
      <h2>出错了!</h2>
      <button onClick={() => reset()}>重试</button>
    </div>
  )
}

总结

Next.js 14 App Router 是 React 全栈开发的最佳选择。它简化了数据获取、支持服务端组件、提供更好的性能。建议新项目直接使用 App Router。

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注