path.resolveとpath.joinの呼び出しの違いは?


回答:


254

2つの関数は/、非常に異なる方法で始まるセグメントを扱います。join前の引数と連結するだけですが、resolveこれをルートディレクトリとして扱い、以前のすべてのパスを無視します- cd各引数で実行した結果と考えてください。

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

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

もう1つ注意すべき点は、path.resolve常に絶対URLが生成され、このパスを解決するためのベースとして作業ディレクトリを使用することです。しかし、__dirnameいずれにせよ絶対パスであるので、これはあなたの場合には関係ありません。

どちらを使用するべきかについては、答えは次のとおりです。それは、セグメントがどのよう/に動作するかによって異なります-単純に結合する必要があるのか​​、それとも新しいルートとして機能するのか?

他の引数がハードコードされている場合、それは実際には問題ではありません。その場合、(a)この行が将来どのように変化するか、および(b)コード内の他の場所との一貫性を考慮する必要があります。


64
それでも取得できない場合:path.join('/a', '/b', 'c')が戻りますが/a/b/c、path.resolve('/a', '/b', 'c')が戻り/b/cます。
— totymedli 2017年

28
の名前はresolve最も明確ではなく、path.cd([starting dir], [final dir])はるかに直感的だと思います。
— ジョアンピメンテルフェレイラ

19
think of it as the result of executing cd with each argument私は最終的にそれを理解して作られました。ありがとう
— アンドレ・ペーニャ

@JoãoPimentelFerreira、あなたが有効なポイントを作ったので、私は上記の答えを更新しました。:)
— 水瀬凛

したがって、path.resolve =>作業ディレクトリをパスの開始点として考慮してパスを解決しますか?
— Webwoman 2018

15

ファイルシステムパスのデフォルトの動作は、それを抽象化するために必要なオペレーティングシステムによって異なります。このpathモジュールは、ファイルおよびディレクトリパスを操作するためのユーティリティまたはAPIを提供します。あなたはそれをあなたのプロジェクトに含めることができます

const path = require('path');

パスモジュールの二つの異なる方法です。path.joinpath.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()各引数をルートで解決して出力を生成します。


path.resolve()ある等価ではないと__dirname。1つ目は作業ディレクトリを返し、2つ目は現在のファイルへのパスです。
— エミールベルジェロン2018

@EmileBergeron私の理解では、どちらもパス上の関数です。次のスニペットを試して、両方が同じかどうかを確認できます。const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname)
— samuelj90 2018

これらは、実行中のファイルが現在の作業ディレクトリにある場合にのみ同じです。
— エミールベルジェロン2018

@EmileBergeron OK同意します。しかし、Iamはまだ指定した場所で混乱していますpath.resolve() is equivalent to __dirname
— samuelj90

1
@EmileBergeronコメントを更新しました。混乱を解消できると思います
— samuelj90

13

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

1
最後の結合の例でpath.join('a','b','c')は、になるはずa\b\cです。
— spmdc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.