当前位置: 首页 > news >正文

前端工程结构设计指南:如何让模块解耦、易维护、可拓展

简述痛点:「当项目代码越来越大,一个修改往往影响多个模块,导致代码耦合、修改麻烦。」 点出目标:「本文分享一套结构设计和代码组织原则,适用于 React/Vue 项目,助力构建可维护、可拓展的前端工程。」

举例说明:
一个模块修改,影响到其他模块。
接口参数相同但结构不同,代码堆砌。
通用组件和专用组件混淆。

你是否有过因为修改一个模块,导致其他页面崩掉的经历?

设计原则:
通用和专用分离。
接口参数化设计。
一个组件,多态展示。
可共用部分放 shared。
模块隔离,修改互不影响。

以 React 为例,展示结构:
src/
├─ app/ # 整个应用的入口和路由配置
│ └─ App.tsx
├─ features/
│ └─ user/ # 用户模块
│ ├─ pages/
│ │ └─ UserList.tsx
│ │ └─ UserDetail.tsx
│ └─ state/
│ └─ userAtoms.ts
│ └─ api.ts # 当前模块的接口封装
│ └─ components/
│ └─ UserCard.tsx
├─ features/
│ └─ order/ # 订单模块
│ └─ pages/
│ └─ state/
│ └─ api.ts
├─ shared/ # 通用共享部分
│ └─ components/
│ └─ hooks/
│ └─ utils/
├─ main.tsx
├─ vite.config.ts
├─ index.html

以 Vue 为例,展示结构
src/
├─ shared/ # 通用共享部分
│ └─ components/ # 通用组件 (Button、Input、Table…)
│ └─ Button.vue
│ └─ Table.vue
│ └─ api/
│ └─ httpClient.ts # 通用请求封装
├─ features/
│ └─ user/ # 用户模块
│ └─ components/ # 用户模块专用组件
│ └─ UserCard.vue
│ └─ api.ts # 用户接口,参数化管理
│ └─ pages/
│ └─ UserList.vue
│ └─ UserDetail.vue
├─ app/
│ └─ router.ts # 路由配置
├─ stores/
│ └─ userStore.ts # 用户模块 Pinia Store

通用组件
放在 shared/components
只和显示有关,例如:
Button.vue
InputField.vue
Table.vue
模块专用组件
放在 features/{module}/components
只在这个模块使用,例如:
UserCard.vue (显示用户头像和名字)
接口参数不同但结构相同
在 features/{module}/api.ts 里参数化
完全共用接口
放在 shared/api,如:
shared/api/auth.ts
shared/api/common.ts
一个组件因为参数不同而显示不同
用 Props 控制行为

示例代码片段:
通用组件
接口参数化
用 props 控制行为
简明扼要,不贴过大代码片段。

优点:
修改不影响其他模块。
可快速迭代。
可为新成员提供清晰结构。

缺点:
对小型项目结构略重。
学习和维护结构需要共识。

重申结构设计意义。
呼吁读者在实际项目中尝试。
提供参考方向和建议。

可附参考链接:

微前端概念。
比如说:
Module Federation
qiankun
single-spa
模块化设计。
可维护性设计文章。

修改 user 模块只需要修改 features/user,不会碰到其他模块
每个模块都有自己的:
pages/ —— 路由页面
state/ —— Recoil atoms/selectors
api.ts —— 接口请求
components/ —— 模块专属组件
通用部分放 shared/
路由集中管理在 app/App.tsx

增加新模块只需要
在 features/ 创建新模块结构。
在 app/App.tsx 增加新路由。
完全不会碰老模块代码。

如果是跨模块共用,放 shared/components。
如果是只在某模块共用,放 features/[module]/components。
如果是因为参数不同显示不同内容:保留一个组件,通过 props 控制行为。

在总结里强调:
模块化是让前端大中型项目可维护、可拓展的核心。
明确结构和职责分配,避免耦合。
找到共性和个性之间的平衡。
结构设计是为后续迭代和维护服务。

http://www.xdnf.cn/news/1061677.html

相关文章:

  • postgresql 函数调试
  • 接口测试需要注意的一些BUG
  • 多相机三维人脸扫描仪:超写实数字人模型制作“加速器”
  • chili3d笔记19 读取dxf
  • 阿里巴巴开源的 分布式事务解决方案Seata
  • iOS应用启动时间优化:通过多工具协作提升iOS App性能表现
  • 1532.在区间范围内统计奇数数目
  • Android 当apk是系统应用时,无法使用webView的解决方案
  • 京运通601908,一只值得长期跟踪操作的波段投资标的,两个指标即可做好
  • Cargo 与 Rust 项目
  • Spring Boot自动配置原理
  • 【智能安全帽新升级】搭载VTX316TTS语音合成芯片,让安全“听得见”!
  • 【国产AI服务器】全国产PCIE5.0交换板,替代博通89104/89144,支持海光、龙芯等平台
  • HTTP 请求方法与状态码
  • “地标界爱马仕”再拓疆域:世酒中菜联袂赤水金钗石斛定义中国GI
  • 力扣-169.多数元素
  • Kafka线上集群部署方案:从环境选型到资源规划思考
  • http2与websocket关系
  • Linux——linux的基本命令
  • lingma(阿里云Ai)结合idea使用
  • day43-硬件学习之ARM基础知识
  • 从生活场景学透 JavaScript 原型与原型链
  • 棱镜观察|EMB“重构”卡钳,车企降本压力与Brembo困局
  • 力扣-62.不同路径
  • Cesium、ThreeWebGL详解(二)渲染引擎向GPU传数据、性能优化、引擎对比
  • Docker容器常用命令汇总
  • 华为云Flexus+DeepSeek征文 | 利用Dify平台构建多智能体协作系统:从单体到集群的完整方案
  • python自助棋牌室管理系统
  • 全面掌握 C++ 基础:关键特性与进化
  • Llama 4 模型卡及提示格式介绍