相对 vs. 非相对模块导入
- 相对导入是以/,./或../开头的,其它的都为非相对导入
模块解析策略
- 共有两种可用的模块解析策略:Node和Classic。
- 使用 –moduleResolution标记来指定使用哪种模块解析策略。
- 若未指定,那在使用 –module AMD | System | ES2015时的默认值为Classic,其它情况时则为Node
Classic解析流程
1 | import { b } from "./moduleB" |
1 | import { b } from "moduleB" |
Node 解析流程
- var x= require(“./moduleB”)
相对的:
- 检查该文件是否存在
- –> 检查该目录是否包含package.json,且package.json指定一个main模块,就引入这个main指定模块
- –> 检查该目录下是否有index.js文件(隐式的当作main模块)
非相对:
- 在node_module查找对应的模块的js,package.json,index.js,在一共扫描9个文件,从第4和第7个文件开始,在上一循环的文件上跳一级目录
Typescript 解析流程
- 在Node解析逻辑基础上增加了TypeScript源文件的扩展名(.ts,.tsx和.d.ts)。
- TypeScript在 package.json里使用字段”types”来表示类似”main”的意义 - 编译器会使用它来找到要使用的”main”定义文件。
- TypeScript检查对应模块的.ts,.tsx,.d.ts,package.josn,index.ts,index.tsx,index.d.ts文件,一共检查21个文件,然后8和15时会在上衣循环的文件上向上跳一级目录
附加的模块解析标记
Base URL: 设置baseUrl来告诉编译器到哪里去查找模块。
- 所有非相对模块导入都会被当做相对于 baseUrl,相对模块的导入不会被baseUrl所影响
- baseUrl的值由以下两者之一决定:
- 命令行中baseUrl的值(给定的路径是相对的,那么将相对于当前路径进行计算)
- ‘tsconfig.json’里的baseUrl属性(给定的路径是相对的,那么将相对于’tsconfig.json’路径进行计算)
路径映射
- TS编译器通过使用tsconfig.json文件里的”paths”来支持模块不是直接放在baseUrl下面的声明映射。(“paths”是相对于”baseUrl”进行解析)
rootDirs指定虚拟目录:
- 多个目录下的工程源文件在编译时会进行合并放在某个输出目录下。 相当于源目录创建了一个“虚拟”目录。
- 利用rootDirs,可以告诉编译器生成这个虚拟目录的roots
- 在逻辑上合并的物理目录列表,提供的数组可以包含任意数量的任何名字的目录,不论它们是否存在
跟踪模块解析: tsc –traceResolution
使用–noResolve: 不要添加任何不是在命令行上传入的文件到编译列表
- tsc app.ts moduleA.ts –noResolve //指定了moduleA.ts 找到它就编译,是其它不编译
常见问题 — 为什么在exclude列表里的模块还会被编译器使用?
- 想利用 “exclude”排除某些文件,甚至想指定所有要编译的文件列表,请使用“files”
- 要从编译列表中排除一个文件,需要在排除它的同时,还要排除所有对它进行import或使用了
/// <reference path="..." />
指令的文件