TypeScript编译过程
源代码 -> 扫描器 -> 解析器 -> 绑定器 -> 类型检查器 -> 转换器 -> 发射器 -> JS代码
源代码对于TS来说就是一个字符串,拿到源代码首先要经过扫描器(Scanner)处理,在内部通过有限状态机的处理转成Token。
扫描器的产物Token,会给解析器使用,按照语法规则转成AST。
AST描述了程序的语法结构,接着绑定器为AST注入符号(Symbol)和作用域(Scope)信息。 符号是指程序中的命名实体,如变量、函数、类、接口等; 作用域就是JS的作用域。
类型检查器:负责类型检查,是TS的核心功能。主要工作:
- 类型推断
- 类型兼容性检查
- 泛型实例化
- 上下文类型分析
- 控制流分析
转换器:将带有类型标注的AST转成JS的AST,内容如下:
- 删除类型标注
- 将高级语言特性转成目标ECMA标准可兼容的
发射器:将处理后的AST转成文本形式的JS代码,并生成源映射(sourcemap文件)和声明文件(.d.ts文件)。
编译过程的优化:
- 增量编译:构建依赖图以及缓存来对增量编译进行优化,可以减少重复编译的时间。
.tsbuildinfo文件来存储上一次构建的信息。vite拉下来的模板也使用了该配置tsBuildInfoFile
- 项目引用系统:在一个完整的大项目中通过
references来切分为小项目- vite拉下来的模板也通过该配置优化:json
"references": [ { "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" } ] - 好处就在于能增量构建
- vite拉下来的模板也通过该配置优化: