Skip to content

⚠️ Important Notice

This post was last updated on: which was . Please pay attention to its timelines.

TypeScript编译过程

源代码 -> 扫描器 -> 解析器 -> 绑定器 -> 类型检查器 -> 转换器 -> 发射器 -> JS代码

源代码对于TS来说就是一个字符串,拿到源代码首先要经过扫描器(Scanner)处理,在内部通过有限状态机的处理转成Token。

扫描器的产物Token,会给解析器使用,按照语法规则转成AST。

AST描述了程序的语法结构,接着绑定器为AST注入符号(Symbol)和作用域(Scope)信息。 符号是指程序中的命名实体,如变量、函数、类、接口等; 作用域就是JS的作用域。

类型检查器:负责类型检查,是TS的核心功能。主要工作:

  • 类型推断
  • 类型兼容性检查
  • 泛型实例化
  • 上下文类型分析
  • 控制流分析

转换器:将带有类型标注的AST转成JS的AST,内容如下:

  1. 删除类型标注
  2. 将高级语言特性转成目标ECMA标准可兼容的

发射器:将处理后的AST转成文本形式的JS代码,并生成源映射(sourcemap文件)和声明文件(.d.ts文件)。

编译过程的优化:

  • 增量编译:构建依赖图以及缓存来对增量编译进行优化,可以减少重复编译的时间。
    • .tsbuildinfo文件来存储上一次构建的信息。vite拉下来的模板也使用了该配置tsBuildInfoFile
  • 项目引用系统:在一个完整的大项目中通过references来切分为小项目
    • vite拉下来的模板也通过该配置优化:
      json
        "references": [
          { "path": "./tsconfig.app.json" },
          { "path": "./tsconfig.node.json" }
        ]
    • 好处就在于能增量构建

上一次更新: