nodejs中的path.json和path.resolve的区别

nodejs中的path.json和path.resolve的区别

我们有多少次在 Node.js 项目中遇到过path.join()path.resolve()却没有真正理解它们之间的区别?本文就讲解一下这两者的区别。

重要术语

首先我们先来看看几个术语,便于后续我们掌握这两者的差异。

  1. 字符串:字符串是一串字符,按字面解释的字符序列,例如 "this is a string"。如果有多个单词,则必须用引号将它们引起来。

  2. 路径:路径只是一个字符串,用于标识计算机上文件或目录的位置,例如"/home/user/Documents/file.ext""/home/user/Downloads/"。这里使用“文件”一词来指代文件和目录。

  3. 相对路径:相对路径是一个字符串,用于标识一个文件相对于另一个文件位置的位置。
    例如,假设某个用户具有以下目录结构:
    nodejs中的path.json和path.resolve的区别_第1张图片

如果 Downloads 是当前的工作目录,并且用户想要访问 Documents 目录中的文件,则他必须向上导航一级,然后向下进入 Documents 目录。在 POSIX 兼容系统(LinuxMacOS 等)上类似cd ../Documents/file.ext 或者在 Windows 上类似 cd ..\Documents\file.ext

注意: 如果文件名中存在空格,需要用引号将字符串引起来。尝试执行cd ../Documents/my file.ext会报错。

  1. 绝对路径:简单来说,绝对路径是标识文件相对于系统根目录的位置的字符串。例如,用户可以指定 cd /home/user/Documents/file.ext 这样的绝对路径,而不是尝试通过相对路径访问上一示例中的文件。我们可以从任何位置指定绝对路径。

  2. 路径段:路径段是路径的一部分。例如,我们有/home/user/Documents作为 /home/user/Documents/file.ext 的段。

  3. __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"));

你可能感兴趣的:(node,javascript)