项目结构与组织
本页全面介绍了 Next.js 中所有文件夹与文件约定,并提供项目组织建议。
文件夹与文件约定
顶级文件夹
顶级文件夹用于组织应用程序代码和静态资源。

顶级文件
顶级文件用于配置应用程序、管理依赖项、运行中间件、集成监控工具以及定义环境变量。
Next.js 相关 | |
next.config.js | Next.js 配置文件 |
package.json | 项目依赖项与脚本 |
instrumentation.ts | OpenTelemetry 与性能监控文件 |
middleware.ts | Next.js 请求中间件 |
.env | 环境变量 |
.env.local | 本地环境变量 |
.env.production | 生产环境变量 |
.env.development | 开发环境变量 |
.eslintrc.json | ESLint 配置文件 |
.gitignore | Git 忽略文件列表 |
next-env.d.ts | Next.js 的 TypeScript 声明文件 |
tsconfig.json | TypeScript 配置文件 |
jsconfig.json | JavaScript 配置文件 |
路由文件
layout | .js .jsx .tsx | 布局组件 |
page | .js .jsx .tsx | 页面组件 |
loading | .js .jsx .tsx | 加载状态 UI |
not-found | .js .jsx .tsx | 404 页面 |
error | .js .jsx .tsx | 错误边界 UI |
global-error | .js .jsx .tsx | 全局错误边界 |
route | .js .ts | API 端点 |
template | .js .jsx .tsx | 可重渲染的布局 |
default | .js .jsx .tsx | 并行路由的备用页面 |
嵌套路由
folder | 路由段 |
folder/folder | 嵌套路由段 |
动态路由
[folder] | 动态路由段 |
[...folder] | 全捕获路由段 |
[[...folder]] | 可选全捕获路由段 |
路由组与私有文件夹
并行路由与拦截路由
@folder | 命名插槽 |
(.)folder | 拦截同级路由 |
(..)folder | 拦截上一级路由 |
(..)(..)folder | 拦截上两级路由 |
(...)folder | 从根路由拦截 |
元数据文件约定
应用图标
favicon | .ico | 网站图标文件 |
icon | .ico .jpg .jpeg .png .svg | 应用图标文件 |
icon | .js .ts .tsx | 通过代码生成的应用图标 |
apple-icon | .jpg .jpeg , .png | Apple 应用图标文件 |
apple-icon | .js .ts .tsx | 通过代码生成的 Apple 图标 |
Open Graph 与 Twitter 图片
opengraph-image | .jpg .jpeg .png .gif | Open Graph 图片文件 |
opengraph-image | .js .ts .tsx | 通过代码生成的 Open Graph 图片 |
twitter-image | .jpg .jpeg .png .gif | Twitter 图片文件 |
twitter-image | .js .ts .tsx | 通过代码生成的 Twitter 图片 |
SEO 优化
组织项目结构
Next.js 对项目文件组织方式不做强制要求,但提供了多种功能来帮助您管理项目。
组件层级
特殊文件中定义的组件会按照特定层级渲染:
layout.js
template.js
error.js
(React 错误边界)loading.js
(React Suspense 边界)not-found.js
(React 错误边界)page.js
或嵌套的layout.js

在嵌套路由中,组件会递归渲染,这意味着子路由段的组件会嵌套在其父路由段组件内部。

文件同置 (Colocation)
在 app
目录中,嵌套文件夹定义了路由结构。每个文件夹代表一个路由片段,对应 URL 路径中的相应片段。
但需要注意的是,尽管路由结构通过文件夹定义,只有当路由片段中添加了 page.js
或 route.js
文件时,该路由才会对外可访问。

即使路由对外可访问后,也仅有 page.js
或 route.js
返回的内容会被发送到客户端。

这意味着项目文件可以安全地同置在 app
目录的路由片段中,而不会意外成为可访问路由。

须知:虽然你可以将项目文件同置在
app
目录中,但并非必须这样做。如果愿意,你也可以将它们保留在app
目录外。
私有文件夹 (Private folders)
通过给文件夹添加下划线前缀可以创建私有文件夹:_folderName
这表示该文件夹是私有实现细节,路由系统不应考虑它,从而将该文件夹及其所有子文件夹排除在路由之外。

由于 app
目录中的文件默认可以安全同置,私有文件夹并非同置所必需。但它们可用于:
- 将 UI 逻辑与路由逻辑分离。
- 在项目和 Next.js 生态系统中一致组织内部文件。
- 在代码编辑器中排序和分组文件。
- 避免与未来 Next.js 文件约定的潜在命名冲突。
须知:
- 虽然不是框架约定,你也可以考虑使用相同的下划线模式标记私有文件夹外的文件为“私有”。
- 可以通过给文件夹名添加
%5F
(下划线的 URL 编码形式)来创建以下划线开头的 URL 片段:%5FfolderName
。- 如果不使用私有文件夹,了解 Next.js 的特殊文件约定有助于避免意外的命名冲突。
路由组 (Route groups)
通过将文件夹包裹在括号中可以创建路由组:(folderName)
这表示该文件夹仅用于组织目的,不应包含在路由的 URL 路径中。

路由组适用于:
- 按网站部分、意图或团队组织路由。例如营销页面、管理页面等。
- 在同一路由片段级别启用嵌套布局:
src
文件夹
Next.js 支持将应用代码(包括 app
)存储在可选的 src
文件夹中。这可以将应用代码与主要位于项目根目录的配置文件分开。

示例
以下部分列出了常见策略的概要。最简单的建议是选择适合你和团队的策略,并在项目中保持一致。
须知:在下面的示例中,我们使用
components
和lib
文件夹作为通用占位符,它们的命名没有特殊的框架意义,你的项目可能会使用其他文件夹如ui
、utils
、hooks
、styles
等。
将项目文件存储在 app
外
此策略将所有应用代码存储在项目根目录的共享文件夹中,并保持 app
目录纯粹用于路由目的。

将项目文件存储在 app
内的顶层文件夹中
此策略将所有应用代码存储在 app
目录根目录的共享文件夹中。

按功能或路由拆分项目文件
此策略将全局共享的应用代码存储在 app
根目录中,并将更具体的应用代码拆分到使用它们的路由片段中。

组织路由而不影响 URL 路径
要组织路由而不影响 URL,可以创建一个组来将相关路由保持在一起。括号中的文件夹将从 URL 中省略(例如 (marketing)
或 (shop)
)。

尽管 (marketing)
和 (shop)
中的路由共享相同的 URL 层次结构,但你可以通过在其文件夹中添加 layout.js
文件为每个组创建不同的布局。

将特定片段加入布局
要将特定路由加入布局,可以创建一个新的路由组(例如 (shop)
),并将共享相同布局的路由移动到该组中(例如 account
和 cart
)。组外的路由不会共享该布局(例如 checkout
)。

为特定路由选择加载骨架
要通过 loading.js
文件将加载骨架应用到特定路由,可以创建一个新的路由组(例如 /(overview)
),然后将 loading.tsx
移动到该路由组中。

现在,loading.tsx
文件将仅应用于你的 dashboard → overview 页面,而不是所有 dashboard 页面,且不影响 URL 路径结构。
创建多个根布局
要创建多个根布局,可以移除顶层的 layout.js
文件,并在每个路由组中添加一个 layout.js
文件。这对于将应用划分为具有完全不同 UI 或体验的部分非常有用。每个根布局都需要添加 <html>
和 <body>
标签。

在上面的示例中,(marketing)
和 (shop)
都有自己的根布局。