TypeScript Monorepo 边界:依赖方向比目录更重要
背景 Monorepo 解决了代码放在哪里,却不会自动解决谁可以依赖谁。一个工具包反向依赖业务层,很快会让整个仓库无法独立演进。 核心判断 画出允许的依赖方向,公共入口仅导出稳定契约。 项目引用描述编译依赖,包 exports 与 lint 管理实际导入路径。 构建缓存键包含源码、依赖版本和配置输入。 最小示例 下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。 { "references": [{ "path": "../domain" }], "compilerOptions": { "composite": true, "declaration": true } } 边界与误区 project references 不等于访问控制,也不会自动阻止跨包深层导入。composite 项目的输出目录和包解析必须与运行方式匹配。 验证方式 新增一个故意违规的导入,确认 lint 能拦截;修改底层包,检查受影响包重建,干净环境仍能按依赖顺序完成构建。 小结 每个包只暴露稳定入口,规定依赖方向并阻止通过深层路径绕过边界。