模块解析
模块解析指的是当我们在程序中导入模块时,编译器查找并读取导入模块的定义。模块解析的影响条件有模块解析策略以及模块解析编译选项或者相对模块导入和非相对模块导入。在解析相对模块导入的模块名时,会参考当前模块文件所在的目录位置。
相对模块导入可以使用./
和/
或者../
,其中第一个指的是当前目录,第二个指的是系统的根目录,最后一个指的是上一级目录。
import x from './t';
import y from '../pot/r';
import z from '/w';
非相对模块导入使用中,就不是和相对模块一样,引入方式也不一样。
import { Teacher } from '@tea/op';
import { Comple } from 'tet';
模块解析策略有Classic
策略和Node
策略。模块解析策略中我们在tsconfig.json
中配置moduleResolution
属性去设置。如果我们在模块解析策略时没有设置模块,那么默认的模块解析策略和module
编译选项的值有关。如果module
编译选项为CommonJS
那么默认的模块解析策略为Node
。如果编译选项的值不为CommonJS
,那么模块解析策略的是Classic
。其中模块解析策略中Classic
解析时由将导入的模块名视为文件,并在指定目录中查找ts文件的阶段。
tsc --module CommonJS;
tsc --module ES6;
我们需要注意的是Classic
模块解析策略中,相对模块导入解析和非相对模块导入模块解析不同的是解析相对模块导入时只会查找指定的一个目录;解析非相对模块导入时会向上遍历整个目录树。而且解析非相对模块导入会多出一步来。就是为了查找是否安装要导入的声明文件。
Node
模块解析策略也有很多阶段。当导入的模块为文件时,可以查找指定目录中的ts和js文件。当导入模块为目录时,会解析package.json
文件中的main
属性或者typings
属性和types
属性。
import * as Y from './x';