App Router 的目录结构 
└── app
    ├── page.js
    ├── layout.js
    ├── template.js
    ├── loading.js
    ├── error.js
    └── not-found.js
    ├── about
    │   └── page.js
    └── more
        └── page.js
layout / 与 template 的区别 
template 不会进行状态的保留,layout 会进行状态的保留
loading 
本质上
tsx
<Suspense fallback={<div>Loading...</div>}>
  <Page />
</Suspense>page throw 一个 promise,当组件加载完成,promise 会 resolve,替换掉 fallback 的组件
error & global error 
error 组件只能捕获页面级别的错误,而 global error 可以捕获顶层的错误(layout、template)
最佳实践
- 使用 global error 捕获顶层的错误
 - 使用 error 组件捕获页面级别的错误
 
not-found 
- 如果页面不存在,则显示 not-found 组件
 - 显示的返回 not-found 组件,寻找最近的 not-found 组件