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,那就像城市里的地下地铁 ------ 看不见,却带来巨大效率提升。

相关推荐
阿虎儿16 小时前
React Context 详解:从入门到性能优化
前端·vue.js·react.js
颜酱17 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
Sailing17 小时前
🚀 别再乱写 16px 了!CSS 单位体系已经进入“计算时代”,真正的响应式布局
前端·css·面试
FansUnion17 小时前
我如何用 Next.js + Supabase + Cloudflare R2 搭建壁纸销售平台——月成本接近 $0
javascript
喝水的长颈鹿17 小时前
【大白话前端 03】Web 标准与最佳实践
前端
爱泡脚的鸡腿17 小时前
Node.js 拓展
前端·后端
左夕18 小时前
分不清apply,bind,call?看这篇文章就够了
前端·javascript
Zha0Zhun19 小时前
一个使用ViewBinding封装的Dialog
前端
兆子龙19 小时前
从微信小程序 data-id 到 React 列表性能优化:少用闭包,多用 data-*
前端
滕青山19 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js