【发布时间】:2016-05-05 01:45:06
【问题描述】:
以下调用之间有什么区别吗?
path.join(__dirname, 'app')
对比
path.resolve(__dirname, 'app')
应该首选哪一个?
【问题讨论】:
-
这个问题是 being discussed 在 meta
标签: node.js
以下调用之间有什么区别吗?
path.join(__dirname, 'app')
对比
path.resolve(__dirname, 'app')
应该首选哪一个?
【问题讨论】:
标签: node.js
这两个函数以非常不同的方式处理以/ 开头的段; join 只会将它与前一个参数连接起来,但是 resolve 会将其视为根目录,并忽略所有以前的路径 - 将其视为对每个参数执行 cd 的结果:
path.join('/a', '/b') // Outputs '/a/b'
path.resolve('/a', '/b') // Outputs '/b'
要注意的另一件事是path.resolve 将始终生成一个绝对 URL,并将使用您的工作目录作为解析此路径的基础。但是因为__dirname 无论如何都是绝对路径,所以这对你来说并不重要。
至于你应该使用哪一个,答案是:这取决于你希望以/ 开头的段的行为方式——它们应该被简单地加入还是应该充当新的根?
如果其他参数是硬编码的,那真的没关系,在这种情况下,您可能应该考虑 (a) 该行将来可能会如何变化,以及 (b) 它与代码中其他地方的一致性如何。
【讨论】:
path.join('/a', '/b', 'c') 将返回/a/b/c,而path.resolve('/a', '/b', 'c') 将返回/b/c。
resolve的名字不是最清楚的,path.cd([starting dir], [final dir])会更直观。
think of it as the result of executing cd with each argument 让我终于明白了。谢谢
文件系统路径的默认操作因操作系统而异,我们需要一些对其进行抽象的东西。
path 模块提供用于处理文件和目录的实用程序或 API
路径。
您可以使用
const path = require('path');
path.join 和path.resolve 是路径模块的两种不同方法。
这两种方法都接受一系列路径或路径段。
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() 将使用 root 解析每个参数并产生输出。
【讨论】:
path.resolve() 与__dirname不等效。第一个返回工作目录,第二个是当前文件的路径。
const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname)
path.resolve() is equivalent to __dirname
1) path.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) path.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
【讨论】:
path.join('a','b','c') 应该导致 a\b\c。
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
而join 只是从左到右连接每个参数,无论它们是否具有/
path.join("/a", "b", "/c", "d") simply returns "\a\b\c\d"
【讨论】: