📖 新手必读
项目完全指南
这份文档会带你从零开始,彻底理解这个项目的每一部分。
🏠1. 项目概览
这是一个用Next.js 16 + React 19 + TypeScript + Tailwind CSS v4 构建的现代网站。它包含首页、关于页、博客系统、404 页面和这份指南,是一个非常适合新手学习的前端项目模板。
你可以把 Next.js 理解为"加强版 React"——它提供了路由、服务端渲染、图片优化等开箱即用的能力,让构建一个完整的网站变得非常简单。
📁2. 完整的目录结构
📦2B. 自动生成 & 隐藏文件详解
你可能注意到了项目根目录下还有一些"没见过"的文件和文件夹。 下面逐一解释它们是什么、能不能改、能不能删。
node_modules/📁 文件夹npm install 时, npm 会读取 package.json 中列出的依赖,把它们全部下载到这个文件夹里。 这个文件夹通常非常大(几百 MB),所以 .gitignore 会把它排除在版本控制之外——永远不要把 node_modules 上传到 GitHub。类比:就像你去餐厅吃饭,厨房里已经备好了所有食材(node_modules), 你只管点菜(写 import),不用自己去买菜。
.next/📁 文件夹npm run dev 或 npm run build 时, Next.js 会把编译结果、缓存、路由类型文件等放在这里。里面主要有两个子文件夹:
▸
.next/dev/ — 开发模式的编译缓存(你改了代码浏览器就刷新,靠的就是它)▸
.next/types/ — 自动生成的 TypeScript 类型(让编辑器有智能提示)遇到奇怪问题时,可以删除
.next 文件夹然后重新 npm run dev,很多问题就这样解决了。.git/📁 文件夹(隐藏)git commit 的记录、分支信息、标签等都存储在这里。 它是一个隐藏文件夹(以 . 开头),在文件管理器中默认不可见。千万不要删除它——否则你将丢失所有的提交历史, 无法回退代码、无法查看之前的修改记录。
.gitignore📄 文件node_modules、.next、.env 等不需要上传到 GitHub 的目录和文件。为什么需要它?如果没有
.gitignore, Git 会把几百 MB 的 node_modules 也上传, 既浪费空间又拖慢速度。package-lock.json📄 文件类比:
package.json 写的是"我需要 React 19 以上版本",package-lock.json 写的是"我安装的 React 精确版本是 19.2.4, 它来自这个 URL,它的哈希值是 xxx"。有了它,所有人在任何地方 npm install 得到的都是一模一样的代码。next-env.d.ts📄 文件它被列在
.gitignore 中,所以不会上传到 GitHub。README.md📄 文件CLAUDE.md / AGENTS.md📄 文件例如,本项目的
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 件事
①路由 = 文件夹
app/about/page.tsx 这个文件,会自动变成 /about 这个网址。你不需要手动写路由配置表,只要创建文件夹和文件就行。带
[方括号] 的文件夹名是动态路由,比如 [slug] 可以匹配任意文章名。②page.tsx = 一个网址的页面内容
page.tsx 的文件才会生成一个可访问的网址。 你在 app 目录下创建的任何其他文件(如组件、工具函数)都不会自动变成网页。 这让你可以把组件和数据文件安全地放在相关页面的文件夹旁。③layout.tsx = 所有页面的外壳
layout.tsx 定义的 UI 会包裹它下面所有的子页面,而且在切换页面时不会重新渲染。本项目的根 layout 包含了导航栏、字体加载和全局元数据,所以你浏览任何页面都能看到顶部导航。④Server Component vs Client Component
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.tsxasync 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 改成你想跳转的路径。
💡 ① 创建 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.jsonshadcn 的配置文件。记录了组件路径(@/components/ui)、CSS 变量、 Tailwind 配置、图标库(lucide)等。每次运行 add 命令都会读取它。
lib/utils.tscn() 工具函数。它把 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 card | components/ui/card.tsx |
| 表单 | npx shadcn@latest add input | components/ui/input.tsx |
| 表单 | npx shadcn@latest add textarea | components/ui/textarea.tsx |
| 表单 | npx shadcn@latest add select | components/ui/select.tsx |
| 表单 | npx shadcn@latest add switch | components/ui/switch.tsx |
| 表单 | npx shadcn@latest add label | components/ui/label.tsx |
| 交互 | npx shadcn@latest add dialog | components/ui/dialog.tsx |
| 交互 | npx shadcn@latest add tabs | components/ui/tabs.tsx |
| 交互 | npx shadcn@latest add accordion | components/ui/accordion.tsx |
| 布局 | npx shadcn@latest add table | components/ui/table.tsx |
| 布局 | npx shadcn@latest add separator | components/ui/separator.tsx |
| 展示 | npx shadcn@latest add badge | components/ui/badge.tsx |
| 展示 | npx shadcn@latest add avatar | components/ui/avatar.tsx |
| 高级 | npx shadcn@latest add dropdown-menu | components/ui/dropdown-menu.tsx |
| 高级 | npx shadcn@latest add sonner | components/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 方法命名的 函数(如 GET、POST), Next.js 就会自动将对应的请求路由到该函数。
本项目的 API 文件结构:
这个 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-demopage.tsx(async 函数)fetch('/api/hello') → 调用自己的 APIroute.ts 的 GET() 执行 new Date() → 返回 JSON这 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