| name | code-style-monorepo |
| description | TypeScript monorepo 拆包与跨端工程化规范。新建 monorepo、拆分/新建包、设计包边界、决定代码放哪个包时使用,尤其涉及:三维拆包原则(功能域×平台层×抽象层级)、契约包 + 对称多端实现(Electron 双进程/web/mobile)、逻辑包与 -ui 包分离、包标准形态(exports/publishConfig/peerDependencies)、共享 infra 包收敛工程配置、ESLint 架构护栏(禁桶导入/穿透导入/自包导入/facade 隔离)、facade 门面与 preset 套餐分层 API、turbo 任务编排与测试组织。 |
通用 Monorepo 拆包与跨端工程化规范
概述
核心心智:包边界即架构边界,命名即依赖方向,工程约束 lint 化。
关键规则速查
拆包三维原则
包边界同时按三维切:
- 功能域:能被独立开关的特性 = 独立包(
sheets-filter、port-forwarding)
- 平台层(同构分离铁律):有 UI 的特性拆「逻辑包 +
-ui 包」,逻辑包必须能在 Node/Worker 跑,不 import 任何浏览器 API
- 抽象层级:core → engine → 领域 → 特性 → 特性 UI
命名即架构:<域>-<特性>[-ui|-core|-mobile],前缀标域、后缀标平台层,肉眼可判依赖方向。
契约包 + 对称多端实现(跨进程/跨端核心模式)
- 接口 + DI 标识符放运行时无关的契约包;各端(主进程/渲染进程/web/mobile)分别 implements 同一接口、注册同一标识符
- ❌ 禁止
*ClientService 后缀(泄漏运行时位置);跨进程方法签名一律 Promise<T> / Observable<T>
- 平台适配器放 app 的
platform/ 目录经 override 注入,让 *-core 包保持零平台 import
workspace 目录四分法
packages/ 可发布/共享库包
packages-internal/ 应用私有实现包(不发布)
internal/ (common/) 工程基建(eslint/tsconfig/构建配置,private)
apps/ 应用壳:只做组装 + 平台粘合,不写业务
应用 = 插件清单 + override 表
app 入口只做 new Core(config) → 顺序 registerPlugin(XxxPlugin, config) → core.start()。跨端差异 = 换插件清单 + 换 override 实现,不分叉核心逻辑。
ESLint 架构护栏(必配)
no-barrel-import(禁桶导入)、no-penetrating-import(禁穿透导入)、no-self-package-imports(禁自包导入)、facade 隔离双规则。豁免名单 = 技术债清单,禁止新增。
章节索引 — 按需打开
| # | 主题 | 文件 | 何时查阅 |
|---|
| 1 | 拆包原则与契约包 | references/01-package-splitting.md | 新建包、划边界、跨进程/端共享时 |
| 2 | 包的标准形态 | references/02-package-anatomy.md | 写 package.json/tsconfig/目录结构时 |
| 3 | 工程基建与护栏 | references/03-infra.md | 配 eslint/turbo/测试/CI 时 |
| 4 | 跨端与多环境 | references/04-cross-platform.md | desktop/web/mobile/worker 适配时 |
| 5 | 分层 API(facade/preset) | references/05-api-layering.md | 设计对外 API、做 SDK 时 |