以下调用之间是否存在一些差异?
path.join(__dirname, 'app')
VS
path.resolve(__dirname, 'app')
哪一个应该首选?
答案 0 :(得分:190)
这两个函数以非常不同的方式处理以/
开头的段; join
只会将它与前一个参数连接起来,但resolve
会将其视为根目录,并忽略所有先前的路径 - 将其视为每个参数执行cd
的结果:
path.join('/a', '/b') // Outputs '/a/b'
path.resolve('/a', '/b') // Outputs '/b'
需要注意的另一点是path.resolve
将始终生成绝对URL,并将使用您的工作目录作为基础来解析此路径。但是,因为__dirname
是一个绝对的路径,这在你的情况下并不重要。
至于你应该使用哪一个,答案是:这取决于你想要从/
开始的段如何表现 - 如果它们只是简单地加入,还是它们应该作为新根?
如果其他参数是硬编码的,那么它确实无关紧要,在这种情况下你应该考虑(a)这条线在将来如何变化,以及(b)它与代码中其他位置的一致性。 / p>
答案 1 :(得分:10)
文件系统路径的默认操作因操作系统而异,我们需要一些抽象它的东西。
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()
将每个参数与OS特定的分隔符连接,而path.resolve()
将使用root解析每个参数并生成输出。
答案 2 :(得分:7)
1)path.resolve创建绝对路径。
该方法从右到左创建absoulte路径 ,直到构造绝对路径。
例如:
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
答案 3 :(得分:4)
简单来说:
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"