MelonBlog

next.js项目如何组织代码结构

每次新开一个next.js项目,我都在纠结如何组织代码结构,一直没有一个很满意的方案

今天问了下grok,我觉得我得到了目前为止,我最满意的方案

my-next-app/
├── app/                     # Next.js 13+ App Router 目录
│   ├── (auth)/              # 认证相关页面(如登录、注册)
│   │   ├── login/           # 登录页面
│   │   │   ├── page.tsx     # 页面组件
│   │   │   ├── layout.tsx   # 登录页面布局
│   │   ├── register/        # 注册页面
│   ├── (dashboard)/         # 仪表盘相关页面
│   │   ├── page.tsx         # 仪表盘主页
│   │   ├── settings/        # 设置页面
│   ├── layout.tsx           # 根布局
│   ├── page.tsx             # 首页
│   ├── globals.css          # 全局样式
├── components/              # 可复用的 UI 组件
│   ├── common/              # 通用组件(如按钮、输入框)
│   │   ├── Button.tsx
│   │   ├── Input.tsx
│   ├── feature/             # 特定功能组件
│   │   ├── UserCard.tsx
│   │   ├── Chart.tsx
├── lib/                     # 工具函数、API 调用、配置等
│   ├── api/                 # API 调用逻辑
│   │   ├── auth.ts
│   │   ├── user.ts
│   ├── utils/               # 通用工具函数
│   │   ├── formatDate.ts
│   ├── db/                  # 数据库连接/查询
│   │   ├── prisma.ts
├── types/                   # TypeScript 类型定义
│   ├── user.ts
│   ├── api.ts
├── public/                  # 静态资源
│   ├── images/
│   ├── favicon.ico
├── styles/                  # 样式文件(如果不用 globals.css)
│   ├── tailwind.css
│   ├── components/          # 组件特定样式
├── hooks/                   # 自定义 React Hooks
│   ├── useAuth.ts
│   ├── useFetchData.ts
├── middleware.ts            # Next.js 中间件
├── next.config.js           # Next.js 配置文件
├── tsconfig.json            # TypeScript 配置文件
├── package.json
├── README.md

app: 页面目录,页面嵌套的逻辑也承担了路由的功能,尽可能在app里只放page和layout文件

components: 组件目录,组件目录分了2个子目录,commonfeature,分这2个子目录解决了一些我的困扰,例如我有时候会不清楚一些业务组件到底应不应该放在components里面,但是有这2个子目录我就可以把常规的通用组件放common里,业务组件放feature里

lib: lib目录主要存放一些通用逻辑和工具类,子目录包含apiutils等,可能一般项目不会有db目录,之前我都是把api和utils单独作为一级目录,我觉得不够优雅,放lib里明显优雅很多

types: 不用多说,如果是写ts,这是必备的

public: 约定俗成的存放静态资源的目录

styles: 存放样式文件,除了globals.css之外的css文件可以放这里,不过一般用tailwind.css不会写太多css文件

hooks: 这个hooks目录我也没想到的,我一直把hook写在了组件里,时间久了其实组件代码不是很好维护,很杂乱, 但是如果组件如果UI和逻辑处理分离了,代码会变得非常好维护并且优雅


我问了一下grok hook目录到底怎么用,他的回答:

在 Next.js 项目中,hooks/ 目录用于存放自定义 React Hooks,这些 Hooks 封装了可复用的状态逻辑或副作用逻辑。它的主要作用是:

1.逻辑复用:将组件中重复的逻辑提取到 Hooks 中,避免代码冗余。
2.代码组织:将状态管理和副作用逻辑集中管理,保持组件干净、专注渲染。
3.可维护性:Hooks 命名清晰,易于测试和修改,提升代码可读性。

hooks/ 目录通常存放以 use 开头的 TypeScript/JavaScript 文件,例如 useAuth.ts、useFetchData.ts 等,每个文件定义一个或多个相关的 Hooks。

为什么要用 hooks/ 目录?

分离关注点:组件只负责 UI 渲染,Hooks 负责逻辑处理。
跨组件共享:同一个 Hook 可以在多个组件中使用,减少重复代码。
与 Next.js 结合:Next.js 的数据获取(如 useSWR)或路由(如 useRouter)常结合自定义 Hooks 使用。