未完工,先记个流水,以后上例子。有重要的事先去处理了
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