TypeScript tsconfig.json Usage
在TypeScript
项目中,tsconfig.json
文件指定了用来编译这个项目的根文件和编译选项,通过自定义tsconfig.json
文件中的配置项,可以达到我们想要的编译结果。
tsc
当我们使用tsc
命令对项目进行编译时,编译器会从当前目录开始去查找tsconfig.json
文件,逐级向上搜索父目录。
下面我们将通过以下三个方面来讲述tsconfig.json
配置:
- 文件选项:
files
、include
、exclude
- 编译选项:
compilerOptions
- 项目引用:
extends
、references
文件选项
files
files
指定一个包含相对或绝对文件路径的列表,列举在files
中的所有文件,编译器在编译时都会将它们包含在内。
// tsconfig.json
"files": [
"src/core.ts",
"src/index.ts",
]
当配置文件中 的files
字段值如上所示时,使用tsc
命令编译时,src
目录下的core.ts
和index.ts
文件会被编译为core.js
和index.js
文件。
include
include
指定编译的文件或目录,include
是支持使用通配符来匹配路径名,支持的通配符及其功能如下表所示:
通配符 | 功能 |
---|---|
* | 匹配0 或多个字符,但是不匹配"."开头的隐藏文件和目录分隔符(/ or \ ) |
? | 匹配一个任意字符,但是不匹配目录分隔符 |
** | 匹配0 或多个字符,包括斜杠(这意味着可以匹配多个目录) |
例如,编译src
下所有文件:
"include": [
"src",
]
只编译src
二级目录下的文件:
"include": [
"src/*/*",
]
当tsconfig.json
文件同时配置了files
和 include
字段时,编译器会将它们进行合并。当files
和 include
中配置的的文件所引用的文件不在其中时,被引用的文件也会被包含进来。
exclude
exclude
指定编译时排除的文件或目录,exclude
的用法与include
相同。
当没有配置files
和 include
字段时,编译器会默认编译当前目录和子目录下所有的ts
文件(.ts
, .d.ts
和 .tsx
),排除在exclude
里配置的文件。而当设置了files
和 include
字段时,可以通过exclude
字段过滤include
的文件。
需要注意的是:通过 files
属性明确指定的文件却总是会被编译,不管exclude
如何配置。
此外,exclude
默认情况下会排除node_modules
,bower_components
,jspm_packages
和输出目录。
compilerOptions
compilerOptions
(编译选项)是tsconfig.json
文件中的重要组成部分,通过配置compilerOptions
中的属性可以实现项目的定制化编译。当tsconfig.json
文件中不包含compilerOptions
对象时,编译器编译时会使用默认值。
本文将compilerOptions
中的属性划分为以下四类进行讲解:
Basic Options
incremental
incremental
增量编译,默认值为true
,作用是加快编译速度。
当该配置为 true
时,会保存 ts
最后一次编译的信息,信息保存在根目录下的 .tsbuildinfo
文件中。下一次编译时,编译器会根据 .tsbuildinfo
文件中的信息判断出编译的最小代价。
与incremental
相关的字段为tsBuildInfoFile
,通过该字段可以指定编译信息保存在自定义的文件。
{
"compilerOptions": {
"incremental": true, /* Enable incremental compilation */
"tsBuildInfoFile": "./buildcache/front-end" /* Specify file to store incremental compilation information */
}
}
target
target
编译后目标语言的版本,默认值为ES3
(不区分大小写)。除了设置为ES3
外,还可以设置为ES5
, ES2015
,......, ES2020
, or ESNEXT
。其中ESNEXT
总是指向最新的js
版本,随着版本更新的变化而变化。但是通常我们都将其设置为ES5
。
{
"compilerOptions": {
"target": "es5"
}
}
module
module
是指生成代码的模块标准,当target
的值为es6
时,module
的默认值为es6
,否则默认为commonjs
。其中es6
是js
模块化规范,commonjs
是node.js
的模块化规范。除了默认的这两个之外,它的值还可以是 'amd', 'umd'等。关于模块化的内容推荐学习 javaScript:模块机制。
下面我们通过一个ts
文件,列举了不同module
值编译后的结果:
ts
文件代码(ES6 规范):
const sum = (a: number, b: number) => a + b;
export default sum;