NextJS 项目中文件夹结构需要遵循的约束

在 Next.js 项目中,文件夹结构和代码组织遵循一定的约定和最佳实践。以下是常见的规范及代码存放位置的总结:


1. 动态路由

  • App Router (推荐)

    使用 app 目录,动态路由通过文件夹名 [param] 实现:

    bash 复制代码
    app/
      ├─ blog/
      │   └─ [slug]/
      │       └─ page.tsx  # 动态路由页面(如 /blog/hello-world)

    通过 params 对象获取参数:

    tsx 复制代码
    export default function Page({ params }: { params: { slug: string } }) {
      return <div>{params.slug}</div>;
    }
  • Pages Router (旧版)

    使用 pages 目录,文件名格式为 [param].tsx

    bash 复制代码
    pages/
      └─ blog/
          └─ [slug].tsx  # 动态路由页面

2. 服务端执行的代码

  • 服务端组件 (App Router)
    默认情况下,app 目录下的组件是 服务端组件 (除非标记 'use client')。可以直连数据库或调用私有 API。

  • API 路由
    存放在 app/api/pages/api/ 下的文件会作为无服务器函数运行(Node.js 环境):

    bash 复制代码
    app/
      └─ api/
          └─ users/
              └─ route.ts  # 对应 /api/users
  • 数据获取方法 (Pages Router)
    getStaticPropsgetServerSidePropsgetStaticPaths 在构建时或请求时由 Node.js 执行。


3. 页面代码

  • App Router
    页面文件必须命名为 page.tsx,并放置在对应路由的目录中:

    bash 复制代码
    app/
      ├─ about/page.tsx    # /about
      └─ dashboard/page.tsx  # /dashboard
  • Pages Router
    页面直接放在 pages 目录下,文件名即路由:

    bash 复制代码
    pages/
      ├─ about.tsx        # /about
      └─ index.tsx        # /

4. 组件存放位置

  • 全局可复用组件
    存放在项目根目录的 components 文件夹中,按功能或模块划分子目录:

    bash 复制代码
    components/
      ├─ ui/             # 基础 UI 组件(按钮、卡片等)
      ├─ layout/         # 布局组件
      └─ features/
          └─ auth/       # 认证相关组件
  • 页面专属组件
    可放在页面同级目录的 components 子文件夹中:

    bash 复制代码
    app/
      └─ dashboard/
          ├─ components/
          │   └─ Chart.tsx
          └─ page.tsx

5. 类型定义 (TypeScript)

  • 全局类型
    放在 types@types 目录中,通过 tsconfig.json 配置路径:

    bash 复制代码
    types/
      ├─ user.d.ts       # 用户相关类型
      └─ api.d.ts        # API 响应类型
  • 局部类型
    直接在组件文件中定义,或就近放在模块目录的 types.ts 中:

    bash 复制代码
    app/
      └─ dashboard/
          ├─ types.ts
          └─ page.tsx

6. 网络请求函数

  • API 客户端
    统一放在 libutils 目录中:

    bash 复制代码
    lib/
      └─ api/
          ├─ client.ts   # 初始化 Axios 实例
          └─ user.ts     # 用户相关 API 函数
  • 服务端请求 (App Router)
    直接在服务端组件中使用 fetch(Next.js 扩展了 fetch 的缓存和重验证功能):

    tsx 复制代码
    async function getData() {
      const res = await fetch('https://api.example.com/data');
      return res.json();
    }
  • 客户端请求
    通过 useEffectSWR/TanStack Query 发起请求,或调用 API 路由代理。


7. 其他关键目录

目录/文件 用途
public/ 静态资源(图片、字体、robots.txt)
styles/ 全局 CSS 或 CSS 模块
middleware.ts 中间件(身份验证、重定向等)
.env.local 环境变量(服务端和客户端)
tests/__tests__/ 单元测试/集成测试

总结示例

bash 复制代码
my-next-app/
├─ app/
│   ├─ [slug]/page.tsx          # 动态路由页面
│   ├─ api/                     # API 路由(服务端)
│   │   └─ users/route.ts
│   └─ dashboard/page.tsx       # 页面代码
├─ components/
│   ├─ ui/Button.tsx           # 可复用组件
│   └─ features/auth/LoginForm.tsx
├─ lib/
│   └─ api.ts                  # 网络请求函数
├─ types/
│   └─ user.d.ts               # 全局类型
├─ public/                     # 静态资源
└─ package.json

注意 :如果使用 App Router,服务端组件默认不支持客户端交互(如 useState),需要交互的组件需在顶部添加 'use client' 指令。

相关推荐
|晴 天|19 小时前
Vue 3 + TypeScript + Element Plus 博客系统开发总结与思考
前端·vue.js·typescript
蒸汽求职19 小时前
跨越 CRUD 内卷:半导体产业链与算力基建下的软件工程新生态
人工智能·科技·面试·职场和发展·软件工程·制造
小兵张健19 小时前
一场大概率没拿到 offer 的面试,让我更坚定去做喜欢的事
人工智能·面试·程序员
猫32819 小时前
v-cloak
前端·javascript·vue.js
AC赳赳老秦19 小时前
OpenClaw二次开发实战:编写专属办公自动化技能,适配个性化需求
linux·javascript·人工智能·python·django·测试用例·openclaw
旷世奇才李先生19 小时前
Vue 3\+Vite\+Pinia实战:企业级前端项目架构设计
前端·javascript·vue.js
Ulyanov20 小时前
《PySide6 GUI开发指南:QML核心与实践》 第二篇:QML语法精要——构建声明式UI的基础
java·开发语言·javascript·python·ui·gui·雷达电子对抗系统仿真
聚美智数21 小时前
企业实际控制人查询-公司实控人查询
android·java·javascript
SoaringHeart21 小时前
Flutter进阶:用OverlayEntry 实现所有弹窗效果
前端·flutter
AI人工智能+电脑小能手21 小时前
【大白话说Java面试题】【Java基础篇】第7题:HashMap的get流程是什么
java·后端·面试·哈希算法·散列表·hash-index·hash