Typescript中模块解析

111 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

模块解析

模块解析指的是当我们在程序中导入模块时,编译器查找并读取导入模块的定义。模块解析的影响条件有模块解析策略以及模块解析编译选项或者相对模块导入和非相对模块导入。在解析相对模块导入的模块名时,会参考当前模块文件所在的目录位置。

相对模块导入可以使用.//或者../,其中第一个指的是当前目录,第二个指的是系统的根目录,最后一个指的是上一级目录。

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';