TypeScript 模块解析和代码生成阶段
TypeScript module-resolution and code-generation phases
我正在尝试了解 TypeScript 中模块解析的过程。
假设我有两个文件。 A.ts
和 B.ts
,以及 "A" 导入 "B"。
模块分辨率如何工作?什么时候 ? (在编译器阶段)。
解析每个文件并构建两个 AST 之后。编译器的下一阶段是什么?
它如何知道在文件 "A" 中解析文件 "B" 中的变量(或类型)?
我有两个假设:
1. 它查看文件 "B" 的符号 table,并进行类型检查。
2. 将 AST 合并到一棵树中? (整个计划)
根据这些假设,我也很想知道代码生成如何受其影响。
1.如果第一个假设是正确的,代码生成就更复杂了。因为您需要根据依赖项的顺序生成 JS 代码。 (它如何检测导入周期?如果 A 导入 B,反之亦然)。
2. 如果第二个假设是正确的,我觉得代码生成会更容易做。
但我假设在生成代码之前,它需要为模块做一个"topological sort"。
提前致谢。
TypeScript 不会将文件合并在一起;它根据 tsconfig 的 "module"
配置的值生成 import
语句、require
调用或 define
调用。 (查看 this page of the handbook 上的 --module
)因此,TypeScript 从不需要担心循环依赖或合并 AST。
在你的例子中,"A.ts"被编译成"A.js","B.ts"被编译成"B.js"。
此外,TypeScript 的代码生成不使用也不需要类型信息。正因如此:
- 可能有数百个类型错误,如果类型错误被消除,代码仍将以相同的方式编译
- 您可以编译纯 JavaScript 代码,例如,将 ES2015 降级为 ES3。
唯一的例外是 const enum
s,因为无论何时引用枚举值都会内联到代码中。但是,由于值是内联的,因此模块排序不是问题。
我正在尝试了解 TypeScript 中模块解析的过程。
假设我有两个文件。 A.ts
和 B.ts
,以及 "A" 导入 "B"。
模块分辨率如何工作?什么时候 ? (在编译器阶段)。
解析每个文件并构建两个 AST 之后。编译器的下一阶段是什么?
它如何知道在文件 "A" 中解析文件 "B" 中的变量(或类型)?
我有两个假设:
1. 它查看文件 "B" 的符号 table,并进行类型检查。
2. 将 AST 合并到一棵树中? (整个计划)
根据这些假设,我也很想知道代码生成如何受其影响。
1.如果第一个假设是正确的,代码生成就更复杂了。因为您需要根据依赖项的顺序生成 JS 代码。 (它如何检测导入周期?如果 A 导入 B,反之亦然)。
2. 如果第二个假设是正确的,我觉得代码生成会更容易做。
但我假设在生成代码之前,它需要为模块做一个"topological sort"。
提前致谢。
TypeScript 不会将文件合并在一起;它根据 tsconfig 的 "module"
配置的值生成 import
语句、require
调用或 define
调用。 (查看 this page of the handbook 上的 --module
)因此,TypeScript 从不需要担心循环依赖或合并 AST。
在你的例子中,"A.ts"被编译成"A.js","B.ts"被编译成"B.js"。
此外,TypeScript 的代码生成不使用也不需要类型信息。正因如此:
- 可能有数百个类型错误,如果类型错误被消除,代码仍将以相同的方式编译
- 您可以编译纯 JavaScript 代码,例如,将 ES2015 降级为 ES3。
唯一的例外是 const enum
s,因为无论何时引用枚举值都会内联到代码中。但是,由于值是内联的,因此模块排序不是问题。