在 Node.js 中同时使用 path.join
和 path.resolve
与 __dirname
解析绝对路径时有区别吗?
当这样使用时,是否应该首选其中一个(绝对路径分辨率是用例的 90%(?
即
const absolutePath = path.join(__dirname, some, dir);
与。
const absolutePath = path.resolve(__dirname, some, dir);
这两种方法都规范化路径。
是的,函数之间存在差异,但在这种情况下使用它们的方式将导致相同的结果。
path.join
通过将两个路径合并在一起来返回规范化路径。它可以返回绝对路径,但不一定总是这样做。
例如:
path.join('app/libs/oauth', '/../ssl')
决心app/libs/ssl
另一方面,path.resolve
将解析为绝对路径。
例如,当您运行:
path.resolve('bar', '/foo');
返回的路径将被/foo
,因为这是可以构造的第一个绝对路径。
但是,如果运行:
path.resolve('/bar/bae', '/foo', 'test');
返回的路径将再次/foo/test
,因为这是可以从右到左形成的第一个绝对路径。
如果未提供指定根目录的路径,则提供给 resolve
函数的路径将追加到当前工作目录。因此,如果您的工作目录/home/mark/project/
:
path.resolve('test', 'directory', '../back');
解析为
/home/mark/project/test/back
使用 __dirname
是包含源文件的目录的绝对路径。当您使用 path.resolve
或 path.join
时,如果您在 __dirname
之后给出相同的路径,它们将返回相同的结果。在这种情况下,这实际上只是一个偏好问题。
const absolutePath = path.join(__dirname, some, dir);
与。
const absolutePath = path.resolve(__dirname, some, dir);
path.join
将连接__dirname
这是当前文件的目录名称,与 some
的值连接,并使用特定于平台的分隔符连接dir
。
而
path.resolve
将处理__dirname
,some
和dir
即从右到左通过处理它来预置它。
如果 some
或 dir
的任何值对应于根路径,则将省略前一个路径,并通过将其视为根来进程休息
为了更好地理解这个概念,让我更详细地解释一下,如下所示:
path.join
和 path.resolve
是 nodejs 提供的路径模块的两种不同的方法或功能。
两者都接受路径列表,但差异在于结果,即它们如何处理这些路径。
path.join
使用特定于平台的分隔符作为分隔符将所有给定的路径段连接在一起,然后规范化生成的路径。而path.resolve()
从右到左处理路径序列,每个后续路径都预先置到构建绝对路径。
未提供参数时
以下示例将帮助您清楚地理解这两个概念:-
我的文件名是index.js
,当前工作目录是E:MyFolderPjtznode
const path = require('path');
console.log("path.join() : ", path.join());
// outputs .
console.log("path.resolve() : ", path.resolve());
// outputs current directory or equivalent to __dirname
结果
λ node index.js
path.join() : .
path.resolve() : E:MyFolderPjtznode
path.resolve()
方法将输出绝对路径,而path.join()
返回 . 表示当前工作目录(如果未提供任何内容(
当某些根路径作为参数传递时
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() : abcbcd
path.resolve() : E:bcd
path.join()
仅使用特定于平台的分隔符连接输入列表,而path.resolve()
处理从右到左的路径序列,每个后续路径都预先附加,直到构造绝对路径。
来自path.resolve
的文档:
除非将路径解析为根目录,否则将规范化生成的路径并删除尾部斜杠。
但path.join
一直尾随斜杠
所以
__dirname = '/';
path.resolve(__dirname, 'foo/'); // '/foo'
path.join(__dirname, 'foo/'); // '/foo/'
用最简单的术语来说:
当您使用path.resolve()
时,它会执行以下操作
from left to right-
- 将
- 最右侧的参数与
/
直接与根路径连接起来,形成绝对路径(查看示例( - 然后连接任何不
/
作为目录的内容
例如
path.resolve('/a', 'b', 'c'); returns C:abc
path.resolve('/a', '/b', 'c'); returns C:bc
path.resolve('/a', '/b', '/c'); returns C:c
使用 join()
只是从左到右连接每个参数,无论它们是否具有/
path.join("/a", "b", "/c", "d") simply returns "abcd"