Node.js 什么';path.resolve和path.join之间的区别是什么?

Node.js 什么';path.resolve和path.join之间的区别是什么?,node.js,Node.js,以下调用之间有什么区别吗 path.join(__dirname, 'app') vs 哪一个应该是首选的?这两个函数以非常不同的方式处理以/开头的段join只会将其与上一个参数连接起来,但是resolve会将其视为根目录,并忽略所有以前的路径-将其视为对每个参数执行cd的结果: path.join('/a', '/b') // Outputs '/a/b' path.resolve('/a', '/b') // Outputs '/b' 另一件需要注意的事情是,path.resolve将

以下调用之间有什么区别吗

path.join(__dirname, 'app')
vs


哪一个应该是首选的?

这两个函数以非常不同的方式处理以
/
开头的段
join
只会将其与上一个参数连接起来,但是
resolve
会将其视为根目录,并忽略所有以前的路径-将其视为对每个参数执行
cd
的结果:

path.join('/a', '/b') // Outputs '/a/b'

path.resolve('/a', '/b') // Outputs '/b'
另一件需要注意的事情是,
path.resolve
将始终生成一个绝对URL,并将使用您的工作目录作为解析此路径的基础。但由于
\uuu dirname
是一条绝对路径,无论如何,这在您的情况下并不重要

至于您应该使用哪一个,答案是:这取决于您希望以
/
开头的段的行为-它们应该简单地连接起来还是作为新根


如果其他参数都是硬编码的,这并不重要,在这种情况下,你应该考虑(a)这条线将来可能如何变化,以及(b)它与代码中其他地方的一致性。

< P>文件系统路径的默认操作根据操作系统而不同,我们需要一些抽象的操作。
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。添加/路径作为任何参数。

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()

const path=require('path');

console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));
该方法从右向左创建绝对路径,直到构建绝对路径为止

例如:

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
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('/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
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
2)path.join连接所有路径,并规范化结果

例如:

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
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()
只执行以下操作

从左到右-

  • 将带有
    /
    的最右边的参数直接与根路径连接,以形成绝对路径(检查示例)
  • 然后将没有
    /
    的任何内容连接为目录
以谢尔盖为例

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"

如果您仍然没有得到它:
path.join('/a','/b',c')
将返回
/a/b/c
,而
path.resolve('/a','/b',c')
将返回
/b/c
resolve
的名称不是最清楚的,
path.cd([starting dir],[final dir])
会更加直观。
认为它是每个参数执行cd的结果
使我最终理解了它。Thanks@JoãoPimentelFerreira,我已经更新了上面的答案,因为你提出了一个有效的观点:因此path.resolve=>将工作目录作为路径起点来解析路径?
path.resolve()
\uu dirname
不等效。第一个返回工作目录,第二个返回当前文件的路径。@EmileBergeron在我看来,它们都是路径上的函数。我认为,你们可以尝试下面的代码片段来检查两者是否相同<代码>常量路径=要求('path');console.log(path.resolve())console.log(\uu dirname)console.log(path.resolve()==\uu dirname)
只有当正在运行的文件在当前工作目录中时,它们才碰巧是相同的。@emilebergron我同意。但是我仍然不清楚我在哪里指定了
path.resolve()相当于uuu dirname
@emilebergron我已经更新了注释,我认为这将解决混淆问题。这个问题在最后一个连接示例
路径上。连接('a','b','c')
应该导致
a\b\c