前言
关于TS
的模块解析,通过前面几篇文章,我们了解了TS
模块解析流程,以及了解了TS中的相对和非相对模块导入有什么差异,还有Classic
模块解析策略
为什么突然本文来聊聊Node.js
模块解析过程?
其实是为了讲TS
的另一种模块解析策略做铺垫---Node
模块解析策略
因为Node
模块解析策略就是一种试图在运行时模仿Node.js
模块解析的策略
下面来看本文的主体内容,大概花上一分钟看完
正文
如何解析
我们知道,Node.js
中是使用require
函数导入想要的东西的。
Node.js
如何解析模块,这取决于require
的是相对路径还是非相对路径,它会根据相对或非相对路径作出不同的解析过程
相对路径解析过程
如果是相对路径,例如一个文件路径为 /root/src/moduleA.js
,包含了一个导入var x = require("./moduleB");
则Node.js
会按以下三个步骤解析这个导入:
- 检查
/root/src/moduleB.js
文件是否存在 - 检查
/root/src/moduleB
目录是否包含一个package.json
文件,且package.json
文件指定了一个"main"
模块 - 检查
/root/src/moduleB
目录是否包含一个index.js
文件。 这个文件会被隐式地当作那个文件夹下的"main"模块
非相对路径解析过程
对应非相对路径,Node.js
会在node_modules
里查找。
但是node_modules
可能与当前文件在同级,也有可能在上层目录。原则是Node.js
会向上级目录遍历,查找每个 node_modules
直到它找到要加载的模块
举例:假设/root/src/moduleA.js
里使用的是非相对路径导入var x = require("moduleB");
则Node.js
会按以下步骤解析:
- /root/src/node_modules/moduleB.js
- /root/src/node_modules/moduleB/package.json (如果指定了"main"属性)
- /root/src/node_modules/moduleB/index.js
- /root/node_modules/moduleB.js
- /root/node_modules/moduleB/package.json (如果指定了"main"属性)
- /root/node_modules/moduleB/index.js
- /node_modules/moduleB.js
- /node_modules/moduleB/package.json (如果指定了"main"属性)
- /node_modules/moduleB/index.js
小结
为了方便,我将上文的主要内容汇成一图,如下:
END
有了本文做铺垫,下篇文章我们会讲到TS的另一种模块解析策略:Node
以上就是本文的所有内容,如有问题,欢迎指正~