path.join vs path.resolve with __dirname

时间:2016-08-23 21:16:09

标签: node.js

使用 <head> <!-- OWLSLIDER STYLESHEETS --> <link rel="stylesheet" href="owl.carousel.2.0.0- beta.2.4/assets/owl.carousel.css"> <link rel="stylesheet" href="owl.carousel.2.0.0-beta.2.4/assets/owl.theme.default.css"> <!-- OWLSLIDER SCRIPT --> <script src="owl.carousel.2.0.0-beta.2.4/owl.carousel.min.js"></script> <!-- JQUERY 3.1.0 --> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" crossorigin="anonymous"></script> <!-- <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> <![endif]--> </head> <body> <div class="owl-carousel"> <div class="item-video" data-merge="3"> <iframe width="420" height="315" src="https://www.youtube.com/embed/s8XIgR5OGJc?rel=0"></iframe> </div> <div class="item-video" data-merge="1"> <iframe width="420" height="315" src="https://www.youtube.com/embed/s8XIgR5OGJc?rel=0"></iframe> </div> <div class="item-video" data-merge="2"> <iframe width="420" height="315" src="https://www.youtube.com/embed/sbJLcWdfgq0?rel=0"></iframe> </div> <div class="item-video" data-merge="1"> <a class="owl-video" href="https://youtu.be/s8XIgR5OGJc"></a> </div> <div class="item-video" data-merge="2"> <a class="owl-video" href="http://www.youtube.com/watch?v=H3jLkJrhHKQ"></a> </div> <div class="item-video" data-merge="3"> <a class="owl-video" href="https://www.youtube.com/watch?v=g3J4VxWIM6s"></a> </div> <div class="item-video" data-merge="1"> <a class="owl-video" href="http://www.youtube.com/watch?v=0fhoIate4qI"></a> </div> <div class="item-video" data-merge="2"> <a class="owl-video" href="https://www.youtube.com/watch?v=EF_kj2ojZaE"></a> </div> </div> <!-- Scripts --> <script src="js/jquery-3.1.0.min.js"></script> <script src="owl.carousel.2.0.0-beta.2.4/owl.carousel.min.js"></script> <script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" crossorigin="anonymous"></script> <script src="js/html5shiv.js" type="text/js"></script> <script src="js/html5shiv-printshiv.js" type="text/js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> </body>path.joinpath.resolve一起解析Node.js中的绝对路径时是否存在差异?

当使用它们时,其中一个是首选(绝对路径分辨率是用例的90%)?

即。

__dirname

VS

const absolutePath = path.join(__dirname, some, dir);

两种方法都规范化路径。

这不是this question的重复,因为接受的答案是错误的。

4 个答案:

答案 0 :(得分:99)

是的,这些功能之间存在差异,但在这种情况下使用它们的方式会产生相同的结果。

path.join通过将两个路径合并在一起来返回规范化路径。它可以返回绝对路径,但不一定总是这样。

例如:

path.join('app/libs/oauth', '/../ssl')

解析为app/libs/ssl

另一方面,

path.resolve将解决绝对路径。

例如,当你运行:

path.resolve('bar', '/foo');

返回的路径为/foo,因为这是第一个可以构造的绝对路径。

但是,如果你跑:

path.resolve('/bar/bae', '/foo', 'test');

返回的路径将再次为/foo/test,因为这是第一个可以从右到左形成的绝对路径。

如果未提供指定根目录的路径,则将resolve函数的路径附加到当前工作目录。因此,如果您的工作目录是/home/mark/project/

path.resolve('test', 'directory', '../back');

解析为

/home/mark/project/test/back

使用__dirname是包含源文件的目录的绝对路径。当您使用path.resolvepath.join时,如果您在__dirname之后提供相同的路径,则会返回相同的结果。在这种情况下,这只是一个偏好问题。

答案 1 :(得分:15)

const absolutePath = path.join(__dirname, some, dir);

VS

const absolutePath = path.resolve(__dirname, some, dir);

path.join将连接__dirname,这是与somedir值连接的当前文件的目录名,并带有特定于平台的分隔符。

在哪里

path.resolve将处理__dirnamesomedir,即从左到右处理它,然后通过处理它。

如果somedir的任何值对应于根路径,那么前一个路径将被省略,并通过将其视为root来处理休息

为了更好地理解这个概念,让我更详细地解释如下: -

path.joinpath.resolve是nodejs提供的路径模块的两种不同方法或功能。

两者都接受一个路径列表,但差异在于结果,即它们如何处理这些路径。

path.join使用特定于平台的分隔符作为分隔符将所有给定路径段连接在一起,然后规范化生成的路径。虽然path.resolve()处理从右到左的路径序列,但每个后续路径都会被前置,直到构造绝对路径。

未提供参数时

以下示例将帮助您清楚地理解这两个概念: -

我的文件名为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

path.resolve()方法将输出path.join()返回的绝对路径。如果没有提供任何内容,则表示当前工作目录

当某个根路径作为参数传递时

const path=require('path');

console.log("path.join() : " ,path.join('abc','/bcd'));
console.log("path.resolve() : ",path.resolve('abc','/bcd'));

结果i

λ node index.js
path.join() :  abc\bcd
path.resolve() :  E:\bcd

path.join()仅将输入列表与特定于平台的分隔符连接,而path.resolve()处理从右到左的路径序列,每个后续路径都被预先添加,直到构造绝对路径。 / em>的

答案 2 :(得分:1)

从文档中获取path.resolve

  

除非将路径解析到根目录,否则将对生成的路径进行规范化并删除斜杠。

但是path.join总是用斜杠结尾

所以

__dirname = '/';
path.join(__dirname, 'foo/'); // '/foo/'
path.resolve(__dirname, 'foo/'); // '/foo'

答案 3 :(得分:1)

简单来说:

当您使用 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"