未完工,先记个流水,以后上例子。有重要的事先去处理了

project refernces 是typescript实现monorepos的特性,只对修改了的包进行类型检查,来加快类型检查,利用增量编译加快编译速度。

最简的配置要点

假设项目的一级目录列表
foo/
bar/
baz/
packages.josn 要添加 private: true, 防止该配置发包出去。
tsconfig.json
tsconfig-base.json

项目全局配置文件tsconfig.json

执行 tsc -b 一次性完成所有包的编译

  1. {
  2. "files": [], //使的该配置文件不生成文件
  3. "references": [
  4. {
  5. "path": "./core"
  6. },
  7. {
  8. "path": "./animals"
  9. },
  10. {
  11. "path": "./zoo"
  12. },
  13. {
  14. "path": "./foo"
  15. }
  16. ]
  17. }

项目全局配置文件tsconfig-base.json

包的公共配置,方便继承

  1. {
  2. "compilerOptions": {
  3. "declaration": true,
  4. "target": "es5",
  5. "module": "commonjs",
  6. "strict": true,
  7. "noUnusedLocals": true,
  8. "noUnusedParameters": true,
  9. "noImplicitReturns": true,
  10. "noFallthroughCasesInSwitch": true,
  11. "composite": true
  12. }
  13. }

包配置

包之间引用,要写成相对目录。假设 bar 依赖 foo, baz 依赖 bar。
大体上类似:
foo/tsconfig.json

  1. {
  2. "extends": "../tsconfig-base.json",
  3. "compilerOptions": {
  4. "outDir": "../lib/foo",
  5. "rootDir": "."
  6. }
  7. }

bar/tsconfig.json

  1. {
  2. "extends": "../tsconfig-base.json",
  3. "compilerOptions": {
  4. "outDir": "../lib/bar",
  5. "rootDir": "."
  6. },
  7. "references": [
  8. {
  9. "path": "../foo"
  10. }
  11. ]
  12. }

baz/tsconfig.json

  1. {
  2. "extends": "../tsconfig-base.json",
  3. "compilerOptions": {
  4. "outDir": "../lib/baz",
  5. "rootDir": "."
  6. },
  7. "references": [
  8. {
  9. "path": "../bar"
  10. }
  11. ]
  12. }

依赖关系: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