前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航
完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

# TypeScript 工程化:tsconfig.json 配置

官方网站其实有一章专门讲了 tsconfig.json 配置,但是大多数人可能跟我一样,读了一遍之后根本不知道在干什么,我们就用白话逐条来解读 tsconfig.json 的配置项。

如果一个目录下存在一个 tsconfig.json 文件,那么它意味着这个目录是 TypeScript 项目的根目录。 tsconfig.json 文件中指定了用来编译这个项目的根文件和编译选项。

一个项目可以通过以下方式之一来编译:

  • 不带任何输入文件的情况下调用 tsc,编译器会从当前目录开始去查找 tsconfig.json 文件,逐级向上搜索父目录。
  • 不带任何输入文件的情况下调用 tsc,且使用命令行参数 --project(或-p)指定一个包含 tsconfig.json 文件的目录。 当命令行上指定了输入文件时,tsconfig.json文件会被忽略。

# tsconfig.json 文件指定

我们先看一下 tsconfig.json 主要配置项:

{
  "files": [],
  "include": [],
  "exclude": [],
  "compileOnSave": false,
  "extends": "",
  "compilerOptions": {}
}
@前端进阶之旅: 代码已经复制到剪贴板

# files 配置项

files 是一个数组列表,里面包含指定文件的相对或绝对路径,用来指定待编译文件,编译器在编译的时候只会编译包含在files中列出的文件。

这里的待编译文件是指入口文件,任何被入口文件依赖的文件,比如 foo.ts 依赖 bar.ts ,那这里并不需要写上 bar.ts ,编译器会自动把所有的依赖文件纳为编译对象。

如果我们不指定待编译文件的话,则取决于有没有设置 include 选项,如果没有 include 选项,则默认会编译根目录以及所有子目录中的文件。

# include/exclude 配置项

include/exclude 也是一个数组,但数组元素是类似 glob 的文件模式。它支持的 glob 通配符包括:

  • *:匹配 0 或多个字符(注意:不含路径分隔符)
  • ?:匹配任意单个字符(注意:不含路径分隔符)
  • **/ :递归匹配任何子路径

在这里我们既可以指定目录也可以指定文件,而上面的 files 选项则只能指定文件。

我们再说明一个问题,什么才是 TypeScript 编译器眼中的文件?

TS 文件指拓展名为 .ts、.tsx 或 .d.ts 的文件。如果开启了 allowJs 选项,那 .js 和 .jsx 文件也属于 TS 文件,因此一个目录下只有上述文件才会被编译。

include/exclude 的作用也很好理解,我们可以指定编译某些文件,或者指定排除某些文件,但是别忘了,还有上面我们提到的 files,这三者的关系是什么样的?有没有优先级?或者默认值?

# include/exclude/files 三者的关系

首先我们明确一点,exclude 是有默认值的,如果我们没有设置 exclude ,那其默认值为 node_modules 、bower_components、jspm_packages 和编译选项 outDir 指定的路径。

还有一点,files 的优先级是最高的,比如我们在 files 中指定了一些文件,但是又在 exclude 中把它们排除了,这是无效的,因为 files 的优先级更高,这些文件依然会被编译,但是如果 include 中包含,那么依然会被排除,由此可见这三者的优先级如下:

files > exclude > include

如果 files 和 include 都未设置,那么除了 exclude 排除的文件,编译器会默认包含路径下的所有 TS 文件。

# tsconfig.json 配置复用

我们看到 tsconfig.json 还有一个 extends 的配置项,它的作用是实现配置复用,即一个配置文件可以继承另一个文件的配置属性。

比如我们创建一个文件 configs/base.json:

{
  "compilerOptions": {
    "noImplicitAny": true,
    "strictNullChecks": true,
    "composite": true,
    "incremental": true
  }
}
fe
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
开发者导航