path.join与path.resolve和__dirname

同时使用path.joinpath.resolve以及__dirnameparsingNode.js中的绝对path时是否有区别?

如果像这样使用其中的一个(绝对path分辨率是90%的用例)?

 const absolutePath = path.join(__dirname, some, dir); 

 const absolutePath = path.resolve(__dirname, some, dir); 

两种方法都规范化path。

这不是这个问题的重复,因为接受的答案是错误的。

是的,这些function之间是有区别的,但是在这种情况下如何使用它们将导致相同的结果。

path.join通过将两个path合并在一起path.join返回一个规范化的path。 它可以返回一个绝对path,但不一定总是这样做。

例如:

 path.join('app/libs/oauth', '/../ssl') 

parsing为app/libs/ssl

另一方面, path.resolve将parsing为绝对path。

例如,当你运行:

 path.resolve('bar', '/foo'); 

返回的path将是/foo因为这是可以构build的第一个绝对path。

但是,如果您运行:

 path.resolve('/bar/bae', '/foo', 'test'); 

返回的path将会是/foo/test ,因为这是从右到左形成的第一个绝对path。

如果您没有提供指定根目录的path,则赋予resolve函数的path将附加到当前工作目录。 所以如果你的工作目录是/home/mark/project/

 path.resolve('test', 'directory', '../back'); 

解决

/home/mark/project/test/back

使用__dirname给出了当前工作目录的绝对path。 当您使用path.resolvepath.join ,如果在__dirname提供相同的path,它们将返回相同的结果。 在这种情况下,这实际上只是一个偏好问题。

 const absolutePath = path.join(__dirname, some, dir); 

 const absolutePath = path.resolve(__dirname, some, dir); 

path.join将连接__dirname,它是当前文件与somedir值连接的目录名称与特定于平台的分隔符

在哪里

path.resolve将处理__dirnamesomedir即从左到右,通过处理它。

如果somedir任何值对应于一个根path,那么之前的path将被省略,并且通过将其视为根

为了更好地理解概念,让我解释一下两点细节如下:

path.joinpath.resolve是nodejs提供的path模块的两种不同的方法或function。

在哪里都接受一个path列表,但差异在于结果,即他们如何处理这些path。

path.join使用特定于平台的分隔符作为分隔符将所有给定的path段连接在一起,然后规范化结果path。 而path.resolve()则从右向左处理path序列,每个后续path都被预置,直到构build绝对path。

当没有参数提供

下面的例子将帮助你清楚地理解这两个概念:

我的文件名是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 

结果

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

path.resolve()方法将输出path.join()返回的绝对path。 代表当前的工作目录,如果没有提供

当一些根path作为parameter passing时

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

结果i

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

path.join()仅将input列表与平台特定的分隔符连接在一起,而path.resolve()则从右向左处理path序列,每个后续path都被预置,直到构build绝对path。