Next.js路由
目录结构分析
一、app 下的文件夹就是路由吗?
规则是:
app/
blog/
page.tsx
会生成:
/blog
但有一个特殊规则:
带括号的文件夹:(xxx)
叫:
Route Group(路由分组)
特点是:
不会出现在 URL 中
只用于组织结构 / layout
二、解释你这个结构(逐个对应 URL)
你的目录是:
app
├─ (auth)
│ └─ login
│ └─ page.tsx
│
└─ (main)
├─ blog
│ └─ [page]
│ └─ page.tsx
│
├─ posts
│ └─ [slug]
│ └─ page.tsx
│
└─ tags
└─ [tag]
└─ page.tsx
真实访问 URL 是:
/login
/blog/1
/posts/react-hooks
/tags/react
注意:
(auth) 不会出现在 URL
(main) 不会出现在 URL
三、那你当时为什么要设计 (auth) 和 (main)?
99% 的原因是:
为了用不同的 layout
这是 Next.js App Router 的一个核心设计。
举例:登录页不要导航栏
登录页
通常是:
没有 header
没有 sidebar
没有 footer
而博客页面需要:
header
footer
背景动画
导航
所以你当时大概率写了:
app
├─ (auth)
│ └─ layout.tsx
│
└─ (main)
└─ layout.tsx
四、这就是 Route Group 的典型用途
(auth) → 登录相关页面 layout
(main) → 正常网站 layout
五、我帮你画出你这个结构的真实逻辑
app
│
├─ (auth)
│ ├─ layout.tsx 登录页布局(无导航)
│ └─ login
│ └─ page.tsx /login
│
└─ (main)
├─ layout.tsx 主站布局(header/footer)
│
├─ blog
│ └─ [page]
│ └─ page.tsx /blog/1
│
├─ posts
│ └─ [slug]
│ └─ page.tsx /posts/react-hooks
│
└─ tags
└─ [tag]
└─ page.tsx /tags/react
六、再解释几个你目录里的关键点
[slug] 是动态路由
posts/[slug]/page.tsx
表示:
/posts/react-hooks
/posts/nextjs-guide
/posts/vue-tips
在代码里拿:
params.slug;
例如:
export default function Page({ params }: { params: { slug: string } }) {
console.log(params.slug);
}
[page] 是分页
blog/[page]/page.tsx
表示:
/blog/1
/blog/2
/blog/3
[tag] 是标签页
tags/[tag]/page.tsx
表示:
/tags/react
/tags/javascript
/tags/css
七、你这个结构其实是一个“标准博客结构”
非常合理,没有问题。
八、再解释一个你目录里的重要文件
layout.tsx
这是:
页面框架
例如:
export default function Layout({ children }) {
return (
<>
<Header />
{children}
<Footer />
</>
);
}
九、Next.js App Router 的 4 个核心文件(必须记住)
| 文件 | 作用 |
|---|---|
| page.tsx | 页面 |
| layout.tsx | 布局 |
| loading.tsx | 加载状态 |
| error.tsx | 错误页面 |
十、你这个博客的 URL 映射总结
| 目录 | URL |
|---|---|
| (auth)/login | /login |
| (main)/blog/[page] | /blog/1 |
| (main)/posts/[slug] | /posts/react-hooks |
| (main)/tags/[tag] | /tags/react |
十一、如果你现在重新开始,我建议保持这个结构(是对的)
app
├─ (auth)
│ └─ login
│
└─ (main)
├─ blog
├─ posts
├─ tags
这是:
推荐结构
十二、如果你以后要加评论系统,我建议放这里
src
└─ components
└─ Comment
├─ CommentList.tsx
└─ CommentForm.tsx
然后在:
posts/[slug]/page.tsx
里:
<CommentList slug={params.slug} />
<CommentForm slug={params.slug} />
最后一句总结(最重要)
app 下的文件夹 = 路由
但 (xxx) 是路由分组,不会出现在 URL 中