node.js require 方法如何解释相对路径?

How does node.js require method interpret relative paths?

我无法理解节点的 require 方法如何解析相对路径。

假设我有这样的文件结构:

root
|--- main.js
|
|--- importantUtilities.js
|
|--- apps
     |
     |--- app1.js

如果 /root/main.js/root/apps/app1.js 都需要 /root/importantUtilities.js,它们对 require 函数的参数化不同:

// File: /root/main.js

...
require('./importantUtilities.js');
...

// File: /root/apps/app1.js:

...
require('../importantUtilities.js');
...

不需要在前面添加 __dirname,如果没有这条信息,我看不出 require 是如何工作的。

如何require实现不同文件描述符的return同一个文件?

编辑:以下示例有效的事实也让我大吃一惊(使用相同的文件结构):

// File: /root/main.js:

...
module.exports.getUtilities = function() { return require('./importantUtilities.js'); };
var utilities = module.exports.getUtilities(); // Works fine
...

// File: /root/apps/app1.js:

...
var main = require('../main.js');
var utilities = main.getUtilities(); // Works fine
...

似乎 require 甚至没有从调用范围确定基本路径;更重要的是,源代码中每次出现的 require 都与源代码的文件路径信息绑定在一起。这是正确的吗?

这是如何工作的?

every occurrence of require in the source code is bound with the source code's filepath information

是的,完全正确。更精确,根据 docs:

require(X) from module at path Y

  1. If X begins with './' or '/' or '../'

    a. LOAD_AS_FILE(Y + X)

即它将当前文件的路径与 required.

的路径连接起来