App Router 与 `/app` 目录结构 & 布局系统的奇妙冒险 🏰

引子 ✨

在 React 与 Next.js 的江湖里,/app 目录就像一座新兴的城市。

它不再是老旧的 /pages 村,而是一座拥有地铁、环线和分区的现代都市。

layout.tsx 呢?它是这座城市的"城市规划师",负责决定每个区域的公共设施:路灯要不要亮,垃圾桶放哪儿,甚至决定所有页面是不是都要有同一条导航栏。

今天我们就来一次"城市规划科学之旅",从底层原理聊到写代码的手感,再加点幽默调料。👷‍♂️


/app 目录:模块化的大都会 🏙️

在 Next.js 13+ 的 App Router 模式下,/app 目录取代了 /pages,带来了更强的模块化和布局控制。

目录结构长啥样?

bash 复制代码
/app
  ├── layout.tsx
  ├── page.tsx
  ├── dashboard
  │    ├── layout.tsx
  │    └── page.tsx
  └── settings
       └── page.tsx
  • page.tsx:页面入口,就像一栋大楼的门口。🚪
  • layout.tsx:布局文件,决定这栋楼的公共走廊、楼梯间。🛗
  • 子目录(如 dashboardsettings):独立社区,可以有自己的小区布局。🏘️

layout.tsx:公共设施的灵魂架构师 🏗️

/app 体系里,layout.tsx 的存在很像操作系统里的 内核

它不会直接办事(不画 UI 元素),但它规定了 所有页面必须遵守的公共约定

一个例子:

javascript 复制代码
// app/layout.tsx
export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        <header>🌐 我是全站导航栏</header>
        <main>{children}</main>
        <footer>© 2025 --- 由 AI 友情提示:早点休息 🛌</footer>
      </body>
    </html>
  );
}

这里的 children 就像 Linux 里的进程调度:

  • 系统提供一个统一的"舞台"
  • 各个子页面在舞台上各显神通

层层嵌套:像套娃一样的布局 🪆

布局是可以嵌套的。

比如你网站有一个 /dashboard 区域,这里需要一个侧边栏。

你就可以在 /app/dashboard/layout.tsx 再放一个布局文件。

javascript 复制代码
// app/dashboard/layout.tsx
export default function DashboardLayout({ children }) {
  return (
    <section>
      <aside>📊 左边的侧边栏</aside>
      <div>{children}</div>
    </section>
  );
}

于是:

  1. 全局 layout.tsx 提供导航栏和页脚。
  2. dashboard/layout.tsx 再加一个侧边栏。
  3. /dashboard/page.tsx 显示具体数据。

最终渲染出来的页面,就像一层层套娃,既有全局的公共部分,又有局部的专属区域。


设计哲学:为什么要有布局系统?🤔

这其实与计算机体系结构的思想暗合。

  • CPU 上有全局寄存器(对应全局布局)。
  • 各进程也有私有寄存器(对应局部布局)。
  • 公共部分减少重复,局部部分灵活扩展。

如果没有布局系统,你可能会在每个页面里写十遍 <header>

这就像在每个函数里都自己实现 malloc ------ 既冗余又危险。💣


小结 🎯

  • /app 目录是新一代"城市",模块化、现代化。
  • layout.tsx 是公共设施规划师,决定整个页面的基调。
  • 布局可以像套娃一样嵌套,既有全局一致性,又能局部灵活。
  • 本质上,这是 软件工程里抽象与复用思想 的一次 UI 实践。

最后来点文学收尾 🌿

如果说 /app 目录是城市的街区,layout.tsx 就是那条永远亮着的街灯。

它不喧嚣,却默默守护着每一个来往的行人。

当你在 /dashboard 的深夜调试数据时,

它依旧会在顶端挂着那行"🌐 我是全站导航栏",提醒你:
不管走到哪里,你都还在这个城市的怀抱里。


✍️ 好啦,今天的"App Router 城市探险"就到此结束。

下次我们再聊聊 Server Components,那就像城市里的地下地铁 ------ 看不见,却带来巨大效率提升。

相关推荐
霍理迪1 天前
Vue的响应式和生命周期
前端·javascript·vue.js
李剑一1 天前
别再瞎写了!Cesium 模型 360° 环绕,4 套源码全公开,项目直接用
前端
小码哥_常1 天前
Android消息机制:Handler、Looper和Message的深度剖析
前端
小码哥_常1 天前
安卓开发新姿势:文件Picker全攻略,无痛适配不再难
前端
happymaker06261 天前
web前端学习日记——DAY04
前端·学习
发现一只大呆瓜1 天前
React-路由监听 / 跳转 / 守卫全攻略(附实战代码)
前端·react.js·面试
swipe1 天前
为什么 RAG 一定离不开向量检索:从文档向量化到语义搜索的工程实现
前端·llm·agent
OpenTiny社区1 天前
AI-Extension:让 AI 真的「看得到、动得了」你的浏览器
前端·ai编程·mcp
IT_陈寒1 天前
Redis缓存击穿:3个鲜为人知的防御策略,90%开发者都忽略了!
前端·人工智能·后端
竹林8181 天前
在Web3前端用Node.js子进程批量校验钱包,我踩了这些性能与安全的坑
javascript·node.js