在 React 开发中,一个清晰合理的项目结构不仅能提高开发效率,还能让代码更易于维护和扩展。尤其是在团队协作中,统一的项目结构规范至关重要。本文将通过图文结合的方式,详细介绍 React 项目的基本框架以及常见文件夹的定义与作用。

一、React 项目基本框架

一个典型的 React 项目结构通常如下(以 create-react-app 创建的项目为基础):

my-react-app/
├── public/                 📁 静态资源目录
├── src/                    📁 源代码目录
│   ├── components/         🧩 公共组件
│   ├── pages/              📄 页面组件
│   ├── hooks/              🔧 自定义Hooks
│   ├── utils/              🛠️ 工具函数
│   ├── assets/             📊 资源文件
│   ├── services/           🌐 API服务
│   ├── context/            🧬 上下文
│   ├── redux/              🗃️ 状态管理
│   ├── routes/             🚦 路由配置
│   ├── config/             ⚙️ 配置文件
│   ├── App.js              🏠 根组件
│   └── index.js            🚀 入口文件
├── package.json            📦 项目配置
└── README.md               📖 项目说明

下图展示了 React 项目各部分的关系:

┌─────────────────────────────────────────────────────────┐
│                    public/                              │
│  (静态资源,不被Webpack处理)                             │
└───────────────────────────┬─────────────────────────────┘│
┌───────────────────────────▼─────────────────────────────┐
│                    src/                                 │
│  ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│  │components/│ │   pages/  │ │   hooks/  │ │  utils/   │ │
│  │  (组件)   │ │  (页面)   │ │(自定义钩子)│ │ (工具函数)│ │
│  └───────────┘ └───────────┘ └───────────┘ └───────────┘ │
│                                                         │
│  ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│  │  assets/  │ │ services/ │ │ context/  │ │   redux/  │ │
│  │  (资源)   │ │  (API)    │ │(上下文)   │ │(状态管理) │ │
│  └───────────┘ └───────────┘ └───────────┘ └───────────┘ │
│                                                         │
│  ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│  │  routes/  │ │  config/  │ │  App.js   │ │ index.js  │ │
│  │  (路由)   │ │ (配置)    │ │ (根组件)  │ │ (入口)    │ │
│  └───────────┘ └───────────┘ └───────────┘ └───────────┘ │
└─────────────────────────────────────────────────────────┘

二、常见文件夹定义与作用

1. public/ 

  • 作用:存放静态资源,这些资源不会被 Webpack 处理
  • 包含内容
    • index.html:应用的入口 HTML 文件
    • favicon.ico:网站图标
    • robots.txt:搜索引擎爬虫规则
    • 其他静态文件(如无需编译的 JS、CSS)

示意图

public/
├── index.html       🌐 应用入口页面
├── favicon.ico      🔍 网站图标
├── robots.txt       🤖 爬虫规则
└── manifest.json    📱 PWA配置文件

2. src/ 

  • 作用:存放所有源代码,是开发的主要工作目录
  • 所有 JavaScript、CSS、图片等资源都建议放在此目录下,会被 Webpack 处理

3. components/ 

  • 作用:存放可复用的公共组件
  • 特点
    • 不依赖路由,可在多个页面中复用
    • 通常是 UI 组件,如按钮、表单、卡片等
    • 可以按功能进一步细分,如components/buttons/components/forms/

组件关系示意图

页面组件 (pages/)↓     ↓     ↓组件A 组件B 组件C (components/)↘     ↓     ↙基础组件 (如Button)
// 示例:components/Button/Button.jsx
import React from 'react';
import './Button.css';const Button = ({ text, onClick, type = 'primary' }) => {return (<button className={`custom-button custom-button-${type}`} onClick={onClick}>{text}</button>);
};export default Button;

4. pages/ 

  • 作用:存放页面级组件,对应路由配置的页面
  • 特点
    • 通常与路由一一对应
    • 可以包含多个 components 中的组件
    • 可能会包含页面级别的业务逻辑

页面结构示意图

pages/
├── Home/           🏠 首页
├── About/          👋 关于页
├── Products/       🛒 产品页
│   ├── index.jsx   📄 产品列表页
│   └── Detail.jsx  🔍 产品详情页
└── User/           👤 用户相关页面├── Login.jsx   🔑 登录页└── Profile.jsx 🧑‍💼 个人资料页

5. hooks/ 

  • 作用:存放自定义 React Hook
  • 特点
    • 封装可复用的状态逻辑
    • 文件名通常以use开头(如 useAuth.js、useFetch.js)
    • 使函数组件能够使用状态和其他 React 特性
// 示例:hooks/useFetch.js
import { useState, useEffect } from 'react';const useFetch = (url) => {const [data, setData] = useState(null);const [loading, setLoading] = useState(true);const [error, setError] = useState(null);useEffect(() => {// 清除函数,用于组件卸载时const abortController = new AbortController();fetch(url, { signal: abortController.signal }).then(res => res.json()).then(data => {setData(data);setLoading(false);}).catch(err => {if (err.name !== 'AbortError') {setError(err);setLoading(false);}});return () => abortController.abort();}, [url]);return { data, loading, error };
};export default useFetch;

6. utils/ 

  • 作用:存放工具函数和辅助方法
  • 包含内容
    • 日期格式化函数
    • 数据验证函数
    • 本地存储工具
    • 通用计算函数等

工具函数分类

utils/
├── formatters/    📅 格式化工具(日期、货币等)
├── validators/    ✅ 验证工具(表单验证等)
├── storage.js     💾 本地存储工具
└── helpers.js     🛠️ 通用辅助函数

7. assets/ 

  • 作用:存放静态资源文件
  • 包含内容
    • 图片(jpg、png、svg 等)
    • 字体文件
    • 全局样式文件
    • 图标文件等

资源文件组织

assets/
├── images/        🖼️ 图片资源
├── fonts/         🔤 字体文件
├── styles/        🎨 样式文件
│   ├── global.css 🖌️ 全局样式
│   └── variables.css 🎨 样式变量
└── icons/         🏷️ 图标资源

8. services/ 

  • 作用:存放 API 请求相关代码
  • 特点
    • 封装与后端的交互逻辑
    • 集中管理接口地址
    • 便于统一处理请求 / 响应拦截器

API 服务流程图

组件 (components/pages)↓
调用API方法 (services)↓
使用axios/fetch发送请求↓
后端服务器↓
返回响应数据↓
处理并返回给组件

// 示例:services/userService.js
import axios from 'axios';
import { API_BASE_URL } from '../config';// 创建axios实例
const api = axios.create({baseURL: API_BASE_URL,timeout: 5000,headers: {'Content-Type': 'application/json'}
});// 请求拦截器
api.interceptors.request.use(config => {// 可以在这里添加token等const token = localStorage.getItem('token');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;},error => Promise.reject(error)
);// 获取用户信息
const getUserInfo = async (userId) => {try {const response = await api.get(`/users/${userId}`);return response.data;} catch (error) {console.error('获取用户信息失败:', error);throw error;}
};export default { getUserInfo };

9. context/ 

  • 作用:存放 React Context 相关文件
  • 作用:解决组件层级较深时的状态传递问题,避免 props drilling

Context 工作流程

创建Context↓
Provider提供数据↓
中间组件(无需传递props)↓
Consumer使用数据

10. redux/ 或 store/ 

  • 作用:存放状态管理相关代码(使用 Redux、Redux Toolkit 等)
  • 通常包含
    • actions:动作创建器
    • reducers:状态 reducer
    • store.js:Redux store 配置
    • slices:使用 Redux Toolkit 时的切片

Redux 数据流

UI组件 → 触发Action → Reducer处理 → 更新Store → UI重新渲染

11. routes/ 

  • 作用:存放路由配置相关代码
  • 特点
    • 集中管理应用的路由规则
    • 通常与 pages 文件夹中的组件对应

路由配置示例

// routes/index.jsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from '../pages/Home';
import About from '../pages/About';
import ProductList from '../pages/Products';
import ProductDetail from '../pages/Products/Detail';
import NotFound from '../pages/NotFound';
import Layout from '../components/Layout';const AppRoutes = () => {return (<BrowserRouter><Layout><Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /><Route path="/products" element={<ProductList />} /><Route path="/products/:id" element={<ProductDetail />} /><Route path="*" element={<NotFound />} /></Routes></Layout></BrowserRouter>);
};export default AppRoutes;

12. config/ 

  • 作用:存放配置文件
  • 包含内容
    • 环境变量配置
    • 全局常量
    • API 基础地址
    • 主题配置等

三、项目结构设计原则

  1. 单一职责:每个文件和文件夹应专注于单一功能
  2. 可复用性:提取公共逻辑到 hooks、utils 和 components
  3. 可扩展性:预留未来功能扩展的空间
  4. 一致性:保持命名和结构的一致性
  5. 按需调整:根据项目规模和团队情况灵活调整结构

四、不同规模项目的结构调整

  • 小型项目:可以简化结构,合并一些文件夹
  • 中型项目:使用上述标准结构
  • 大型项目:可能需要更细致的划分,如按业务模块组织代码
// 大型项目可能的结构(按业务模块)
src/
├── features/           🌟 业务功能模块
│   ├── auth/           🔑 认证相关
│   ├── products/       🛒 产品相关
│   └── user/           👤 用户相关
├── shared/             🤝 共享资源
│   ├── components/     🧩 公共组件
│   ├── hooks/          🔧 公共钩子
│   └── utils/          🛠️ 工具函数
└── app/                🏠 应用核心├── routes/         🚦 路由├── store/          🗃️ 状态管理└── App.js          根组件

五、总结

合理的项目结构是 React 应用开发的基础,它能显著提高代码的可维护性和团队协作效率。上述结构是大多数 React 项目的通用方案,实际开发中可以根据项目规模、团队习惯和业务需求进行适当调整。记住,没有放之四海而皆准的完美结构,最重要的是保持团队内部的一致性和代码的清晰可读。随着项目的发展,也可以逐步优化和重构项目结构,使其更好地服务于业务开发。希望本文的图文介绍能帮助你更好地理解和组织 React 项目结构!

本文是「前端基础知识系列」的第六篇,聚焦React 项目基本框架。后续将持续更新前端开发必备基础知识。关注作者,每天掌握一个前端基础知识,逐步构建完整的技术体系~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93790.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93790.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93790.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0815 UDP通信协议TCP并发服务器

Part 1.思维导图一.UDP通信协议1.原理服务器端&#xff1a;1.用socket函数创建一个套接字文件2.创建服务器端地址结构体并赋值3.用ford函数将套接字文件与地址结构体绑定4.创建接收客户端地址结构体5.利用sendto和recvfrom函数传输和接收信息客户端&#xff1a;1.用socket函数创…

一个基于纯前端技术实现的五子棋游戏,无需后端服务,直接在浏览器中运行。

一 功能特性1.1 核心游戏功能- **标准五子棋规则**&#xff1a;1515棋盘&#xff0c;黑子(玩家)先手 - **AI对战模式**&#xff1a;白子AI具有中等难度&#xff0c;会进行智能进攻和防守 - **胜负判定**&#xff1a;支持横向、纵向、斜向五子连线获胜 - **平局检测**&#xff1…

HBuilderX升级,Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass

目录 一、问题描述 二、问题原因 三、问题解析及解决方案 一、问题描述 最近开发新项目&#xff0c;升级了HBuilderX版本到4.75&#xff0c;最近要在之前的项目添加功能的时候发现报错&#xff0c;错误如下&#xff1a;Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sa…

像素风球球大作战 HTML 游戏

像素风球球大作战 HTML 游戏 下面是一个简单的像素风格球球大作战 HTML 游戏代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

文件导出时无法获取响应头Content-Disposition的文件名

1. 为什么Content-Disposition无法获取&#xff1f; 要拿到 Content-Disposition 里的 filename&#xff0c;可以用正则或者简单的字符串解析。 浏览器默认不让前端访问非标准响应头&#xff0c;Content-Disposition 需要后端显式暴露。 在浏览器开发者工具 → Network → Re…

Leetcode 128. 最长连续序列 哈希

原题链接&#xff1a; Leetcode 128. 最长连续序列 解法1: map&#xff0c;不符合要求 class Solution { public:int longestConsecutive(vector<int>& nums) {if (nums.size()0) return 0;map<int,int> mp;for(auto x: nums){mp[x];}int pre;int l0,r0,res0;…

禾赛激光雷达AT128P/海康相机(2):基于欧几里德聚类的激光雷达障碍物检测

目录 一、参考连接 二、实验效果​编辑 三、安装相应的 ros 依赖包 四、代码驱动 4.1 代码下载 4.2 代码文件放置(请按照这个命名放置代码) 4.3 代码编译 4.4 报错 一、参考连接

Vue Router的常用API有哪些?

文章目录一、路由配置相关二、路由实例方法&#xff08;router 实例&#xff09;三、组件内路由 API&#xff08;useRouter / useRoute&#xff09;四、导航守卫&#xff08;路由拦截&#xff09;五、路由视图与导航组件六、其他常用 API七、history模式和hash模式有什么区别&a…

从现场到云端的“通用语”:Kepware 在工业互联中的角色、使用方法与本土厂商(以胡工科技为例)的差异与优势

从现场到云端的“通用语”&#xff1a;Kepware 在工业互联中的角色、使用方法与本土厂商&#xff08;以胡工科技为例&#xff09;的差异与优势 文章目录从现场到云端的“通用语”&#xff1a;Kepware 在工业互联中的角色、使用方法与本土厂商&#xff08;以胡工科技为例&#x…

深入理解Prompt构建与工程技巧:API高效实践指南

深入理解Prompt构建与工程技巧&#xff1a;API高效实践指南 引言 Prompt&#xff08;提示&#xff09;工程是推动大模型能力极限的关键手段。合理的Prompt不仅能显著提升模型输出的相关性与准确性&#xff0c;在实际落地的API接口开发中同样起到举足轻重的作用。本文将系统介…

C++之多态(从0到1的突破)

世间百态&#xff0c;每个人都扮演着不同的角色&#xff0c;都进行着不同的行为。C更是如此&#xff0c;C中也会出现有着不同行为的多种形态的出现&#xff0c;那就让我们一起进入C的多态世界吧&#xff01;&#xff01;&#xff01; 一. 多态的概念 多态&#xff0c;顾名思义&…

路由器NAT的类型测定

目前所使用的NAT基本都是NAPT&#xff0c;即多端口的NAT技术&#xff0c;因此本文主要是设计了两种测定路由器NAPT类型的实验。 实验环境 设备 主机A&#xff1a;Windows主机B&#xff1a;Windows路由器 软件 ncWiresharkSocketTools 在局域网内部完成所有测试&#xff0c;完全…

ROS 2系统Callback Group概念笔记

核心概念 Callback Group&#xff08;回调组&#xff09;是一个管理一个或多个回调函数执行规则的容器。它决定了这些回调函数是如何被节点&#xff08;Node&#xff09;的 executor 调度的&#xff0c;特别是当多个回调函数同时就绪时&#xff0c;它们之间是并行执行还是必须串…

Qt——主窗口 mainWindow

主窗口 mainWindow 前面学习的所有代码&#xff0c;都是基于QWidget控件&#xff0c;其更多的是作为别的窗口的部分 现在来学习QMainWindow&#xff0c;即主窗口&#xff0c;其包含以下属性 Window Title&#xff1a;标题栏Menu Bar&#xff1a;菜单栏Tool Bar Area&#xff1a…

无训练神经网络影响下的智能制造

摘要 未训练神经网络&#xff08;Untrained Neural Networks, UNNs&#xff09;作为近年来人工智能领域的新兴范式&#xff0c;正在逐步改变智能制造的发展路径。不同于传统深度学习依赖大规模标注数据与高性能计算资源的模式&#xff0c;UNNs 借助网络结构自身的归纳偏置与初…

微服务自动注册到ShenYu网关配置详解

一、配置逐行详解 shenyu:register:registerType: http # 注册中心类型:使用 HTTP 协议进行注册serverLists: ${shenyu-register-serverLists} # ShenYu Admin 的地址列表props:username: ${shenyu-register-props-username} # 注册认证用户名password: ${shenyu-regi…

时序数据库IoTDB的列式存储引擎

在大数据时代&#xff0c;工业物联网&#xff08;IIoT&#xff09;场景正以前所未有的速度生成着海量的时间序列数据。这些数据通常由成千上万的传感器&#xff08;如温度、压力、转速传感器&#xff09;持续不断采集产生&#xff0c;它们具备鲜明的特点&#xff1a;数据时间属…

JavaScript手录18-ajax:异步请求与项目上线部署

前言&#xff1a;软件开发流程 AJAX&#xff1a;前端与后端的数据交互 前后端协作基础 Web应用的核心是“数据交互”&#xff0c;前端负责展示与交互&#xff0c;后端负责处理逻辑与数据存储&#xff0c;二者通过网络请求协作。 &#xff08;1&#xff09;项目开发流程与岗…

HTB 赛季7靶场 - Enviroment

最近所幸得点小闲&#xff0c;补个档嘞&#xff01;~nmap扫描 nmap -F -A 10.10.11.67dirsearch扫描发现login接口 http://environment.htb/login构造如下payload&#xff0c;让程序报错&#xff0c;其原理在于缺失了rember后会导致报错&#xff0c;从而告诉我们一个新的参数ke…

源码编译部署 LAMP 架构详细步骤说明

源码编译部署 LAMP 架构详细步骤说明 一、环境准备 1. 关闭防火墙和SELinux [roothrz ~]# systemctl stop firewalld [roothrz ~]# systemctl disable firewalld [roothrz ~]# setenforce 02. 配置YUM网络源 [roothrz ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://m…