可扩展的 React 项目文件夹结构

简介: 强烈推荐!

<!DOCTYPE html>

在构建小型应用时,几乎任何结构都能跑得起来。但一旦项目开始增长——组件变多、业务逻辑复杂、接入 API、引入 state ——如果文件夹结构一开始没想清楚,很快就会陷入混乱。

在这篇文章中,我会分享一个我在 2025 年个人常用、并且非常认可的现代化、可扩展 React 文件夹结构。无论你是在做个人项目,还是打算扩展一个企业级应用,这套结构都能帮助你保持组织清晰、一致,并且心态稳定。


为什么文件夹结构这么重要

在开始之前,先问一句——为什么要在意这些?

因为一个干净的结构可以:

  • 让新成员(或者未来的你)更容易上手:明确职责边界(UI、逻辑、数据获取)。
  • 明确职责边界(UI、逻辑、数据获取):减少 bug 和重复代码。
  • 减少 bug 和重复代码:鼓励可扩展性和模块化。

结构设计(清晰、可扩展、对开发者友好)

以清晰度为核心构建

.
├── eslint.config.js
├── index.html
├── package.json
├── public
│ └── vite.svg
├── README.md
├── src
│ ├── App.css
│ ├── App.tsx
│ ├── assets # 图片,字体,图标等等
│ │ └── react.svg
│ ├── components # 可重复使用的纯 UI 组件
│ │ └── Button
│ │ ├── Button.module.css
│ │ ├── Button.test.ts
│ │ └── index.tsx
│ ├── features # 业务逻辑和特定功能相关
│ │ └── auth
│ │ ├── AuthPage.tsx
│ │ ├── components
│ │ ├── hooks
│ │ └── services
│ ├── hooks # 自定义 hooks
│ ├── layouts # 可重复调用的Layout封装(DashBoradLayout、AuthLayout)
│ ├── pages # 与路由结构保持一致(映射到routes)
│ ├── routes # 路由的集中配置(React Router)
│ ├── services # API调用
│ ├── store # 全局状态
│ ├── types # 类型定义
│ ├── utils # 工具函数、常量、帮助文件等
│ ├── config # 环境配置、主题、应用设置等等
│ ├── index.css
│ └── main.tsx
├── tsconfig.app.json
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts

1. Components vs. Features

  • 使用 /components 存放 纯 UI 组件——无状态、可复用、跨应用使用(例如:Button、Input、Modal)。
  • 使用 /features 存放 业务逻辑和特定功能相关的文件。每个领域(如 auth 、 chat 、 profile )都有自己的文件夹,内部通常包含:
    • components/
    • services/
    • hooks/
    • pages/ 甚至可以有自己的 state( store/ )

这种方式可以让逻辑就近收敛,避免文件膨胀或混乱的全局 state。


2. Pages = Routes

让 /pages 文件夹与路由结构保持一致。

每一个 page 对应一个 route,内部可以自由引入 feature 模块或 layout。


3. 集中的 Services 层

API 调用不应该写在组件里。

使用 /services 文件夹来统一定义所有后端请求。例如:

export const login = (credentials) => axios.post('/login', credentials)

让 UI 专注于 UI。它应该在 /services/auth.js 。

这样当后端接口发生变化时,你只需要修改一个地方。


4. 全局 Store?只在真正需要时才用

不要从第一天就上全局 state。

优先把 state 保持在 feature 内部。只有当 state确实需要在距离很远的组件之间共享时,才考虑 Redux、Zustand 或 Context API。


5. Hooks:无痛复用逻辑

自定义 hooks 是救命稻草。

无论是 useAuth 、 useDebounce 还是 useForm ,把它们放在统一的 /hooks 文件夹里,可以在不复制代码的情况下复用逻辑。

它们尤其适合处理:

  • API fetching、表单处理
  • 表单处理、动画或副作用
  • 动画或副作用、LocalStorage / session 相关逻辑

没有一种文件夹结构可以适用于所有场景。但我在这里分享的这套布局,已经在个人项目、团队项目以及 hackathon 中被反复验证,具备良好的扩展性。

保持模块化。
保持干净。
保持清晰。


RECOMMEND


推荐阅读
相关文章
|
3天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1306 3
|
3天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
622 3
|
4天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
|
10天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
741 5
|
7天前
|
物联网 API UED
Qwen-Image-Edit-2511来啦!角色一致性再提升,LoRA能力内置
Qwen-Image-Edit-2511发布!提升角色与多人合照一致性,集成Lora打光、新视角生成,增强工业设计与几何推理能力。已开源,支持魔搭、QwenChat免费体验,本地部署可获最佳效果。
445 3