path.resolve和path.join调用之间的区别?


Answers:


255

这两个函数处理以/不同方式开头的段。join只会将它与前一个参数连接在一起,但是resolve会将其视为根目录,并忽略所有先前的路径-将其视为cd与每个参数一起执行的结果:

path.join('/a', '/b') // Outputs '/a/b'

path.resolve('/a', '/b') // Outputs '/b'

需要注意的另一件事是,path.resolve它将始终导致一个绝对URL,并且将使用您的工作目录作为解析此路径的基础。但是,__dirname无论如何,这都是一条绝对路径,这对您而言并不重要。

至于您应该使用哪一个,答案是:这取决于您希望段开始的/行为-应该将它们简单地连接还是作为新的根?

如果其他参数是经过硬编码的,则实际上并不重要,在这种情况下,您应该考虑(a)此行将来可能如何更改,以及(b)与代码中其他位置的一致性如何。


64
如果您仍然不了解它:path.join('/a', '/b', 'c')将返回/a/b/c,而path.resolve('/a', '/b', 'c')将返回/b/c
totymedli

28
我要说的名称resolve不是最清楚,path.cd([starting dir], [final dir])会更直观。
若奥·皮门特尔·费雷拉

19
think of it as the result of executing cd with each argument让我终于明白了。谢谢
安德烈·佩纳

@JoãoPimentelFerreira,我已经更新了上面的答案,因为您已经提出了一个有效的观点。:)
Rin Minase

所以path.resolve =>以工作目录为路径起点来解析路径?
Webwoman

15

文件系统路径的默认操作因操作系统而异,我们需要一些对其进行抽象的东西。该path模块提供了用于处理文件和目录路径的实用程序或API。您可以使用将其包含在您的项目中

const path = require('path');

path.joinpath.resolve是路径模块的两个不同的方法。

这两种方法都接受一系列路径或路径段。

path.resolve()方法将一系列路径或路径段解析为绝对路径

path.join()方法使用平台特定的分隔符作为分隔符,将所有给定的路径段连接在一起,然后对结果路径进行规范化。

为了更好地理解和区分行为,让我在不同的情况下进行解释。

1.如果我们不提供任何参数或为空字符串

就我而言,我的文件名是index.js,当前工作目录是E:\MyFolder\Pjtz\node

const path = require('path');

console.log("path.join() : ", path.join());
// outputs .
console.log("path.resolve() : ", path.resolve());
// outputs current directory or equalent to __dirname of the node process

并在运行结果如下

λ node index.js
path.join() :  .
path.resolve() :  E:\MyFolder\Pjtz\node

以上实验的推论是该path.resolve()方法将输出绝对路径作为path.join()返回。表示当前工作目录或相对路径(如果未提供任何内容)

2.添加/ path作为任何参数。

const path=require('path');

console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));

结果是

λ node index.js
path.join() :  abc\bcd
path.resolve() :  E:\bcd

我们可以从该实验中找到的推论是,path.join()仅将输入列表与特定于平台的分隔符连接起来,而同时path.resolve()处理从右到左的路径顺序,每个后续路径都被添加到构造绝对路径之前。

path.join()将每个参数与操作系统特定的分隔符连接起来,同时path.resolve()将使用root解析每个参数并产生输出。


path.resolve()不是等同__dirname。第一个返回工作目录,第二个返回当前文件的路径。
Emile Bergeron

@EmileBergeron在我的理解中,它们都是path上的函数。您可以尝试按照以下代码片段来检查我是否都相同。const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname)
samuelj90 '18

仅当正在运行的文件位于当前工作目录中时,它们碰巧是相同的。
Emile Bergeron '18

@EmileBergeron好的,我同意。但是Iam仍然对我指定的位置感到困惑path.resolve() is equivalent to __dirname
samuelj90 '18

1
@EmileBergeron我已经更新了评论,我认为它可以解决混淆问题
samuelj90

13

1)path.resolve创建绝对路径。

该方法从右到左创建绝对路径,直到构造了绝对路径。

例如:

path.resolve('/a', 'b', 'c');     //    C:\a\b\c
path.resolve('/a', '/b', 'c');    //    C:\b\c
path.resolve('/a', '/b', '/c');   //    C:\c

如果未生成绝对路径,则使用当前工作目录的方法:

例如:

path.resolve('a', 'b', 'c');     //    C:\{current_working_directory}\a\b\c

2)path.join连接所有路径并归一化结果

例如:

path.join('/a', '/b', '/c');   //   \a\b\c
path.join('/a', '/b', 'c');    //   \a\b\c
path.join('/a', 'b', 'c');     //   \a\b\c
path.join('a', 'b', 'c');      //   \a\b\c

1
最后一个连接示例path.join('a','b','c')应为a\b\c
spmdc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.