胥望雅 发表于 2026-2-11 16:25:08

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

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

背景

先拆”业务边界”,不是拆组件
从业务角度来说,这个订单页其实有3个部分:

[*]核心 - 浏览能力

[*]订单列表
[*]基础筛选
[*]分页

[*]Extension- 可选 - 插件能力

[*]高级筛选
[*]导出
[*]状态变更

[*]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(正确版本)                                                                              

[*]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.tsexport function useExport() {const exportOrders = async () => {    // 导出逻辑}return { exportOrders }}// ExportPanel.vue导出Detail 完全独立

Detail 不依赖 Core,Core 也不依赖 Detail。
// detail/useOrderDetail.tsexport function useOrderDetail() {const showDetail = ref(false)const currentOrderId = ref(null)const openDetail = (id: string) => {    currentOrderId.value = id    showDetail.value = true}const closeDetail = () => {    showDetail.value = false}return {    showDetail,    currentOrderId,    openDetail,    closeDetail}}正确的拆分,是先让业务“各司其职”,
lazy 只是顺手的事。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 前端工程化 - 良好的feature-based-目录结构与具体示例