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

path.join(__dirname, 'app')

vs.

path.resolve(__dirname, 'app')

应该优先选择哪一种?


当前回答

用最简单的术语来说:


Path.resolve()只执行以下操作

从左到右-

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

以谢尔盖为例

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"

其他回答

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

const path = require('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()将使用根解析每个参数并产生输出。

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

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

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

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

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

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

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()只执行以下操作

从左到右-

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

以谢尔盖为例

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"