这篇文章讨论一下在 Angular/Nx 项目中 tsconfig.json 是如何工作的,本文使用的环境如下:
- Node: 20.11.0(
node -v
) - NPM: 10.2.4(
npm -v
) - Angular CLI: 17.3.7(
ng version
) - Typescript: 5.4.2(in
package.json
—by project, ortsc -v
—globally) - Nx: 15.2.1(
nx --version
)
1. 什么是 tsconfig.json
tsconfig.json
是 TypeScript 的配置文件,用于配置 TypeScript 编译器的行为。目前很多框架都使用Typescript,自然也就需要配置 tsconfig.json
文件。
2. Angular Single Project
Angular框架原生支持Typescript,所以在Angular项目中,使用Angular CLI创建Angular项目后,项目的文件结构如下:
1 | my-app/ |
与tsconfig相关的文件有如下三个:
- tsconfig.json
- tsconfig.app.json
- tsconfig.spec.json
2.1 tsconfig.json
先看一下 tsconfig.json
文件,这是该项目总的配置文件,用来做一些通用配置,其他tsconfig文件可以继承这个文件。
1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ |
2.2 tsconfig.app.json
tsconfig.app.json
文件是 Angular app的编译配置文件,由第一行"extends": "./tsconfig.json"
可知,它继承了 tsconfig.json
文件的配置,同时也可以覆盖 tsconfig.json
文件的配置。
- files:
- include:
"src/**/*.d.ts"
表示包含所有位于src目录下的Typescript类型定义文件(*.d.ts)
1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ |
2.3 tsconfig.spec.json
tsconfig.spec.json
文件是 Angular app的测试配置文件,由第一行"extends": "./tsconfig.json"
可知,它也继承了 tsconfig.json
文件。在include选项中,包含了所有的测试文件(.spec.ts)和类型定义文件(.d.ts)。
1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ |
如果你尝试将src/**/*.spec.ts
从include
选项中删除,再运行npm run test
,将会遇到如下错误。
1 | An unhandled exception occurred: error TS18003: No inputs were found in config file '.../my-app/tsconfig.spec.json'. Specified 'include' paths were '["src/**/*.d.ts"]' and 'exclude' paths were '["./out-tsc/spec"]' |
由上面的分析可知,Angular项目中的 tsconfig.json
文件是一个全局配置文件,tsconfig.app.json
掌管app的编译选项,tsconfig.spec.json
负责测试文件的配置,这两者分别继承了 tsconfig.json
文件,同时可以做一些个性化的配置。
那么tsconfig.app.json
和tsconfig.spec.json
文件是如何被使用的呢?这就需要分析另一个文件:angular.json
:
2.4 angular.json
可以看到在projects | my-app | architect | build | options
中,有一个tsConfig
选项,这个选项指定了tsconfig.app.json
文件的路径,这就是告诉Angular CLI在编译app时要使用tsconfig.app.json
文件。
同时,在projects | my-app | architect | test | options
中,有一个tsConfig
选项,这个选项指定了tsconfig.spec.json
文件的路径,这就是告诉Angular CLI在编译测试文件时要使用tsconfig.spec.json
文件。
1 | { |
总结一下:
tsconfig.json
是全局配置文件tsconfig.app.json
是app的编译配置文件,继承了tsconfig.json
文件。tsconfig.spec.json
是测试文件的配置文件,继承了tsconfig.json
文件。angular.json
文件中的tsConfig
选项指定了tsconfig.app.json
和tsconfig.spec.json
文件的路径
上图:
3. Angular Multi Project
关于如何创建Angular多项目应用,可以参考这篇
多项目应用的文件结构如下,projects目录负责存放所有的子项目,这里有两个子项目:mfe1和shell。
每个子项目分别有自己的tsconfig.app.json
和tsconfig.spec.json
文件,这两个文件分别继承了全局的tsconfig.json
文件。
1 | my-app/ |
angular.json
文件中的tsConfig
选项指定了每个子项目的tsconfig.app.json
和tsconfig.spec.json
文件的路径。
1 | { |
总结一下:
多项目Angular应用的tsconfig文件使用情况
tsconfig.json
是全局配置文件,位于workspace根目录下- 每个子项目有自己的
tsconfig.app.json
和tsconfig.spec.json
文件,分别继承了全局的tsconfig.json
文件 angular.json
文件中的tsConfig
选项指定了每个子项目的tsconfig.app.json
和tsconfig.spec.json
文件的路径
上图:
4. Nx Mono Repo
使用Nx创建的Mono Repo项目,Nx会自动创建一个tsconfig.base.json
文件,这个文件是全局的配置文件,所有的子项目都会继承这个文件。并且没有angular.json
文件,每个子项目有自己的project.json
文件,负责引用子项目中的tsconfig
文件。
假设我们的mono repo包含一个app,名为todo
, 一个library, 名为data-access
,则文件结构如下:
1 | Nx mono repo/ |
总结一下:
tsconfig.base.json
是全局配置文件,位于workspace根目录下- app项目有自己的
tsconfig.app.json
和tsconfig.spec.json
文件以及tsconfig.json
,继承关系如下:tsconfig.app.json
继承tsconfig.json
tsconfig.spec.json
继承tsconfig.json
tsconfig.json
继承tsconfig.base.json
- library项目有自己的
tsconfig.lib.json
和tsconfig.spec.json
文件以及tsconfig.json
,继承关系如下:tsconfig.lib.json
继承tsconfig.json
tsconfig.spec.json
继承tsconfig.json
tsconfig.json
继承tsconfig.base.json
- 每个子项目的
project.json
文件负责引用子项目中的tsconfig
文件
一图胜千言