require模块文件查找路径顺序

英文文档:https://nodejs.org/api/modules.html#all-together

require基础语法

node.js 中使用require方法导入模块,语法:require(id);
参数id:module name or path(模块名或者路径)

使用模块名时

既然是模块名,就决定了id是一个字符串,不能带有绝对路径或者相对路径。
例如:require(‘aaa’)

node.js中有对应的内置模块

此时,require方法直接对应的内置模块

node.js中 没有 对应的内置模块

此时,node.js会从当前目录(也就是写require(‘aaa’)这行代码的文件所在的目录)查找node_modules目录,看有没有对应的模块。如果没有,就到上级目录找node_modules目录。就这样一直找到根目录的node_modules目录。
如果直到根目录也没有找到,就会去全局查找这个模块
这里的全局包含几处目录:

  1. 如若你的电脑中设置了系统环境变量NODE_PATH,则会在这个目录下查找模块,注意是直接查找模块,不是再找node_modules。如果没有这个环境变量,就跳过这一步。
  2. 查找$HOME/.node_modules
  3. 查找$HOME/.node_libraries
  4. 查找$PREFIX/lib/node
    注释:其中 $HOME 是用户的主目录, $PREFIX 是 Node.js 里配置的 node_prefix
    在stackoverflow上有一段关于搜索路径的描述如下:
Path specified in the NODE_PATH environment variable.

Note: NODE_PATH environment variable is set to a colon-delimited list of absolute paths.

Current node_modules folder. (local)

$HOME/.node_modules (global)

Note: $HOME is the user's home directory.

$HOME/.node_libraries (global)
$PREFIX/lib/node (global)

Note: $PREFIX is Node.js's configured node_prefix.

To check the current value of node_prefix, run:

node -p process.config.variables.node_prefix
Note: Prefix corresponds to --prefix param during build and it's relative to process.execPath. Not to confuse with value from the npm config get prefix command

nodejs提供了两个方法可以查看相关信息
require.resolve方法:返回一个字符串,表示模块真实所在的路径
require.resolve.paths方法:返回一个数组,数组中的每一项是将会进行搜的路径,并按照顺序排列
效果截图:
在这里插入图片描述
我在测试的时候发现了一个问题:require.resolve.paths输出的数组最后一项,理论上来说应该是$PRIFIX\lib\node。但我在命令行执行:node -p process.config.variables.node_prefix时显示的是/usr/local,执行:node -p process.execPath显示的是C:\Program Files\nodejs\node.exe
不知道是怎么组合出截图中的最后一项的。但是花费接近一天时间查找关于$PREFIX的资料也没有更多发现。暂时记录问题在此。

使用路径时

例如:
相对路径之当前目录:./xxx/xxx.js 或 ./xxx/xxx。
相对路径之上级目录:…/xxx/xxx.js 或 …/xxx/xxx。
绝对路径::/xxx/xxx.js 或 /xxx/xxx.js 或 /xxx/xxx。

带有文件后缀

直接结合当前目录组合出绝对文件地址,如果找不到对应文件,就抛出错误。如果找到文件,会根据文件扩展名的格式加载文件。

不带文件后缀

会依次查找xxx.js xxx.json xxx.node文件
If X.js is a file, load X.js as JavaScript text. STOP
If X.json is a file, parse X.json to a JavaScript Object. STOP
If X.node is a file, load X.node as binary addon. STOP
如果没有这些文件,就找对应的文件夹,如果没有同名文件夹,就报错。如果有就进入文件夹去找。
LOAD_AS_DIRECTORY(X)

  1. If X/package.json is a file,
    a. Parse X/package.json, and look for “main” field.
    b. If “main” is a falsy value, GOTO 2.
    c. let M = X + (json main field)
    d. LOAD_AS_FILE(M)
    e. LOAD_INDEX(M)
    f. LOAD_INDEX(X) DEPRECATED
    g. THROW “not found”
  2. LOAD_INDEX(X)

LOAD_INDEX(X)

  1. If X/index.js is a file, load X/index.js as JavaScript text. STOP
  2. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP
  3. If X/index.node is a file, load X/index.node as binary addon. STOP
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值