每个开发人员都应该使用的可扩展和可维护的 React 项目结构

news2024/12/27 16:55:41

一个好的项目结构可以在理解代码库、灵活性和维护方面对项目的成功产生巨大影响。结构和维护不当的项目很快就会变成一团糟和可怕的遗产,没有人愿意与之共事。

我现在将向您展示我在项目中经常使用的结构,并解释其背后的原因。这种结构应该是大规模应用程序的良好起点,您可以根据项目的需要对其进行扩展。这是我可以为大多数项目推荐的 src 结构:

让我们从上到下覆盖文件夹。

测试

首先,我们有tests文件夹,其中将包含 React 应用程序的所有测试文件。我在我的大部分 CRA 应用程序中使用 Jest。我看到 CRA 在编写测试时选择使用filename.test.js格式。但这种做法对眼睛和大脑来说有点累赘。您可以在名为tests的文件夹中编写测试,jest 将自动运行该文件夹中的测试。

应用程序接口

api文件夹包含我们应用程序的 API 层。它将具有负责执行 API 请求和与服务器通信的方法。

资产

资产文件夹包含字体图像视频。在字体中,您可以保留任何自定义字体和字体。In images 存储整个应用程序中使用的任何图片。

组件

components目录包含两个目录:commonspecific公共目录将包含在整个应用程序中常用的任何可重用组件。比如按钮表单组件、排版相关的组件等等。任何不常见的组件都将放置在特定组件内。

挂钩

hooks目录,顾名思义,将包含任何自定义和可重用的挂钩。请注意,任何并非真正可重用但与特定功能耦合的挂钩都应放在与该功能相同的目录中。例如,假设我们有一个时事通讯表单组件,其中包含一个用于为用户注册时事通讯的表单。该组件可以使用一个名为useNewsletterSignup的挂钩来处理用户注册。像这样的挂钩不应放在全局src/hooks目录中,而应放在本地,因为它与NewsletterForm组件耦合。它可能是这样的:

语境

上下文目录应该包含任何全局级别的上下文状态提供程序。

布局

Layout目录,顾名思义,应该包含为您的页面提供不同布局的组件。例如,如果您正在构建一个仪表板应用程序,您可以根据用户是否登录来呈现不同的布局。

配置

config目录中,您可以为您的应用程序和第三方服务放置任何运行时配置文件。例如,如果您使用FirebaseOIDC等服务进行身份验证,则需要添加配置文件并在您的应用中使用它们。请确保不要将配置与环境变量混淆,因为这里的任何内容都将出现在构建包中。

常量

您可以在此处放置在整个应用程序中使用的任何常量变量。将常量大写以将它们与应用程序中的其他变量和本地化常量区分开来是一种很好的做法。

下面是一些定义和使用常量的例子:

  • 单独定义常量

// in constants/appConstants.ts
export const APP_NAME = 'Super app'
export const WIDGETS_LABEL = 'Widgets'
// Somewhere in your app 
import { APP_NAME, WIDGETS_LABEL } from '@/constants/appConstants' 
console.log(APP_NAME)
// You can also grab all named exports from the file 
import * as APP_CONSTANTS from '@/constants/appConstants' 
console.log(APP_CONSTANTS.WIDGETS_LABEL) 
  • 在一个对象中定义相关常量

// in constants/appConstants.ts 
// Create an object with constant values 
export const apiStatus = { 
IDLE: 'IDLE', 
PENDING: 'PENDING', 
SUCCESS: 'SUCCESS', 
ERROR: 'ERROR' 
} 
// Somewhere in your app
 import { apiStatus } from '@/constants/appConstants' 
console.log(apiStatus.PENDING) 

帮手

任何实用程序和小型可重用函数都应该放在这里——例如,格式化日期、时间等的函数。

国际化

该目录是可选的。如果应用程序需要内部化支持,请添加它。Intl,也称为 i18n,是关于以适合用户区域设置的格式显示应用程序的内容。此内容可以包括但不限于翻译后的文本或特定格式的日期、时间和货币。例如,英国使用 DD/MM/YYYY 格式,而美国使用 MM/DD/YYYY。

服务

在较大的应用程序中,我们可能会在几个不同的地方使用复杂的业务逻辑代码。像这样的代码是从组件中提取并放置在其他地方的一个很好的候选者,服务文件夹是一个很好的候选者。

店铺

store文件夹负责全局状态管理相关的文件。有许多状态管理解决方案可用于 React 项目,例如ReduxZustandJotai等等。

样式

您可以将全局样式、变量、主题样式和覆盖放在样式文件夹中。

类型

您可以在此处放置任何全局和可共享类型。通过这种方法,您可以节省时间并更轻松地共享您和您的团队所需的 TypeScript 代码和类型。

观点

通常,views 目录只包含路由/页面组件。例如,如果我们有一个应该允许用户查看产品的页面,我们将在 views 文件夹中有一个组件Products.tsx,相应的路由可能是这样的:

<Route path=”/projects” element={<Products />} />

不过,我说“通常”是有原因的。许多应用程序在视图中都有路由组件,其余组件放在组件文件夹中。这种方法适用于中小型应用程序,但当页面和组件的数量增加时,管理和维护就会困难得多。

概括

选择正确的文件夹结构并非易事。您需要就适合应用程序的结构与团队达成一致,哪些可能适合一种需要,哪些可能不适合另一种需要。希望在未来几年内有效。为了确保一个良好的、可维护的结构,你会做些什么不同的事情?请在下面的评论中告诉我。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源代码 | FMCW-MIMO雷达仿真MATLAB

本文编辑&#xff1a;调皮哥的小助理 本程序来源&#xff1a;https://github.com/ekurtgl/FMCW-MIMO-Radar-Simulation&#xff0c;作者是阿拉巴马大学博士生艾库特格尔&#xff0c;研究方向主要是雷达信号处理人类活动识别以及雷达数据的机器学习应用&#xff0c;这份比较新的…

STM32MP157驱动开发——4G通信模块驱动

STM32MP157驱动开发——4G通信模块驱动一、简介二、驱动开发1.高新兴 ME3630 驱动开发驱动修改添加 ECM 支持程序配置 Linux 内核ppp拨号功能测试ECM 联网测试ME3630 4G 模块 GNSS 定位测试2.移远EC20 4G驱动开发驱动修改配置 Linux 内核EC20 ppp 拨号上网移远 GobiNET 驱动移植…

go语言学习(一):Mac环境安装及初始化

​ ​为什么要学习go语言? 1、简洁&#xff0c;快速&#xff0c;安全&#xff1b; ​ ​2、并行&#xff0c;有趣&#xff0c;开源​&#xff1b; 3、内存管理&#xff0c;数据安全&#xff0c;编译迅速 首先&#xff0c;去官网&#xff1a;https://golang.google.cn/dl…

面向对象3(多态、多态调用成员函数的特点、多态的优势和弊端及改进、包、final、权限修饰符、代码块、抽象方法和抽象类、接口、内部类)

1、多态 2、多态调用成员函数的特点 示例如下&#xff1a; 理解&#xff1a; 因为是Animal类型的&#xff0c;所以在输出name时会在父类继承下来的变量里面找 &#xff0c;没有就报错。而一般是先找自己再找父类继承下来的。 3、多态的优势和弊端及改进 优势&#xff1a; 弊端…

Arduino——野火GPS模块

GPS模块 文章目录GPS模块前言一、Arduino代码前言 手上还有一个GPS&#xff0c;用arduino做模块很方便&#xff0c;打算和短信模块结合&#xff0c;短信模块上次已经使用完成了&#xff0c;这次学习一下GPS模块 看模块很容易知道&#xff0c;这个模块用的是串口通信&#xff…

基于STM32智能家居控制系统软件设计及实现

1.1 系统流程图 智能家居控制系统的软件设计主要使用Keil uVision5进行STM32主烧录程序的编写&#xff0c;主程序完成的功能主要为接收并判断语音识别模块传过来的信息&#xff0c;然后根据满足条件的不同进行对应的操作。例如&#xff0c;当语音模块传过来的信息为“打开电视…

top详解--查看cpu及内存使用情况

top详解--查看cpu及内存使用情况 参考链接:http://t.zoukankan.com/guoyu1-p-12237660.html 一、top命令 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。 运行 top 命令后,CPU 使用状态会以全屏的方式显示,…

基于Java+SpringBoot+vue+element实现婚纱摄影网系统

基于JavaSpringBootvueelement实现婚纱摄影网系统 &#x1f345; 作者主页 超级帅帅吴 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录基于JavaSpringBootvueelement实现婚纱摄影网系统前言介绍&…

Flask中的后端并发思考(以Mysql:too many connections为例)

之前写过一篇《CentOS 下部署NginxGunicornSupervisor部署Flask项目》&#xff0c;最近对该工程的功能进行了完善&#xff0c;基本的功能单元测试也做了。觉得也是时候进行一下压力测试了&#xff0c;所以利用Jmeter对部署到服务器的项目进行了简单的压力测试。在之前的笔记中写…

10个 Python 高效编程小技巧

初识Python语言&#xff0c;觉得python满足了你上学时候对编程语言的所有要求。python语言的高效编程技巧让那些曾经苦逼学了四年c或者c的人&#xff0c;兴奋的不行不行的&#xff0c;终于解脱了。高级语言&#xff0c;如果做不到这样&#xff0c;还扯啥高级呢&#xff1f; 01…

【密码学】HMAC与HS256算法

哈希算法加盐 传统的哈希算法&#xff1a; digest hash(input)因为相同的输入会产生相同的输出&#xff0c;所以想要加盐&#xff0c;加盐的目的就在于&#xff0c;使输入有所变化&#xff1a; digest hash(salt input)这个salt可以看作是一个额外的“认证码”&#xff0…

ChatGPT 使用 API 进行 Postman 调用测试

当获得 ChatGPT 的 API Key 以后&#xff0c;想使用 Postman 来进行一下调用。调用的方法为 POST。需要设置几个参数。我们希望使用的 EndPoint 是&#xff1a;API EndPoint访问使用的 EndPoint 是&#xff1a;https://api.openai.com/v1/completions授权方法授权的方法使用的是…

FortiGate FGCP HA 配置文档

概述 FortiOS 提供 6 种冗余解决方案&#xff0c;工业标准的 VRRP 和 5 种专有的解决方案&#xff1a; FortiGate Cluster Protocol (FGCP) high availability&#xff0c;FortiGate Session Life Support Protocol (FGSP) high availability&#xff0c;Session-Aware Load …

Spring Cloud LoadBalancer(负载均衡)

简介 了解过Spring Cloud&#xff0c;就知道&#xff0c;之前Spring Cloud中默认的负载均衡组件为ribbon&#xff0c;ribbon是Netflix开源的组件&#xff0c;但是目前已经停止更新了。所以Spring官方推出了Spring Cloud LoadBalancer。而且Spring Cloud LoadBalancer是目前唯一…

win11下通过qemu 安装win10 arm系统

安装qemu QEMU for Windows – Installers (64 bit) 我选了最新的20221230的版本&#xff0c;我将其安装在c:\qemu7\下&#xff0c;另外在环境变量中加入这个路径 然后在别的盘上建立一个路径&#xff0c;名称随意&#xff0c;不要有中文和空格即可&#xff0c;我放在了e:\qe…

电脑蓝屏提示错误代码0X000000B4怎么办?

电脑蓝屏可以说是Windows的一个常见问题了。蓝屏状况数不胜数&#xff0c;关键还得看是何终止代码。 如果电脑蓝屏&#xff0c;提示错误代码0X000000B4是什么意思&#xff1f;这是由于Windows不能启动显卡驱动&#xff0c;从而无法进入图形界面。 蓝屏错误0X000000B4可能由驱…

docker搭建redis集群(Cluster版三主三从)

docker搭建redis集群(Cluster版三主三从编写脚步建立配置redis的配置文件启动六个redis服务创建cluster集群测试集群的高可用编写脚步建立配置redis的配置文件 建立配置文件脚本 vim redis.shfor port in $(seq 1 6); \ do \ mkdir -p /volumn/redis/node-${port}/conf touch…

怎么修复老照片?这三个修复方法让你轻松学会

大家在翻看以前的照片时&#xff0c;有没有发现有一些照片的颜色泛黄&#xff0c;内容也变得有些模糊不清了&#xff0c;遇到这种情况应该怎么办呢&#xff1f;不知道的小伙伴也不要着急&#xff0c;今天我就给大家分享几个模糊老照片修复教程&#xff0c;教会大家如何修复老照…

一直没明白的 HTTPS,今天必须让你懂了~

大家第一次接触 HTTPS 协议的时候是不是和我一样&#xff0c;非常困惑。 这玩意概念又多又繁琐。尤其是里面的公钥私钥啥的。 当时就特别想知道&#xff0c;为什么用公钥加密却不能用公钥解密&#xff1f; 看完这篇文章你会弄明白&#xff0c;同时还会解锁很多HTTPS里的细节…

1.所有被new出来的实例都是存放在堆里的吗?Android面经

问题&#xff1a; 所有被new出来的实例都是存放在堆里的吗&#xff1f; 相关知识点&#xff1a; 堆和栈、标量替换、栈上分配、逃逸分析 思考&#xff1a; 首先&#xff0c;这样问了&#xff0c;答案肯定是不是所有new出来的实例都存放在堆里&#xff0c;不然下面没法继续问了…