当前位置: 首页 > 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.lqws.cn/news/458623.html

相关文章:

  • 讯方“教学有方”平台获华为昇腾应用开发技术认证!
  • Linux系统时间不对导致mysql初始化失败:Data Dictionary initialization failed.(数据字典版本验证失败)
  • 【案例分享】如何用 DHTMLX Scheduler 构建灵活高效的资源调度系统?
  • Vue 比较两个数组对象,页面展示差异数据值
  • 1.22Node.js 中操作 Redis
  • 党建赋能 医校协同|广州附医华南医院与湖南中医药高等专科学校签约携手共育英才
  • Unity3D仿星露谷物语开发67之创建新的NPC
  • HTTP Server
  • 基于RISV-V的矿业网关,支持矿鸿等国产系统
  • 树莓派倾斜传感器实验指导书
  • 为什么你的vue项目连接不到后端
  • Linux 内核同步管理全解:原理 + 实战 + 考点
  • 【服务器R环境架构】基于 micromamba下载 R 库包
  • 企业实践 | 银河麒麟KylinOS-V10(SP3)高级服务器操作系统基础安装指南
  • 无人机吊舱热成像伪彩模式设计分析
  • Hadoop 技术生态体系
  • 如何填写“appium inspector”内容?
  • RAG工程落地:处理文档中表格数据
  • “地标界爱马仕”再启:世酒中菜联袂陈汇堂共筑新会陈皮顶奢产业
  • @annotation:Spring AOP 的“精准定位器“
  • 【MySQL数据库 | 第八篇】DQL语句 - 基础/条件查询
  • 20250620在荣品的PRO-RK3566开发板的Android13系统的uboot阶段就拉高GPIO2C6【driver模式】
  • 分布式ID生成利器:Snowflake UUID原理解析与实践
  • Lua 事务双写、RedisGears 异步双写、零停机索引迁移与容量预估
  • 数据结构第八章(六)-置换选择排序和最佳归并树
  • qt集成openssl
  • 大白话说目标检测中的IOU(Intersection over Union)
  • 数据结构-顺序表-数值统计
  • 「Linux文件及目录管理」硬链接与软连接
  • 学习笔记丨AR≠VR:透视沉浸式技术的“虚实象限”法则