nodejs中的path.json和path.resolve的区别
我们有多少次在 Node.js
项目中遇到过path.join()
和path.resolve()
却没有真正理解它们之间的区别?本文就讲解一下这两者的区别。
重要术语
首先我们先来看看几个术语,便于后续我们掌握这两者的差异。
-
字符串:字符串是一串字符,按字面解释的字符序列,例如
"this is a string"
。如果有多个单词,则必须用引号将它们引起来。 -
路径:路径只是一个字符串,用于标识计算机上文件或目录的位置,例如
"/home/user/Documents/file.ext"
或"/home/user/Downloads/"
。这里使用“文件”一词来指代文件和目录。 -
相对路径:相对路径是一个字符串,用于标识一个文件相对于另一个文件位置的位置。
例如,假设某个用户具有以下目录结构:
如果 Downloads
是当前的工作目录,并且用户想要访问 Documents
目录中的文件,则他必须向上导航一级,然后向下进入 Documents
目录。在 POSIX
兼容系统(Linux
、MacOS
等)上类似cd ../Documents/file.ext
或者在 Windows
上类似 cd ..\Documents\file.ext
。
注意: 如果文件名中存在空格,需要用引号将字符串引起来。尝试执行cd ../Documents/my file.ext
会报错。
-
绝对路径:简单来说,绝对路径是标识文件相对于系统根目录的位置的字符串。例如,用户可以指定
cd /home/user/Documents/file.ext
这样的绝对路径,而不是尝试通过相对路径访问上一示例中的文件。我们可以从任何位置指定绝对路径。 -
路径段:路径段是路径的一部分。例如,我们有
/home
、/user
和/Documents
作为/home/user/Documents/file.ext
的段。 -
__dirname
:这是一个Node.js
环境变量,指定包含当前正在执行的文件的目录的绝对路径。
比如我们在/home/user/Documents/project
文件夹下有一个index.js
文件,里边的内容是:
console.log(__dirname);// 控制台上的预期输出为 /home/user/Documents/project
换句话说,__dirname
只是文件位置的绝对路径的字符串。
在终端/提示符上更改目录
.
和.
/代表当前文件夹目录;
..
和../
代表当前文件夹的上一级;
/
代表根目录
如果我们放在cd
他们面前(cd xxx
),他们就会带我们到想要的位置
path.join() 的作用
path.join()
方法使用平台特定的分隔符作为分隔符将所有给定的 path
段连接在一起,然后规范化结果路径。
语法:
path.join(...paths)
例如,调用path.join("path", "/to", "some", "file")
将会返回path/to/some/file
字符串。
path.resolve() 的作用
path.resolve()
方法将一系列路径或路径段解析为绝对路径。
语法:
path.resolve(...paths)
此方法从右到左处理路径,当找到/
时将其视为系统的根。
调用path.resolve(__dirname, "/path")
将返回/path
,因为第二个参数有一个前导/
,因此将被视为系统的根。
关键区别
path.join()
简单地连接段,其返回可能会也可能不会产生绝对路径。path.resolve()
始终返回绝对路径,使用目标操作系统的根目录作为根目录或使用前导的第一个参数/
作为新的根目录。
怎样选择使用哪个
这取决于我们的工具是否需要绝对路径。需要的话使用path.resolve()
。只需要连接路径段使用path.join()
即可。
path.join()
或path.resolve()
通常会结合__dirname
一起使用,这使得这两种方法都会产生以操作系统的根为根的绝对路径。
同样,调用path.resolve(__dirname, "/path")
没有任何意义,因为__dirname
会被完全忽略,因为第二个参数以/
开头。以下是一个有效的用例:path.resolve(__dirname, 'dist/assets')
。
使用示例
console.log(path.join(__dirname, "path"));
console.log(path.join(__dirname, "/path"));
console.log(path.join(__dirname, "./path"));
console.log(path.join(__dirname, "../path"));console.log(path.resolve(__dirname, "path"));
console.log(path.resolve(__dirname, "/path"));
console.log(path.resolve(__dirname, "./path"));
console.log(path.resolve(__dirname, "../path"));
输出:
// path.join()
/home/user/some/other/segments/path
/home/user/some/other/segments/path
/home/user/some/other/segments/path
/home/user/some/other/path//path.resolve()
/home/user/some/other/segments/path
/path
/home/user/some/other/segments/path
/home/user/some/other/path
如果需要当前执行文件的绝对路径,则可以选择以下任意一项:
console.log(path.join(__dirname, "path"));
console.log(path.join(__dirname, "/path"));
console.log(path.join(__dirname, "./path"));
console.log(path.resolve(__dirname, "path"));
console.log(path.resolve(__dirname, "./path"));