This commit is contained in:
zhongsp 2018-03-06 15:02:29 +08:00
parent 497b9a80af
commit 76010c8ff1

View File

@ -1,18 +1,18 @@
> 这节假设你已经了解了模块的一些基本知识
请阅读[模块](./Modules.md)文档了解更多信息。
*模块解析*就是指编译器所要依据的一个流程,用它来找出某个导入操作所引用的具体值
*模块解析*是指编译器在查找导入模块内容时所遵循的流程
假设有一个导入语句`import { a } from "moduleA"`;
为了去检查任何对`a`的使用,编译器需要准确的知道它表示什么,并且需要检查它的定义`moduleA`。
为了去检查任何对`a`的使用,编译器需要准确的知道它表示什么,并且需要检查它的定义`moduleA`。
这时候,编译器会想知道“`moduleA`的shape是怎样的?”
这听上去很简单,`moduleA`可能在你写的某个`.ts`/`.tsx`文件里或者在你的代码所依赖的`.d.ts`里。
这时候,编译器会有个疑问“`moduleA`的结构是怎样的?”
这听上去很简单,`moduleA`可能在你写的某个`.ts`/`.tsx`文件里或者在你的代码所依赖的`.d.ts`里。
首先,编译器会尝试定位表示导入模块的文件。
编译会遵循下二种策略之一:[Classic](#classic)或[Node](#node)。
编译会遵循下二种策略之一:[Classic](#classic)或[Node](#node)。
这些策略会告诉编译器到*哪里*去查找`moduleA`。
如果它们失败了并且如果模块名是非相对的(且是在`"moduleA"`的情况下),编译器会尝试定位一个[外部模块声明](./Modules.md#ambient-modules)。
如果上面的解析失败了并且模块名是非相对的(且是在`"moduleA"`的情况下),编译器会尝试定位一个[外部模块声明](./Modules.md#ambient-modules)。
我们接下来会讲到非相对导入。
最后,如果编译器还是不能解析这个模块,它会记录一个错误。
@ -35,22 +35,22 @@
* `import * as $ from "jQuery";`
* `import { Component } from "@angular/core";`
相对导入解析时是相对于导入它的文件来的,并且*不能*解析为一个外部模块声明。
相对导入解析时是相对于导入它的文件,并且*不能*解析为一个外部模块声明。
你应该为你自己写的模块使用相对导入,这样能确保它们在运行时的相对位置。
非相对模块的导入可以相对于`baseUrl`或通过下文会讲到的路径映射来进行解析。
它们还可以被解析[外部模块声明](./Modules.md#ambient-modules)。
它们还可以被解析[外部模块声明](./Modules.md#ambient-modules)。
使用非相对路径来导入你的外部依赖。
## 模块解析策略
共有两种可用的模块解析策略:[Node](#node)和[Classic](#classic)。
你可以使用`--moduleResolution`标记指定使用哪种模块解析策略。
你可以使用`--moduleResolution`标记指定使用哪种模块解析策略。
若未指定,那么在使用了`--module AMD | System | ES2015`时的默认值为[Classic](#classic),其它情况时则为[Node](#node)。
### Classic
这种策略以前是TypeScript默认的解析策略。
这种策略以前是TypeScript默认的解析策略。
现在,它存在的理由主要是为了向后兼容。
相对导入的模块是相对于导入它的文件进行解析的。