未完工,先记个流水,以后上例子。有重要的事先去处理了
project refernces 是typescript实现monorepos的特性,只对修改了的包进行类型检查,来加快类型检查,利用增量编译加快编译速度。
最简的配置要点
假设项目的一级目录列表
foo/
bar/
baz/
packages.josn 要添加 private: true, 防止该配置发包出去。
tsconfig.json
tsconfig-base.json
项目全局配置文件tsconfig.json
执行 tsc -b 一次性完成所有包的编译
{"files": [], //使的该配置文件不生成文件"references": [{"path": "./core"},{"path": "./animals"},{"path": "./zoo"},{"path": "./foo"}]}
项目全局配置文件tsconfig-base.json
包的公共配置,方便继承
{"compilerOptions": {"declaration": true,"target": "es5","module": "commonjs","strict": true,"noUnusedLocals": true,"noUnusedParameters": true,"noImplicitReturns": true,"noFallthroughCasesInSwitch": true,"composite": true}}
包配置
包之间引用,要写成相对目录。假设 bar 依赖 foo, baz 依赖 bar。
大体上类似:
foo/tsconfig.json
{"extends": "../tsconfig-base.json","compilerOptions": {"outDir": "../lib/foo","rootDir": "."}}
bar/tsconfig.json
{"extends": "../tsconfig-base.json","compilerOptions": {"outDir": "../lib/bar","rootDir": "."},"references": [{"path": "../foo"}]}
baz/tsconfig.json
{"extends": "../tsconfig-base.json","compilerOptions": {"outDir": "../lib/baz","rootDir": "."},"references": [{"path": "../bar"}]}
依赖关系:foo <- bar <- baz,那么 baz在ts文件里 import bar 时,不管你有没有手动全部引入 bar 所有导出的东西,那么 foo 和 bar 各自导出的东西在 baz 里都是可见的。
“从引用项目导入模块将改为加载其输出声明文件(.d.ts)”
和 references 的 path 同层配置的还有一个 prepend 配置, 目前不是清楚它的作用,只知道它和outfile配置有关,也就是和文件合并有关。
配合lerna配置
通过在tsconfig-base.json里paths配置路径映射就实现了,包之间引用,通过包名来引用。
参考
官网文档
Programming TypeScript: Making Your JavaScript Applications Scale
Project references: Option to bundle dependencies with multi-file output
