开发环境下运行TypeScript Monorepo的推荐方案咨询
开发环境下TypeScript Monorepo(Yarn/Lerna)的运行方案咨询
最近我在把一个大型单体npm/TypeScript仓库重构为Yarn/Lerna/TypeScript Monorepo,初期的文件重构和导入更新工作进展顺利,但在开发模式(热重载/监听)运行Monorepo时遇到了棘手问题:所有包之间互相依赖,我希望避免每次代码变更都编译所有包。目前已经用Lerna完成了项目引导和依赖安装,Lerna会自动把包文件夹链接到node_modules,变更能同步到所有依赖仓库,但还需要明确一套标准的开发运行方案。
问题详情
- 我的Monorepo包含3个服务类包和1个依赖这些包的CLI包
- 原单体仓库中,我用这条命令运行CLI:
该命令能自动编译所需TS文件,执行耗时仅500ms-1s,这个速度我希望能保留。ts-node --transpiler sucrase/ts-node-plugin --project tsconfig.json --require tsconfig-paths/register bin/cli.ts - 每个包都有独立的tsconfig文件,并且使用了tsconfig paths配置,我希望保留这个配置,最坏情况下才考虑替换为相对路径。
已尝试的两种方案
方案1:每个包单独运行tsc-watch
- 配置:为每个包目录启动tsc-watch,将package.json的
main字段指向dist/index.js - 问题:tsc编译耗时过长——源码编译需要500ms-1s,每个包生成.d.ts文件至少要1.5-2s,加上tspaths替换每个项目还要额外500ms
- 替代尝试:用babel-watch替换tsc-watch,JS编译速度更快,但不会生成类型文件,无法满足类型检查需求
方案2:沿用原单体仓库的命令运行CLI
- 思路:直接复用原单体的ts-node命令启动CLI
- 问题:无法解析嵌套包的tsconfig paths。例如CLI包通过自身tsconfig解析路径后,调用已链接到node_modules的Transpiler包,但Transpiler包自身的路径配置无法被正确识别
- 副作用:需要放弃tsconfig paths配置,并且要把package.json的
main字段指向src/index.ts,这会增加生产构建的复杂度(方案1也存在这个问题)
参考的项目结构(AWS JS SDK Monorepo风格)
packages - cli *(依赖transpiler)* - transpiler *(依赖common和statements)* - statements *(依赖common)* - common *(无依赖)* package.json tsconfig.json
现咨询开发环境下运行该TypeScript Monorepo的推荐方式。
内容的提问来源于stack exchange,提问作者stiMULAnt
相关产品推荐
相关产品推荐

