banner
banner
banner
NEWS LETTER

TS-模块解析

Scroll down

相对 vs. 非相对模块导入

  • 相对导入是以/,./或../开头的,其它的都为非相对导入

模块解析策略

  • 共有两种可用的模块解析策略:NodeClassic
  • 使用 –moduleResolution标记来指定使用哪种模块解析策略。
  • 若未指定,那在使用 –module AMD | System | ES2015时的默认值为Classic,其它情况时则为Node

Classic解析流程

  • 相对导入: 相对与导入它的文件进行解析

1
2
3
import { b } from "./moduleB"
/root/src/folder/moduleB.ts
/root/src/folder/moduleB.d.ts
  • 非相对的导入: 从包含导入文件的目录开始依次向上级目录遍历,尝试定位匹配的声明文件

1
2
3
4
5
6
7
8
9
import { b } from "moduleB"
/root/src/folder/moduleB.ts
/root/src/folder/moduleB.d.ts
/root/src/moduleB.ts
/root/src/moduleB.d.ts
/root/moduleB.ts
/root/moduleB.d.ts
/moduleB.ts
/moduleB.d.ts

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的值由以下两者之一决定:
    1. 命令行中baseUrl的值(给定的路径是相对的,那么将相对于当前路径进行计算)
    2. ‘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="..." />指令的文件
其他文章
cover
TS-函数和this
  • 24/11/01
  • 11:40
  • TypeScript
cover
TS-JSX
  • 24/11/01
  • 11:40
  • TypeScript
目录导航 置顶
  1. 1. 相对 vs. 非相对模块导入
  2. 2. 模块解析策略
    1. 2.1. Classic解析流程
    2. 2.2. 相对导入: 相对与导入它的文件进行解析
    3. 2.3. 非相对的导入: 从包含导入文件的目录开始依次向上级目录遍历,尝试定位匹配的声明文件
    4. 2.4. Node 解析流程
    5. 2.5. 相对的:
    6. 2.6. 非相对:
    7. 2.7. Typescript 解析流程
  3. 3. 附加的模块解析标记
    1. 3.1. Base URL: 设置baseUrl来告诉编译器到哪里去查找模块。
    2. 3.2. 路径映射
    3. 3.3. rootDirs指定虚拟目录:
    4. 3.4. 跟踪模块解析: tsc –traceResolution
    5. 3.5. 使用–noResolve: 不要添加任何不是在命令行上传入的文件到编译列表
    6. 3.6. 常见问题 — 为什么在exclude列表里的模块还会被编译器使用?
请输入关键词进行搜索