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

前端工程化 - 良好的feature-based-目录结构与具体示例 - MT

良好的feature-based-目录结构与具体示例

背景

先拆”业务边界”,不是拆组件

从业务角度来说,这个订单页其实有3个部分:

  1. 核心 - 浏览能力
    • 订单列表
    • 基础筛选
    • 分页
  2. Extension - 可选 - 插件能力
    • 高级筛选
    • 导出
    • 状态变更
  3. Detail - 按需能力
    • 订单详情单床

重构目录结构

把 “ 按技术类型” 改为 “按业务角色”

如果一开始就能拆成这样,其实80%的问题就已经解决了.

src/
├── features/
│   ├── user/
│   │   ├── pages/
│   │   │   ├── UserList.vue
│   │   │   └── UserDetail.vue
│   │   │
│   │   ├── components/
│   │   │   ├── UserTable.vue
│   │   │   └── UserForm.vue
│   │   │
│   │   ├── api/
│   │   │   └── user.api.ts
│   │   │
│   │   ├── store/
│   │   │   └── user.store.ts
│   │   │
│   │   ├── hooks/
│   │   │   └── useUser.ts
│   │   │
│   │   ├── types/
│   │   │   └── user.types.ts
│   │   │
│   │   └── index.ts
│   │
│   ├── order/
│   │   ├── pages/
│   │   ├── components/
│   │   ├── api/
│   │   ├── store/
│   │   └── index.ts
│   │
│   └── product/
│       └── ...
│
├── shared/
│   ├── components/
│   │   ├── BaseTable.vue
│   │   ├── BaseModal.vue
│   │   └── BaseButton.vue
│   │
│   ├── hooks/
│   │   └── useRequest.ts
│   │
│   ├── utils/
│   └── styles/
│
├── router/
│   ├── routes/
│   │   ├── user.routes.ts
│   │   ├── order.routes.ts
│   │   └── product.routes.ts
│   │
│   └── index.ts
│
├── app.vue
└── main.ts

让 Page 变成 “纯装配层”

// OrderPage.vue(正确版本)<template><div class="order-page"><!-- Core:必须同步 --><BaseFilter /><OrderList @select="openDetail" /><!-- Extension:按需 --><Suspense><AdvancedFilter v-if="showAdvanced" /></Suspense><Suspense><ExportPanel v-if="canExport" /></Suspense><Suspense><StatusAction v-if="canChangeStatus" /></Suspense><!-- Detail:用户触发 --><Suspense><OrderDetailDialogv-if="showDetail":order-id="currentOrderId"@close="closeDetail"/></Suspense></div>
</template>
<script setup lang="ts">
import { defineAsyncComponent } from 'vue'// core 同步加载
import BaseFilter from '../core/BaseFilter.vue'
import OrderList from '../core/OrderList.vue'// extension 异步加载
const AdvancedFilter = defineAsyncComponent(() => import('../extensions/advanced-filter/AdvancedFilter.vue')
)
const ExportPanel = defineAsyncComponent(() => import('../extensions/export/ExportPanel.vue')
)
const StatusAction = defineAsyncComponent(() => import('../extensions/status/StatusAction.vue')
)// detail 异步
const OrderDetailDialog = defineAsyncComponent(() => import('../detail/OrderDetailDialog.vue')
)import { useOrderCore } from '../core/useOrderCore'
import { useOrderDetail } from '../detail/useOrderDetail'const {showAdvanced,canExport,canChangeStatus
} = useOrderCore()const {showDetail,currentOrderId,openDetail,closeDetail
} = useOrderDetail()
</script>
  • Page 里没有业务规则
  • 没有 if 权限判断
  • 只负责 “拼装能力”

把 规则 收敛到 对应边界

// useOrderCore.ts(核心逻辑)
export function useOrderCore() {const showAdvanced = ref(false)const canExport = computed(() => {return permission.value.includes('order:export')})const canChangeStatus = computed(() => {return permission.value.includes('order:status')})return {showAdvanced,canExport,canChangeStatus}
}

规则集中,边界生效

Extension 是“插件”,不污染 Core

不需要知道 OrderList的存在

// extensions/export/useExport.ts
export function useExport() {const exportOrders = async () => {// 导出逻辑}return { exportOrders }
}// ExportPanel.vue<template><button @click="exportOrders">导出</button>
</template><script setup>
import { useExport } from './useExport'
const { exportOrders } = useExport()
</script>

Detail 完全独立

Detail 不依赖 Core,Core 也不依赖 Detail

// detail/useOrderDetail.ts
export function useOrderDetail() {const showDetail = ref(false)const currentOrderId = ref<string | null>(null)const openDetail = (id: string) => {currentOrderId.value = idshowDetail.value = true}const closeDetail = () => {showDetail.value = false}return {showDetail,currentOrderId,openDetail,closeDetail}
}

正确的拆分,是先让业务“各司其职”,
lazy 只是顺手的事。

http://www.jsqmd.com/news/369990/

相关文章:

  • 只需五分钟,手把手教你本地部署大模型!
  • 【期货量化进阶】期货量化交易中的市场状态识别(实战方法)
  • 什么情况下,域名更适合走经纪交易?
  • 这次终于选对!顶流之选的AI论文平台 —— 千笔·专业学术智能体
  • 前端工程化 - 看起来“很合理”的feature目录结构 - MT
  • 亲测有效!想进大厂还是国企?这几个渠道才是“上岸”捷径 - 博客万
  • 【期货量化进阶】量化交易中的信号质量评估(实战方法)
  • 2025年买前必看!市场公认的优质烫金机品牌,市面上烫金机厂商技术实力与市场口碑领航者 - 品牌推荐师
  • 多串口智能仪器仪表上位机开发。 包含实时数据监控刷新,操作点击控制,曲线数据显示,数据存储,历...
  • 拉美市场机遇爆发!美客多选品工具与技巧大公开,助你锁定美客多爆款商机 - 跨境小媛
  • 【期货量化进阶】期货量化交易中的多时间框架分析(实战技巧)
  • 好写作AI:与其偷偷用AI,不如让AI成为你的“学术品格加分项”
  • 2026年阿里巴巴/1688开户代运营服务商/公司排行榜:深圳昊客网络凭什么成为中小企业首选? - 专业GEO营销推广
  • 构建科技成果高效转化新路径——成果转化智能顾问赋能全链条服务生态
  • 【期货量化实战】量化交易策略的实盘部署指南(完整教程)
  • 2026年靠谱的电线电缆批发/出售厂家最新TOP排名:优质线缆采购指南 - 深度智识库
  • 【期货量化进阶】期货市场微观结构分析(深度解析)
  • 分析AI搜索优化公司,深圳地区哪家好 - 工业品网
  • 揭秘大润发购物卡回收高价攻略! - 团团收购物卡回收
  • AI搜索优化源头厂家如何选择,排名情况解读 - myqiye
  • 【期货量化进阶】期货量化交易中的订单执行优化(实战技巧)
  • langflow目前收到的能力
  • 2026年求推荐尼龙由壬供应商,实力强的尼龙由壬品牌有哪些 - 工业设备
  • 河北龙鹏产品靠谱吗,其性价比和运营模式在行业中排名如何 - mypinpai
  • 2026年口碑好的尼龙由壬接头供应商,产品价格多少钱 - 工业设备
  • antd的继续深耕
  • 前端工程化 - 模块化中的边界 - MT
  • 汕头海鲜火锅堂食服务商哪家好,海鲜火锅食材价格多少 - 工业品牌热点
  • 云边开源协同·智赋能效革命——MyEMS能源管理系统的破局之路
  • 前端工程化 - MT