Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions docs/project/modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,42 +184,42 @@ import someLocalNameForThisFile from './foo';
它们的主要区别在于系统如何解析模块。

:::tip
我将会使用一个概念性术语,`place` -- 将在提及查找模式后解释它。
我将会使用一个概念性术语,引用路径`place` -- 将在提及查找模式后解释它。
:::

#### 相对模块路径

这很简单,仅仅是按照相对路径来就可以了:

- 如果文件 `bar.ts` 中含有 `import * as foo from './foo'`,那么 `foo` 文件必须与 `bar.ts` 文件存在于相同的文件夹下
- 如果文件 `bar.ts` 中含有 `import * as foo from '../foo'`,那么 `foo` 文件所存在的地方必须是 `bar.ts` 的上一级目录;
- 如果文件 `bar.ts` 中含有 `import * as foo from '../someFolder/foo'`,那么 `foo` 文件所在的文件夹 `someFolder` 必须与 `bar.ts` 文件所在文件夹在相同的目录下。
- 如果文件 `bar.ts` 中含有 `import * as foo from './foo'`,那么 `foo` 的引用路径必须与 `bar.ts` 文件存在于相同的文件夹下
- 如果文件 `bar.ts` 中含有 `import * as foo from '../foo'`,那么 `foo` 的引用路径必须存在于 `bar.ts` 的上一级目录;
- 如果文件 `bar.ts` 中含有 `import * as foo from '../someFolder/foo'`,那么 `foo` 的引用路径所在的文件夹 `someFolder` 必须与 `bar.ts` 文件所在文件夹在相同的目录下。

你还可以思考一下其他相对路径导入的场景。:smiley:

#### 动态查找

当导入路径不是相对路径时,模块解析将会模仿 [Node 模块解析策略](https://nodejs.org/api/modules.html#modules_all_together),下面我将给出一个简单例子:

- 当你使用 `import * as foo from 'foo'`,将会按如下顺序查找模块
- 当你使用 `import * as foo from 'foo'`,将会按如下顺序查找模块的引用路径
- `./node_modules/foo`
- `../node_modules/foo`
- `../../node_modules/foo`
- 直到系统的根目录
- 当你使用 `import * as foo from 'something/foo'`,将会按照如下顺序查找内容
- 当你使用 `import * as foo from 'something/foo'`,将会按照如下顺序查找模块的引用路径
- `./node_modules/something/foo`
- `../node_modules/something/foo`
- `../../node_modules/something/foo`
- 直到系统的根目录

### 什么是 `place`
### 什么是引用路径 `place`

当我提及被检查的 `place` 时,我想表达的是在这个 `place` 上,TypeScript 将会检查以下内容(例如一个 `foo` 的 `place`):
当我提及 “查找模块的引用路径” 时,我想表达的是对于这个引用路径,TypeScript 将会检查以下内容(例如一个 `foo` 的引用路径):

- 如果这个 `place` 表示一个文件,如:`foo.ts`,欢呼
- 否则,如果这个 `place` 是一个文件夹,并且存在一个文件 `foo/index.ts`,欢呼
- 否则,如果这个 `place` 是一个文件夹,并且存在一个 `foo/package.json` 文件,在该文件中指定 `types` 的文件存在,那么就欢呼
- 否则,如果这个 `place` 是一个文件夹,并且存在一个 `package.json` 文件,在该文件中指定 `main` 的文件存在,那么就欢呼
- 如果这个引用路径是一个文件,如:`foo.ts`,就它了
- 否则,如果这个引用路径是一个文件夹,并且存在一个文件 `foo/index.ts`,就它了
- 否则,如果这个引用路径是一个文件夹,并且存在一个 `foo/package.json` 文件,在该文件中指定 `types` 的文件存在,那就它了
- 否则,如果这个引用路径是一个文件夹,并且存在一个 `package.json` 文件,在该文件中指定 `main` 的文件存在,那就它了

从文件类型上来说,我实际上是指 `.ts`, `.d.ts` 或者 `.js`

Expand Down