path.resolve和path.join调用之间的区别?
以下调用有区别吗?
path.join(__dirname, 'app')
与
path.resolve(__dirname, 'app')
哪一个应该是首选?
这两个函数处理起始于/
以不同方式的段。 join
只是将它与前一个参数连接起来,然而resolve
会把它当作根目录,而忽略所有以前的path – 把它看作是每个参数都执行cd
的结果:
path.join('/a', '/b') // Outputs '/a/b' path.resolve('/a', '/b') // Outputs '/b'
另外要注意的是, path.resolve
总是会产生一个绝对的URL,并将使用你的工作目录作为基础来解决这个问题。 但是,因为__dirname
是一个绝对path无论如何这不__dirname
你的情况。
至于哪一个你应该使用,答案是:这取决于你想要段开始/
行为 – 他们应该简单地join,或者他们应该作为新的根?
如果其他论证是硬编码的,那么这个问题并不重要,在这种情况下,你可能应该考虑(a)这条线将来如何变化,以及(b)与代码中其他地方的一致性如何。
正如在评论中指出的,这个答案是不正确的。 请参阅下面的NeonPaul的答案或这个答案类似的问题 。 对不起,以前不知道。
path.join()
几乎只是连接你传递给它的参数(使用正确的分隔符,通常是正斜杠),而path.resolve()
返回path,就像你按顺序导航到目录(并parsing实际文件/目录的位置)。
例如:
path.join("a", "b1", "..", "b2") === "a/b1/../b2"
但
path.resolve("a", "b1", "..", "b2") === "a/b2"
在某些情况下,这两个函数将返回相同的值。 我不知道任何性能差异,但我会认为path.join
会快一点。
文件系统path的默认操作根据操作系统的不同而不同,所以我们需要一些抽象的东西。 path
模块提供了用于处理文件和目录path的实用程序或API。 你可以使用它包含在你的项目中
const path = require('path');
path.join
和path.resolve
是path模块的两种不同的方法。
这两种方法都接受一系列path或path段。
path.resolve()
方法将一系列path或path段parsing为绝对path 。
path.join()
方法使用特定于平台的分隔符作为分隔符将所有给定的path段连接在一起,然后规范化结果path。
为了更好地理解和区分行为,让我用不同的场景来解释它。
1.如果我们不提供任何参数或空string
在我的情况下,我的文件名是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
并在运行结果如下
λ node index.js path.join() : . path.resolve() : E:\MyFolder\Pjtz\node
从上面的经验推断是tha path.resolve()
方法将输出path.join()
返回的绝对path 。 代表当前工作目录或相对path(如果没有提供)
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()
只将input列表和平台特定的分隔符连接在一起,而path.resolve()
则从右向左处理path序列,每个后续的path都被前置直到一个绝对path被构造。
path.join()
将每个参数连接到特定于操作系统的分隔符,而path.resolve()
将使用根parsing每个参数并生成输出。
1)path.resolve创build绝对path。
该方法创build从右到左的绝对path,直到构build绝对path。
例如:
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,则使用当前工作目录的方法:
例如:
path.resolve('a', 'b', 'c'); // C:\{current_working_directory}\a\b\c
2)path.joinjoin所有path并对结果进行归一化
例如:
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