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个子目录,common和feature,分这2个子目录解决了一些我的困扰,例如我有时候会不清楚一些业务组件到底应不应该放在components里面,但是有这2个子目录我就可以把常规的通用组件放common里,业务组件放feature里
lib: lib目录主要存放一些通用逻辑和工具类,子目录包含api、utils等,可能一般项目不会有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 封装了可复用的状态逻辑或副作用逻辑。它的主要作用是:
hooks/ 目录通常存放以 use 开头的 TypeScript/JavaScript 文件,例如 useAuth.ts、useFetchData.ts 等,每个文件定义一个或多个相关的 Hooks。
为什么要用 hooks/ 目录?