一分钟了解Node.js的模块解析过程

「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

前言

关于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会按以下三个步骤解析这个导入:

  1. 检查/root/src/moduleB.js文件是否存在
  2. 检查/root/src/moduleB目录是否包含一个package.json文件,且package.json文件指定了一个"main"模块
  3. 检查/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会按以下步骤解析:

  1. /root/src/node_modules/moduleB.js
  2. /root/src/node_modules/moduleB/package.json (如果指定了"main"属性)
  3. /root/src/node_modules/moduleB/index.js
  4. /root/node_modules/moduleB.js
  5. /root/node_modules/moduleB/package.json (如果指定了"main"属性)
  6. /root/node_modules/moduleB/index.js
  7. /node_modules/moduleB.js
  8. /node_modules/moduleB/package.json (如果指定了"main"属性)
  9. /node_modules/moduleB/index.js

小结

为了方便,我将上文的主要内容汇成一图,如下:

image.png

END

有了本文做铺垫,下篇文章我们会讲到TS的另一种模块解析策略:Node

以上就是本文的所有内容,如有问题,欢迎指正~

おすすめ

転載: juejin.im/post/7034349997525204999