路径之间的区别是什么?Resolve和path.join?

下面的调用之间有什么区别吗?

path.join(__dirname, 'app')

vs。

path.resolve(__dirname, 'app')

应该优先选择哪一种?

153083 次浏览

这两个函数以非常不同的方式处理以/开头的段;join只会将其与前一个参数连接起来,然而resolve会将其视为根目录,并忽略所有之前的路径——将其视为对每个参数执行cd的结果:

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


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

另一件需要注意的事情是path.resolve将总是产生一个绝对URL,并将使用你的工作目录作为解析此路径的基目录。但由于__dirname是一个绝对路径,在你的情况下这并不重要。

至于你应该使用哪一个,答案是:这取决于你想要/开始的段如何表现——它们应该简单地连接还是应该作为新的根?

如果其他参数是硬编码的,这真的没关系,在这种情况下,你可能应该考虑(a)这一行在未来可能会如何改变,(b)它与代码中的其他地方是否一致。

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

将它包含在你的项目中
const path = require('path');

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

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

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解析每个参数并产生输出。

1)路径。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)路径。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

编辑:上面@spmdc建议的更新示例

用最简单的术语来说:


path.resolve()只做以下事情

from left to right-

  • 将最右边的参数与/直接连接到根路径,以形成一个绝对路径(检查示例)
  • 然后连接任何没有/的目录

以谢尔盖为例

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

join简单地从左到右连接每个参数,不管它们是否有/

path.join("/a", "b", "/c", "d")   simply returns   "\a\b\c\d"