[TS略知一二]模块解析策略

import { foo } from ‘ModuleA’

之于编译器而言, import { foo } from ‘ModuleA’; 这个过程中, 编译器需要首先知晓 ModuleA 的导出对象结构. 这个 ‘结构’ 可能定义在 ModuleA 的 ts 文件中, 亦可以通过编写 .d.ts 文件以支援原本使用 js 编写的 ModuleA. 编译器如何解析 ModuleA? 这便是依赖于模块解析策略.

moduleResolution 有两个可选的值 Node / Classic. 表示编译过程中遵循的不同策略.

Classic 和 Node 不同模式在查找路径上的区别

假设有如下代码

// src/folder/main.ts

import { a } from 'ModuleA';

import { b } from './ModuleB';

Typescript 解析模块曾经的默认模式是 Classic.

在 Classic 模式下, 编译器在导入 不指明相对路径的模块 时, 会从当前目录依次向上搜索 ‘ModuleA.ts’ 或 ‘ModuleA.d.ts’. 而对于指明 相对路径 的模块, 编译器则直接在该路径搜索 ‘ModuleB.ts’ 或 ‘ModuleB.d.ts’.

现在默认策略是 Node, 意在模拟 node 模块化加载的逻辑.

Node 模式下的配置,