|
|
hai 2 días | |
|---|---|---|
| .. | ||
| README.md | hai 2 días | |
| examples.md | hai 2 días | |
无构建项目最容易「长成一坨」:所有组件堆在
components/、所有逻辑塞进一个超大 service。 本篇给出功能模块 / 通用能力 / 业务模块的拆分准则与落地目录。
| 类型 | 定义 | 归属 | 是否可跨项目 |
|---|---|---|---|
| 通用能力(util skill) | 与业务无关的纯能力:http、storage、format、debounce | utils/ |
✅ 可抽成包托管 Repose |
| 通用组件(UI kit) | 与业务无关的可复用 UI:弹窗、表格、表单、布局壳 | components/ |
✅ 可抽成组件库 |
| 功能模块(feature) | 一块完整业务功能:用户管理、订单、报表 | modules/<feature>/ |
❌ 业务专属 |
判别法:换一个业务项目,它还有用吗? 有用 → 通用(utils/components);没用 → 功能模块。
src/
app.js
components/ # 跨模块通用 UI
app-shell.js
tabs-bar.js
base-table.js
modules/ # 功能模块(一块一块业务)
user/
page-user-list.js # 页面组件
page-user-detail.js
user-service.js # 模块内 service
user-model.js # 模块内数据结构/转换
order/
page-order-list.js
order-service.js
services/ # 跨模块共享 service(全局状态)
auth-service.js
dict-service.js
utils/ # 通用能力
http.js
storage.js
format.js
index.html
规则:
services/(如 auth、字典、权限)。components/;只在某模块用的组件放在该模块目录内。一个功能模块只暴露页面组件(供路由挂载)与必要的 service。内部实现(子组件、model)不外泄。
modules/user/
index.js # 可选:统一出口
export { PageUserList } from './page-user-list.js';
export { userService } from './user-service.js';
modules/user/内部子组件.js。| 粒度 | 例子 | 归属 |
|---|---|---|
| 全局域(登录、权限、字典) | auth-service |
services/ |
| 模块域(仅本模块用) | user-service |
modules/user/ |
| ❌ 万能 service | app-service(什么都塞) |
拆掉 |
services/(上提,而非复制)。满足全部以下条件才抽:
抽出的产物:
kebab-case 自定义元素,托管到 FMODE Repose,业务用 importmap 引入。http、storage 等 utils 打成 ESM 包。抽早了是负担。先用项目内
components/utils/沉淀,稳定后再上提。
routes/modules → components → services → utils
│ │ │
└────────────────┴──────────────┘ 禁止反向
utils 不认识 services / components。services 不 import Lit / 组件。modules/<feature>/ 里?services/(而非每个模块各存一份)?components/,且不 import 任何业务 model?utils → services 之类的反向 import)?| 反模式 | 症状 | 修复 |
|---|---|---|
| 上帝 service | 一个 service 上千行,改哪都怕 | 按关注点拆分 |
| 组件内联业务 | 页面组件里 assert 校验 + fetch + 拼接口 | 逻辑下沉 service |
| utils 有状态 | utils 里存了「上次结果」 | 移到 service |
| 复制粘贴跨模块 | 两个模块各有一份 tableservice | 上提共享 |
| 过早抽象 | 只有一个用户就搞组件库 | 先项目内沉淀 |