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

以下调用有区别吗?

path.join(__dirname, 'app') 

 path.resolve(__dirname, 'app') 

哪一个应该是首选?

这两个函数处理起始于/以不同方式的段。 join只是将它与前一个参数连接起来,然而resolve会把它当作根目录,而忽略所有以前的path – 把它看作是每个参数都执行cd的结果:

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

另外要注意的是, path.resolve总是会产生一个绝对的URL,并将使用你的工作目录作为基础来解决这个问题。 但是,因为__dirname是一个绝对path无论如何这不__dirname你的情况。

至于哪一个你应该使用,答案是:这取决于你想要段开始/行为 – 他们应该简单地join,或者他们应该作为新的根?

如果其他论证是硬编码的,那么这个问题并不重要,在这种情况下,你可能应该考虑(a)这条线将来如何变化,以及(b)与代码中其他地方的一致性如何。


正如在评论中指出的,这个答案是不正确的。 请参阅下面的NeonPaul的答案或这个答案类似的问题 。 对不起,以前不知道。


path.join()几乎只是连接你传递给它的参数(使用正确的分隔符,通常是正斜杠),而path.resolve()返回path,就像你按顺序导航到目录(并parsing实际文件/目录的位置)。

例如:

 path.join("a", "b1", "..", "b2") === "a/b1/../b2" 

 path.resolve("a", "b1", "..", "b2") === "a/b2" 

在某些情况下,这两个函数将返回相同的值。 我不知道任何性能差异,但我会认为path.join会快一点。

文件系统path的默认操作根据操作系统的不同而不同,所以我们需要一些抽象的东西。 path模块提供了用于处理文件和目录path的实用程序或API。 你可以使用它包含在你的项目中

 const path = require('path'); 

path.joinpath.resolve是path模块的两种不同的方法。

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

path.resolve()方法将一系列path或path段parsing为绝对path

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

为了更好地理解和区分行为,让我用不同的场景来解释它。

1.如果我们不提供任何参数或空string

在我的情况下,我的文件名是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 

从上面的经验推断是tha path.resolve()方法将输出path.join()返回的绝对path 代表当前工作目录或相对path(如果没有提供)

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()只将input列表和平台特定的分隔符连接在一起,而path.resolve()则从右向左处理path序列,每个后续的path都被前置直到一个绝对path被构造。

path.join()将每个参数连接到特定于操作系统的分隔符,而path.resolve()将使用根parsing每个参数并生成输出。

1)path.resolve创build绝对path。

该方法创build从右到左的绝对path,直到构build绝对path。

例如:

 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,则使用当前工作目录的方法:

例如:

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

2)path.joinjoin所有path并对结果进行归一化

例如:

 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