path.join vs path.resolve with __dirname

Est*_*ask 116 node.js

是否有区别使用时 path.joinpath.resolve__dirname在Node.js的解决绝对路径?

如果使用它们中的一个是首选(绝对路径分辨率是用例的90%)?

const absolutePath = path.join(__dirname, some, dir);
Run Code Online (Sandbox Code Playgroud)

const absolutePath = path.resolve(__dirname, some, dir);
Run Code Online (Sandbox Code Playgroud)

两种方法都规范化路径.

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

Mik*_*ike 123

是的,功能之间存在差异,但在这种情况下使用它们的方式将产生相同的结果.

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

例如:

path.join('app/libs/oauth', '/../ssl')
Run Code Online (Sandbox Code Playgroud)

解决了 app/libs/ssl

path.resolve另一方面,将解决绝对的道路.

例如,当你运行:

path.resolve('bar', '/foo');
Run Code Online (Sandbox Code Playgroud)

返回的路径将是,/foo因为这是可以构造的第一个绝对路径.

但是,如果你运行:

path.resolve('/bar/bae', '/foo', 'test');
Run Code Online (Sandbox Code Playgroud)

返回的路径将/foo/test再次出现,因为这是可以从右到左形成的第一条绝对路径.

如果未提供指定根目录的路径,则为该resolve函数指定的路径将附加到当前工作目录.所以如果你的工作目录是/home/mark/project/:

path.resolve('test', 'directory', '../back');
Run Code Online (Sandbox Code Playgroud)

解决了

/home/mark/project/test/back

使用__dirname是包含源文件的目录的绝对路径.当您使用path.resolve或者path.join如果您给出相同的路径,它们将返回相同的结果__dirname.在这种情况下,这只是一个偏好问题.

  • Nit:`__dirname`是包含正在执行的源文件的目录的绝对路径,而不是*当前工作目录*.前者总是一样的(除非你移动文件); 后者是[进程范围的参数](https://nodejs.org/docs/latest/api/process.html#process_process_cwd),根据您启动节点的方式以及是否[已更改]而有所不同(https://nodejs.org/docs/latest/api/process.html#process_process_chdir_directory). (17认同)
  • @temporary_user_name 关于“path.resolve”的行为,答案是正确的:“path.resolve”从最右边的参数开始操作,在参数列表中向左移动,并在每个参数的值前面加上一个绝对路径(即一个以根目录“/”或[在 Windows 中特别是]驱动器号)开始构建,然后返回该路径。它忽略“/bar/bae”,因为到那时,它已经有了绝对路径“/foo/test”,因此没有理由进一步。 (4认同)
  • 那么 ```__dirname``` 和 ```path.resolve(__dirname)``` 之间没有区别吗? (2认同)
  • 我不想这么说,但是这个答案对我来说确实没有任何意义,我希望您能澄清一下。您指出“ path.resolve('/ bar / bae','/ foo','test');`本质上会丢弃第一个参数,因为`/ foo / test`是可以从右开始形成的第一个绝对路径左”,但是您没有解释*为什么*,所以我真的不明白工作中的逻辑。我的意思是我对示例中使用的假设目录结构没有任何了解,所以我无法理解为什么`/ bar / bae / foo / test`无效。 (2认同)

sam*_*j90 17

const absolutePath = path.join(__dirname, some, dir);
Run Code Online (Sandbox Code Playgroud)

const absolutePath = path.resolve(__dirname, some, dir);
Run Code Online (Sandbox Code Playgroud)

path.join将串连__dirname这与值级联当前文件的目录名some,并dir与特定平台的分隔符.

在哪里

path.resolve将处理__dirname,some并且dir由左到右,即通过处理它前面加上它.

如果根路径的任何值somedir对应于根路径,则将省略前一路径并通过将其视为根来处理休息

为了更好地理解这个概念,让我更详细地解释如下: -

path.joinpath.resolve是两个不同的方法或通过提供的NodeJS路径模块的功能.

两者都接受路径列表但差异来自结果,即它们如何处理这些路径.

path.join使用特定于平台的分隔符作为分隔符将所有给定路径段连接在一起,然后规范化生成的路径.而path.resolve()过程是从右到左的路径序列,每个后续路径都被预先加上,直到构造出绝对路径.

没有提供参数时

以下示例将帮助您清楚地理解这两个概念: -

我的文件名是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
Run Code Online (Sandbox Code Playgroud)

结果

? node index.js
path.join() :  .
path.resolve() :  E:\MyFolder\Pjtz\node
Run Code Online (Sandbox Code Playgroud)

path.resolve()方法将输出绝对路径作为path.join()返回.表示当前工作目录,如果没有提供任何内容

当一些根路径作为参数传递时

const path=require('path');

console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));
Run Code Online (Sandbox Code Playgroud)

结果我

? node index.js
path.join() :  abc\bcd
path.resolve() :  E:\bcd
Run Code Online (Sandbox Code Playgroud)

path.join()仅将输入列表与特定于平台的分隔符连接,同时path.resolve()处理从右到左的路径序列,每个后续路径前置,直到构造绝对路径.


lon*_*onr 6

来自文档path.resolve

生成的路径被规范化并删除尾部斜杠,除非路径解析为根目录。

path.join一直尾随斜杠

所以

__dirname = '/';
path.resolve(__dirname, 'foo/'); // '/foo'
path.join(__dirname, 'foo/'); // '/foo/'
Run Code Online (Sandbox Code Playgroud)


Abr*_*ham 5

用最简单的话来说:

当您使用时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
Run Code Online (Sandbox Code Playgroud)


使用时join()只需从左到右连接每个参数,无论它们/是否有

path.join("/a", "b", "/c", "d")   simply returns   "\a\b\c\d"
Run Code Online (Sandbox Code Playgroud)