团队协作中-如何划分公共组件目录

197 阅读2分钟

如何处理公共组件

在 Vue 或 React 开发中,当多个页面需要复用同一个组件时,组件的存放目录应该遵循以下原则:

推荐方案:提取到公共文件夹

  1. 独立于具体页面

    • 如果组件是通用型的(会被 3 个及以上页面使用,或具有明确的独立功能)
    • 路径建议:src/components/
    • 例如:Button.vueDataTable.vue 这类全局通用组件
  2. 页面级共享

    • 如果组件目前只在 2 个特定页面间共享,但可能具有业务特殊性
    • 路径建议:src/views/components/src/views/xxx/components/
    • 例如:OrderList 组件被 OrderHistoryOrderManagement 两个页面使用

不推荐方案:直接引用其他页面的组件

❌ 避免直接从另一个页面导入(如 import X from '../PageA/components/X'),因为:

  1. 会产生隐式耦合,修改 PageA 时可能意外影响 PageB
  2. 降低组件可维护性,后续难以追踪使用关系
  3. 违反单一职责原则,组件职责边界不清晰

如何划分组件

特征通用组件跨模块组件页面级组件
props尽量简单(基础数据类型)可能包含业务数据对象强耦合业务数据
依赖不依赖Redux/Vuex可能依赖部分Store模块依赖完整业务Store
样式独立样式(CSS-in-JS或scoped)可能继承父样式紧密耦合父样式

决策流程图

graph TD
    A[发现重复组件] --> B{"是否含有业务功能?"}
    B -->|是| C["放入 src/components/"]
    B -->|否| D{"是否跨多个功能模块?"}
    D -->|是| E["放入 src/views/components"]
    D -->|否| F["放入相关功能域的 src/views/xxx/components/ 目录"]

维护建议

  1. 渐进式演进:从简单结构开始,随复杂度增长逐步拆分
  2. 当第二次复用时,立即提升到公共目录
  3. 严格边界:禁止跨模块直接引用私有组件(如 views/order 不能直接导入 views/payment 的内部组件)
  4. 公共组件引用采用绝对路径 @/src/components 或者 @/src/views/xxx/components,避免相对路径 ../../components。方便组件提升后,批量修改。
  5. 定期进行代码审查,发现隐藏的重复组件

最终原则让文件位置反映功能归属,让开发者能通过目录结构快速理解业务架构。

复杂项目(模块划分)

src/
  components/       # 公共组件
  utils/            # 公共函数
  views/            # 业务模块
    product/        # 商品模块
      components/   # 模块专属组件(如ProductCard)
      hooks/        # 模块逻辑(如useProductList)
      types/        # 类型定义
      pages/        # 商品模块页面
      stores/       # 商品全局状态
      index.ts      # 统一出口
    order/          # 订单模块
      components/   # 模块专属组件(如OrderList)
      hooks/        # 模块逻辑(如useOrderList)
      types/        # 类型定义
      pages/        # 订单页面
      stores/       # 订单全局状态
      index.ts      # 统一出口
  shared/           # 跨模块共享业务组件
    components/     # 业务组件
    utils/          # 工具函数

复杂项目中,模块之间会存在比较多的交互,频繁的提升业务组件,造成模块中功能逻辑太过于分散。

可以在对应模块下增加 index.ts 统一出口,将模块组件提供给其他模块使用。