如何在Turborepo中让tsc自动转译工作区其他TypeScript包?
如何让TypeScript自动转译Monorepo中的工作区依赖包
针对你在Turborepo monorepo中遇到的主应用无法自动转译内部TypeScript包的问题,标准TypeScript本身没有直接对应Next.js transpilePackages的配置选项,但可以通过以下几种方案实现自动转译:
方案一:TypeScript Composite项目 + tsc-watch监听
- 配置依赖包的tsconfig.json
在packages/tspackage/tsconfig.json中开启复合项目模式,确保编译输出和声明文件生成:
{ "compilerOptions": { "target": "ESNext", "module": "CommonJS", "outDir": "./dist", "rootDir": "./src", "declaration": true, "composite": true }, "include": ["src/**/*"] }
- 主应用配置项目引用
在apps/tsapp/tsconfig.json中添加对tspackage的引用,并配置路径映射指向源码:
{ "compilerOptions": { "target": "ESNext", "module": "CommonJS", "outDir": "./dist", "rootDir": "./src", "baseUrl": ".", "paths": { "@myscope/tspackage": ["../../packages/tspackage/src"] } }, "include": ["src/**/*"], "references": [{ "path": "../../packages/tspackage" }] }
- 修改dev脚本
在apps/tsapp/package.json中更新dev命令,使用--build参数让tsc-watch处理整个引用链:
{ "scripts": { "dev": "tsc-watch --build --onSuccess \"node dist/index.js\"" } }
执行npm run dev后,tsc会自动先编译tspackage,且修改tspackage代码时会触发增量编译,无需手动重启。
方案二:ts-node + SWC实时转译
如果不想预编译依赖包,可借助ts-node和SWC实现实时转译:
- 安装依赖
npm install -D ts-node tsconfig-paths @swc/core @swc/register
- 配置路径映射
在apps/tsapp/tsconfig.json中保留路径映射:
{ "compilerOptions": { "paths": { "@myscope/tspackage": ["../../packages/tspackage/src"] } } }
- 更新dev脚本
{ "scripts": { "dev": "ts-node -r tsconfig-paths/register -r @swc/register src/index.ts" } }
这样ts-node会通过SWC实时转译tspackage的源码,修改后立即生效,跳过预编译步骤。
方案三:Turborepo管道实现并行监听
结合Turborepo的管道能力,自动同步依赖包的编译状态:
- 配置turbo.json
在仓库根目录的turbo.json中定义dev管道,让主应用的dev依赖于依赖包的dev命令:
{ "$schema": "https://turbo.build/schema.json", "pipeline": { "dev": { "dependsOn": ["^dev"], "cache": false } } }
- 给依赖包添加dev脚本
在packages/tspackage/package.json中添加watch编译命令:
{ "scripts": { "dev": "tsc-watch --outDir dist" } }
- 主应用保持原dev脚本
运行根目录的npm run dev后,Turborepo会自动启动tspackage的watch和tsapp的watch,依赖包代码修改时会自动重新编译,主应用也会随之更新。
内容的提问来源于stack exchange,提问作者sigalor
相关产品推荐
相关产品推荐

