Node 文件查找优先级及 Require 方法文件查找策略
在 Node.js 中,当我们使用 require
方法加载模块时,Node.js 会按照一定的文件查找策略来查找相应的模块文件。掌握这些策略对于理解 Node.js 模块化机制非常重要。
文件查找优先级
在加载模块时,Node.js 会按照以下顺序查找模块文件:
-
核心模块:如果你加载的是一个 Node.js 内置的核心模块(比如
fs
、http
等),Node.js 将会优先查找该模块。由于这些模块已经被编译到 Node.js 中了,所以它们的加载速度很快,并且不需要进行文件系统 I/O 操作。 -
文件模块:当我们加载的是一个文件模块时,Node.js 会先查找缓存中是否已经加载过该模块,如果找到了直接返回缓存中的模块对象;否则,它会按照以下规则去查找并加载模块(这里的文件指的是 js、json 和 node 文件):
-
首先,Node.js 会查找是否有与该模块名称完全匹配且扩展名为
.js
、.json
或.node
的文件。例如,如果需要加载的模块名为foo
,则 Node.js 会查找是否存在foo.js
、foo.json
或foo.node
文件。 -
如果第一步找不到对应的文件,则 Node.js 会进入下一个寻找模块的阶段,即查找同名文件夹中的
index.js
、index.json
或index.node
文件。例如,如果需要加载的模块名为foo
,则 Node.js 会查找是否存在名为foo
的文件夹中是否存在index.js
、index.json
或index.node
文件。 -
如果第二步还是找不到对应的文件,则 Node.js 会将模块名解析为绝对路径,然后查找该路径下是否存在与模块名完全匹配且扩展名为
.js
、.json
或.node
的文件。 -
最后,如果以上三个步骤都没有找到对应的文件,则 Node.js 将抛出
MODULE_NOT_FOUND
错误。
Require 方法文件查找策略
在 Node.js 中使用 require
方法加载模块时,Node.js 会按照上述文件查找顺序查找相应的模块文件,并返回该模块的导出对象。下面是使用 require
方法加载模块的示例。
const foo = require("foo"); // 加载模块 foo
console.log(foo);
在上述示例中,Node.js 会按照文件查找优先级去查找模块 foo,并执行该模块中的代码,并将导出的对象赋值给变量 foo。如果 Node.js 无法找到模块 foo,则会抛出 MODULE_NOT_FOUND
错误。
下面是另一个使用 require
方法加载模块的示例,该模块为一个文件夹模块。
const bar = require("bar"); // 加载模块 bar(文件夹模块)
console.log(bar);
当我们使用 require
方法加载 bar
模块时,Node.js 会按照文件查找优先级首先查找是否有与 bar.js
、bar.json
或 bar.node
文件名完全匹配的文件,因为 bar
模块实际上是一个文件夹,并没有与之匹配的文件,因此 Node.js 会进入第二个查找阶段,即查找文件夹中是否存在 index.js
、index.json
或 index.node
文件。如果存在,则 Node.js 会执行该文件中的代码,并将导出的对象赋值给变量 bar
。如果 index
文件不存在,则 Node.js 会抛出 MODULE_NOT_FOUND
错误。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node 文件查找优先级及 Require 方法文件查找策略 - Python技术站