📖 新手必读

项目完全指南

这份文档会带你从零开始,彻底理解这个项目的每一部分。

🏠1. 项目概览

这是一个用Next.js 16 + React 19 + TypeScript + Tailwind CSS v4 构建的现代网站。它包含首页、关于页、博客系统、404 页面和这份指南,是一个非常适合新手学习的前端项目模板。

你可以把 Next.js 理解为"加强版 React"——它提供了路由、服务端渲染、图片优化等开箱即用的能力,让构建一个完整的网站变得非常简单。

📁2. 完整的目录结构

my-app/项目根目录
├── app/🔑 应用核心目录(App Router 的入口)
_components/私有组件目录(_ 前缀 = 不可路由)
Nav.tsx顶部导航栏组件
about/→ /about 关于页
page.tsx介绍 Next.js 特性与概念
blog/→ /blog 博客系统
_data.ts博客数据源(4 篇文章的完整内容)
page.tsxpage博客列表页(卡片网格)
[slug]/动态路由(文章详情页)
page.tsxpage根据 URL 中的 slug 显示对应文章
guide/→ /guide 本文档
page.tsxpage项目完全指南
layout.tsx根布局 —— 所有页面的外壳(导航栏 + 字体 + 元数据)
page.tsxpage→ / 首页
not-found.tsx→ 404 页面(访问不存在的路径时自动显示)
globals.css全局样式(Tailwind + shadcn CSS 变量 + 暗色主题)
shadcn/→ /shadcn 组件展示页
page.tsxpage16 个 shadcn 组件的互动演示
api/后端 API 路由(Route Handler)
hello/→ /api/hello 服务器时间接口
route.tsGET() 返回服务器日期、时间、时区
server-demo/→ /server-demo 全栈演示页
page.tsxpage服务端 fetch API,展示服务器实时时间
├── components/shadcn/ui 组件库(16 个可复用 UI 组件)
ui/所有 shadcn 组件
button / card / badge基础组件
input / textarea / select表单组件
dialog / tabs / accordion交互组件
table / avatar / separator布局组件
dropdown-menu / sonner高级组件
switch / label辅助组件
├── lib/工具函数目录
utils.tscn() 函数(合并 Tailwind class)
├── components.jsonshadcn 配置文件(定义组件路径、CSS 变量、图标库)
├── public/静态资源目录(图片 / SVG 等,可通过 URL 直接访问)
images/图片文件夹
next.svgNext.js Logo
vercel.svgVercel Logo
file.svg / globe.svg / window.svg其他图标
├── package.json项目配置:依赖包 & 启动脚本
├── package-lock.json依赖版本锁定文件(自动生成,不要手动改)
├── tsconfig.jsonTypeScript 编译配置
├── next.config.tsNext.js 框架配置
├── next-env.d.tsNext.js 的 TypeScript 类型声明(自动生成)
├── postcss.config.mjsPostCSS 配置(Tailwind 需要)
├── eslint.config.mjsESLint 代码检查规则
├── README.md项目自述文件(给开发者看的项目介绍)
├── .gitignore告诉 Git 哪些文件不需要上传(node_modules 等)
├── CLAUDE.md / AGENTS.mdAI 编程助手的项目规则文件
├── .git/Git 版本控制的仓库数据(隐藏文件夹)
├── node_modules/所有第三方依赖包的安装目录(很大,不要上传)
├── .next/Next.js 构建输出目录(自动生成,可以删除重来)

📦2B. 自动生成 & 隐藏文件详解

你可能注意到了项目根目录下还有一些"没见过"的文件和文件夹。 下面逐一解释它们是什么、能不能改、能不能删。

node_modules/📁 文件夹
谁创建的:npm install 自动生成
能改吗:❌ 千万不要手动修改
能删吗:✅ 可以删除(再 npm install 能恢复)
这是所有第三方依赖包的"仓库"。当你运行 npm install 时, npm 会读取 package.json 中列出的依赖,把它们全部下载到这个文件夹里。 这个文件夹通常非常大(几百 MB),所以 .gitignore 会把它排除在版本控制之外——永远不要把 node_modules 上传到 GitHub

类比:就像你去餐厅吃饭,厨房里已经备好了所有食材(node_modules), 你只管点菜(写 import),不用自己去买菜。
.next/📁 文件夹
谁创建的:next dev / next build 自动生成
能改吗:❌ 不要手动修改
能删吗:✅ 可以删除(重新运行即可恢复)
这是 Next.js 的构建输出目录。当你运行 npm run devnpm run build 时, Next.js 会把编译结果、缓存、路由类型文件等放在这里。

里面主要有两个子文件夹:
.next/dev/ — 开发模式的编译缓存(你改了代码浏览器就刷新,靠的就是它)
.next/types/ — 自动生成的 TypeScript 类型(让编辑器有智能提示)

遇到奇怪问题时,可以删除 .next 文件夹然后重新 npm run dev,很多问题就这样解决了。
.git/📁 文件夹(隐藏)
谁创建的:git init 自动创建
能改吗:❌ 绝对不要手动修改
能删吗:⚠ 删除会丢失所有版本历史
这是 Git 版本控制的全部数据。你每一次 git commit 的记录、分支信息、标签等都存储在这里。 它是一个隐藏文件夹(以 . 开头),在文件管理器中默认不可见。

千万不要删除它——否则你将丢失所有的提交历史, 无法回退代码、无法查看之前的修改记录。
.gitignore📄 文件
谁创建的:脚手架自动生成
能改吗:✅ 可以按需修改
能删吗:⚠ 不建议删除
告诉 Git 哪些文件不需要追踪。里面列出了 node_modules.next.env 等不需要上传到 GitHub 的目录和文件。

为什么需要它?如果没有 .gitignore, Git 会把几百 MB 的 node_modules 也上传, 既浪费空间又拖慢速度。
package-lock.json📄 文件
谁创建的:npm install 自动生成
能改吗:❌ 不要手动修改
能删吗:⚠ 不建议删除
这是依赖包的精确版本快照。它记录了每一个包的确切版本号和下载地址,确保你和其他开发者安装的依赖 完全一致。

类比:package.json 写的是"我需要 React 19 以上版本",package-lock.json 写的是"我安装的 React 精确版本是 19.2.4, 它来自这个 URL,它的哈希值是 xxx"。有了它,所有人在任何地方 npm install 得到的都是一模一样的代码。
next-env.d.ts📄 文件
谁创建的:next dev 自动生成
能改吗:❌ 不要修改(文件里写了提示)
能删吗:✅ 可以删除(重启 dev 会自动重建)
这是 Next.js 为 TypeScript 生成的类型声明文件。 它告诉 TypeScript 编译器关于 Next.js 的特殊类型信息(如 图片导入的类型、路由参数的类型等),让你在编辑器中获得准确的 代码提示和自动补全。

它被列在 .gitignore 中,所以不会上传到 GitHub。
README.md📄 文件
谁创建的:脚手架自动生成
能改吗:✅ 随便改
能删吗:⚠ 建议保留(GitHub 默认展示它)
项目的自我介绍。在 GitHub 上打开项目仓库时, 这个文件的内容会自动渲染并展示在文件列表下方。 通常写项目简介、如何安装、如何运行等信息。 你可以随意改成你自己的内容。
CLAUDE.md / AGENTS.md📄 文件
谁创建的:AI 编程助手自动创建
能改吗:✅ 可以修改
能删吗:⚠ 建议保留
这两个文件是给 AI 编程助手(比如 Claude Code)看的。 它们告诉 AI 一些项目特有的规则和注意事项。

例如,本项目的 AGENTS.md 提示 AI: "这个版本的 Next.js 有破坏性变更,请先阅读文档再写代码"。 这能帮助 AI 生成更符合项目实际情况的代码。

⚙️3. 技术栈详解

Next.js 16.2.9

基于 React 的全栈 Web 框架。提供路由、渲染、优化等一整套方案。

  • 使用 Turbopack(Rust 编写)作为打包工具,开发时编译极快
  • 支持 App Router(推荐)和 Pages Router 两种路由模式
  • 内置图片优化、字体优化、代码分割
  • `npm run dev` → 启动开发服务器(热更新)
  • `npm run build` → 构建生产版本

React 19.2.4

用户界面(UI)构建库。一切页面都是由 React 组件组成的。

  • 支持 Server Components(默认)和 Client Components(需 'use client')
  • Server Components 在服务器运行,不发 JS 到浏览器
  • Client Components 在浏览器运行,支持交互和状态

TypeScript 5

带类型系统的 JavaScript。写代码时就能发现错误。

  • `.tsx` 文件 = TypeScript + JSX(组件文件)
  • `.ts` 文件 = 纯 TypeScript(工具 / 数据文件)
  • interface 定义数据结构,export/import 共享代码

Tailwind CSS v4

原子化 CSS 框架。直接在 HTML 中用 class 写样式。

  • 无需单独写 .css 文件,样式直接写在 JSX 的 className 中
  • dark: 前缀实现暗色模式(如 dark:bg-black)
  • sm:/md:/lg: 前缀实现响应式(移动端 → 桌面端)
  • v4 使用 @import 'tailwindcss' 导入,自动移除未用样式

🧠4. 核心概念 —— 你需要知道的 6 件事

路由 = 文件夹

Next.js 用文件夹结构自动生成 URL 路由。 比如 app/about/page.tsx 这个文件,会自动变成 /about 这个网址。你不需要手动写路由配置表,只要创建文件夹和文件就行。

[方括号] 的文件夹名是动态路由,比如 [slug] 可以匹配任意文章名。

page.tsx = 一个网址的页面内容

在 App Router 中,只有名为 page.tsx 的文件才会生成一个可访问的网址。 你在 app 目录下创建的任何其他文件(如组件、工具函数)都不会自动变成网页。 这让你可以把组件和数据文件安全地放在相关页面的文件夹旁。

layout.tsx = 所有页面的外壳

layout.tsx 定义的 UI 会包裹它下面所有的子页面,而且在切换页面时不会重新渲染。本项目的根 layout 包含了导航栏、字体加载和全局元数据,所以你浏览任何页面都能看到顶部导航。

Server Component vs Client Component

Server Component(默认):在服务器上运行,不发送 JS 到浏览器。适合展示内容、获取数据。
Client Component(需加 "use client":在浏览器中运行,支持 onClick、useState、useEffect 等交互逻辑。本项目的 Nav 导航栏就是 Client Component,因为它需要用到 usePathname() 来高亮当前页面。

Tailwind 暗色模式怎么工作

项目中同时写亮色和暗色的样式,比如 bg-white dark:bg-black。没有 dark: 前缀的类在亮色模式生效,有 dark: 的类在暗色模式生效。浏览器会根据系统设置自动切换。 颜色变量(--background--foreground)定义在 globals.css 中。

数据流:从 `_data.ts` 到页面

博客系统的数据流程如下:
_data.ts 定义文章数据 + getPost() 查找函数
② 博客列表页 page.tsx 导入 posts,用 .map() 渲染卡片
③ 文章详情页 [slug]/page.tsx getPost(slug) 找到对应文章
generateStaticParams() 告诉 Next.js 在构建时预生成所有 4 篇文章的 HTML

🔍5. 每个页面是如何工作的

/首页app/page.tsx

项目的门面。展示 Next.js Logo、欢迎文字和两个按钮(关于 Next.js / 官方文档)。使用了 next/image 组件优化图片加载。

/about关于页app/about/page.tsx

详细介绍 Next.js 的各项特性。页面用 2×3 的卡片网格展示 6 大核心特性,下半部分用列表展示关键概念(附带链接跳转官方文档),底部有一个终端风格的快速开始代码块。

/blog博客列表app/blog/page.tsx

展示 4 篇博客文章卡片,2×2 网格布局。每张卡片包含 emoji 封面、分类标签、日期、标题、摘要和阅读时长。卡片 hover 时有阴影效果,点击进入文章详情页。

/blog/[slug]文章详情app/blog/[slug]/page.tsx

动态路由页面。URL 中的 [slug] 会被替换为真实文章名。页面顶部显示分类标签+日期+时长,中间是完整的文章正文(支持标题、段落和代码块渲染),底部有返回博客的导航。

/api/hello后端 APIapp/api/hello/route.ts

一个 Route Handler(路由处理器)。导出一个 async GET() 函数,Next.js 自动把 /api/hello 映射给它。用 new Date() 获取服务器时间,通过 NextResponse.json() 返回日期、时间、时区、Unix 时间戳等数据。

/server-demo全栈演示app/server-demo/page.tsx

async Server Component。在服务端通过 fetch('/api/hello') 调用自己的 API,拿到数据后渲染为 HTML。整个数据流转在服务端完成,浏览器收到的是带完整数据的页面。

/shadcnshadcn 组件展示app/shadcn/page.tsx

演示 16 个 shadcn/ui 组件(Button、Card、Dialog、Tabs、Table 等)。这是一份互动式「组件目录」,每个组件都有可点击的实例,你可以直接看到它们长什么样,然后复制到自己的页面中使用。

/guide项目指南app/guide/page.tsx

就是你现在看的这一页!一份写给新手的完整说明书。

任意不存在的路径404 页面app/not-found.tsx

当用户访问不存在的网址时,Next.js 自动显示这个 404 页面。包含友好的提示文案和返回首页的按钮。

🛠️6. 动手试一试

最好的学习方式就是动手修改。下面是一些按难度排序的练习建议,每个练习都不会"搞坏"项目,大胆尝试!

⭐ 入门把首页的标题文字改成你自己的话

💡 打开 app/page.tsx,找到 h1 标签,修改里面的文字,保存后浏览器会自动刷新。

⭐⭐ 简单新增一个博客分类标签

💡 打开 app/blog/_data.ts,找到 category 字段,把其中一篇文章的分类改成你喜欢的词(比如 'React'),保存后查看效果。

⭐⭐⭐ 中等在导航栏里添加一个新的链接

💡 打开 app/_components/Nav.tsx,在 links 数组里添加 { href: '/about', label: '新链接' },然后把 href 改成你想跳转的路径。

⭐⭐⭐⭐ 挑战创建一个全新的页面(比如 /photos)

💡 ① 创建 app/photos/ 文件夹 ② 在里面创建 page.tsx ③ 参考 app/about/page.tsx 的写法写一个组件 ④ 在 Nav.tsx 的 links 数组里添加新入口。

💻7. 常用命令速查

npm run dev启动开发服务器(有热更新,边改边看效果)
npm run build构建生产版本(生成优化后的静态文件)
npm run start启动生产服务器(必须先 build)
npm run lint运行 ESLint 检查代码质量
npx create-next-app@latest my-app --yes用脚手架创建一个新的 Next.js 项目

🧩8. shadcn/ui 组件库详解

shadcn/ui 是目前最流行的 React 组件方案之一。它和我们这个项目的 关系非常紧密,下面从"它是什么 → 怎么来的 → 改了哪些代码 → 怎么用"四个角度彻底讲清楚。

8.1 什么是 shadcn/ui?

shadcn/ui 不是一个 npm 包。它是一套可以直接 复制到项目中的、基于 Base UI(Radix UI 的精神继承者)+ Tailwind CSS 构建的组件集合。和 MUI、Ant Design 不同—— 你拥有组件的全部源代码,随时可以直接修改。

  • 组件源码在你的项目中(components/ui/),完全掌控
  • 底层使用 Base UI(@base-ui/react)提供无障碍和交互逻辑
  • 样式靠 Tailwind CSS + CSS 变量(在 globals.css 中定义)
  • 通过 npx shadcn@latest add <组件名> 命令安装
  • 图标库使用 lucide-react(1000+ SVG 图标)

8.2 安装过程 —— 到底改了哪些文件?

安装 shadcn/ui 分为两步:init 初始化 + add 添加组件。 下面逐一说明每一步做了什么。

📦 第一步:npx shadcn@latest init -d

初始化 shadcn,新增 3 个文件,修改 1 个文件

新增components.json

shadcn 的配置文件。记录了组件路径(@/components/ui)、CSS 变量、 Tailwind 配置、图标库(lucide)等。每次运行 add 命令都会读取它。

新增lib/utils.ts

cn() 工具函数。它把 clsx(条件 class)和 tailwind-merge(冲突 class 自动去重)组合在一起,是每个组件都需要用到的底层工具。

新增components/ui/button.tsx

第一个组件 —— Button。init 默认安装 Button 作为「种子组件」,其他组件通过 add 命令按需添加。

修改app/globals.css

这是变化最大的文件。init 在里面添加了: ① @import 'shadcn/tailwind.css'(shadcn 的基础样式) ② @import 'tw-animate-css'(动画库) ③ CSS 自定义变量(:root + .dark),定义了 --background、--foreground、--primary、 --card、--border 等 40+ 个设计 Token

新增依赖package.json

安装了 clsx、tailwind-merge、class-variance-authority、 @base-ui/react、lucide-react、tw-animate-css 等新依赖

📦 第二步:npx shadcn@latest add (15 个组件)

每个 add 命令都会在 components/ui/ 目录下创建对应的 .tsx 文件。

分类安装命令生成文件
基础npx shadcn@latest add cardcomponents/ui/card.tsx
表单npx shadcn@latest add inputcomponents/ui/input.tsx
表单npx shadcn@latest add textareacomponents/ui/textarea.tsx
表单npx shadcn@latest add selectcomponents/ui/select.tsx
表单npx shadcn@latest add switchcomponents/ui/switch.tsx
表单npx shadcn@latest add labelcomponents/ui/label.tsx
交互npx shadcn@latest add dialogcomponents/ui/dialog.tsx
交互npx shadcn@latest add tabscomponents/ui/tabs.tsx
交互npx shadcn@latest add accordioncomponents/ui/accordion.tsx
布局npx shadcn@latest add tablecomponents/ui/table.tsx
布局npx shadcn@latest add separatorcomponents/ui/separator.tsx
展示npx shadcn@latest add badgecomponents/ui/badge.tsx
展示npx shadcn@latest add avatarcomponents/ui/avatar.tsx
高级npx shadcn@latest add dropdown-menucomponents/ui/dropdown-menu.tsx
高级npx shadcn@latest add sonnercomponents/ui/sonner.tsx

8.3 展示页 —— 我们额外写了什么?

除了安装组件,我们还创建了 app/shadcn/page.tsx(组件展示页) 修改了导航栏,让所有组件可以被直观地浏览和测试:

  • app/shadcn/page.tsx — 展示页("use client"),按编号展示 9 大组件区块
  • 每个区块都是可互动的真实示例(按钮可点击、表单可提交、弹窗可打开)
  • 表单示例使用 useState 管理状态,提交后通过 Sonner 弹出通知
  • app/_components/Nav.tsx — 新增 { href: '/shadcn', label: '组件' }

8.4 怎么在自己的页面中使用?

只需要 3 步,和用普通 React 组件完全一样:

① 导入

import { Button } from "@/components/ui/button"

路径 @/ 是 tsconfig.json 中配置的别名,等于项目根目录

② 使用

<Button variant="outline">点击我</Button>

每个组件的 props 不同,参考展示页或 shadcn 官方文档

③ 添加新组件

npx shadcn@latest add skeleton

运行命令后,组件文件自动出现在 components/ui/ 下,直接 import 即可

8.5 核心设计理念 —— 为什么这么受欢迎?

源码属于你

组件文件在你的项目里,不是 node_modules。改样式不用 hack,直接编辑 .tsx 就行。

按需安装

用不到的组件不会出现在项目中,保持仓库干净。不像 MUI 那样一装就带上几百个组件。

Tailwind 原生

className 就是样式。没有 styled-components,没有 CSS-in-JS,一套工具搞定。

无障碍内置

Base UI 提供了键盘导航、ARIA 属性、焦点管理等无障碍功能,开箱即用。

设计 Token

所有颜色、圆角、间距都通过 CSS 变量控制。改一处全局生效,换主题非常简单。

类型安全

所有组件都有完整的 TypeScript 类型定义,VSCode 里自动补全不会出错。

🛰️9. 左下角悬浮按钮 —— Next.js DevTools

在运行 npm run dev 时,你是否注意到浏览器左下角出现了一个 小图标?那是 Next.js 16 内置的开发指示器(DevTools), 它是你在开发阶段最忠实的"副驾驶"。

9.1 它是什么?

Next.js DevTools 是框架内置的开发辅助工具。它会在开发 模式下的浏览器页面中自动显示一个悬浮图标,不需要安装任何浏览器插件或 npm 包——只要你运行了 npm run dev,它就会出现。

它是通过一个独立的 JavaScript 脚本(next-devtools)加载的, 在生成的 HTML 中你可以看到类似这样的引用:

<script src="/_next/static/chunks/...next-devtools_index_...js" async></script>

这个脚本只在开发模式下加载,生产构建(npm run build) 后不会包含,所以你的真实用户永远看不到它。

9.2 它显示什么信息?

路由渲染状态

告诉你当前页面是静态渲染(Static)还是动态渲染(Dynamic)。静态页面在构建时生成,动态页面在每次请求时生成。

编译错误提示

当你的代码有语法或类型错误时,DevTools 图标会变成红色,点击可以查看完整的错误信息和调用栈。

页面编译进度

首次访问某个页面时,DevTools 会显示编译进度;编译完成后,图标恢复到正常状态。

一键跳转源码

点击 DevTools 中的文件路径,可以直接在 VS Code 中打开对应的源文件,定位到出错的行。

9.3 怎么配置它的位置和行为?

默认情况下,它出现在左下角。你可以通过 next.config.ts 中的 devIndicators 选项来 调整位置或完全隐藏它:

📍 改到右下角

devIndicators: { position: "bottom-right" }

可选值:bottom-left / bottom-right / top-left / top-right

🙈 完全隐藏

devIndicators: false

隐藏后编译错误仍会在终端和控制台中显示,不会丢失任何信息。

9.4 它的底层实现

  • 由 Next.js 编译器在 dev 模式下自动注入 next-devtools 脚本
  • 通过 Turbopack HMR(热模块替换)WebSocket 实时接收编译状态
  • 底层使用 React 渲染 UI,和你的应用共享同一个 React 实例
  • 生产构建(next build)时,devIndicators 相关代码完全不会被打包
  • 它的核心职责是「开发体验」——让你在写代码时获得即时反馈

9.5 常见问题

为什么只有 dev 模式才能看到?

这是刻意设计——DevTools 的目的是帮助开发,对终端用户没有价值,而且会增加 JS 体积。生产环境不需要它。

它会影响页面性能吗?

几乎不会。它是一个非常轻量的脚本,只监听编译事件,不参与你的业务逻辑渲染。

为什么有时候图标是灰色的?

灰色表示当前页面已经编译完成,没有错误。如果变成红色,说明有编译错误需要修复。

🔗10. 全栈开发 —— API + 页面数据联动

前面 9 节都在讲前端。这一节展示 Next.js 的后端能力—— 通过 Route Handler 创建 API,再让前端页面在服务端调用自己的 API, 实现完整的全栈数据流转。

10.1 后端 API:app/api/hello/route.ts

在 App Router 中,Route Handler route.ts 文件定义。只需导出一个以 HTTP 方法命名的 函数(如 GETPOST), Next.js 就会自动将对应的请求路由到该函数。

本项目的 API 文件结构:

app/api/hello/route.ts → 访问 /api/hello

这个 API 做的事情非常直观:

  • 用 new Date() 获取服务器的当前时间
  • 格式化为中文日期(2026年6月13日星期六)
  • 格式化为 24 小时制时间(11:10:01)
  • 获取服务器时区(Asia/Shanghai)
  • 计算 Unix 时间戳
  • 返回 Node.js 版本、操作系统、CPU 架构等环境信息
  • 通过 NextResponse.json() 将所有数据打包为 JSON 返回

10.2 前端页面:app/server-demo/page.tsx

这是一个 async Server Component。它本身在服务端 运行,在渲染 HTML 之前先通过 fetch 调用自己的 API 获取数据,然后把数据填充到页面中。浏览器收到的是已经包含完整数据的 静态 HTML,不需要任何客户端 JavaScript。

页面展示了以下内容:

  • 4 张数据卡片:日期、时间、时区、Unix 时间戳、UTC 时间
  • 服务器环境信息:Node.js 版本、操作系统、CPU 架构
  • 技术说明:解释 API → 页面 → 数据流转的完整链路
  • 刷新按钮:重新请求页面即可获取最新时间
  • 错误处理:API 不可用时显示友好提示而非报错

10.3 数据如何流转?

🌐 浏览器访问 /server-demo
⚡ Next.js 服务端调用 page.tsx(async 函数)
📡 fetch('/api/hello') → 调用自己的 API
🔧 route.tsGET() 执行 new Date() → 返回 JSON
📄 数据填入页面 → 渲染为完整 HTML
🌐 HTML 返回给浏览器(无需客户端 JS)

这 6 步全部在服务端完成。用户浏览器只发起一次 HTTP 请求,收到的就是一个已经包含所有数据的完整页面。这就是 Next.js "全栈框架" 的核心价值——前端和后端在同一个项目中协作,不需要分开部署。

10.4 关键概念:Route Handler vs Server Component

Route Handler(route.ts)

  • ▸ 对应一个 URL 端点(如 /api/hello)
  • ▸ 导出 GET / POST / PUT 等函数
  • ▸ 返回 JSON 或其他数据格式
  • ▸ 适合:API 接口、Webhook 接收端
  • ▸ 不能被直接"访问"为页面

Server Component(page.tsx)

  • ▸ 对应一个页面 URL(如 /server-demo)
  • ▸ 导出一个 React 组件(可 async)
  • ▸ 返回 HTML 页面
  • ▸ 适合:需要从数据库/API 获取数据的页面
  • ▸ 可以在渲染前 fetch 自己的 API

10.5 动手验证

    1在浏览器访问 http://localhost:3000/api/hello,看到 JSON 原始数据
    2访问 /server-demo,看到用这些 JSON 数据渲染的漂亮页面
    3多次刷新 /server-demo,时间会实时更新(因为使用了 cache: 'no-store')
    4在终端中 curl http://localhost:3000/api/hello,体验命令行调用 API
    5尝试修改 route.ts 中的返回数据,刷新页面看变化(dev 模式热更新)