Unterschied zwischen path.resolve und path.join-Aufruf?


190

Gibt es einen Unterschied zwischen den folgenden Aufrufen?

path.join(__dirname, 'app')

vs.

path.resolve(__dirname, 'app')

Welches sollte bevorzugt werden?


Diese Frage wird auf Meta
Nino Filiu

Antworten:


254

Die beiden Funktionen behandeln Segmente, die /auf sehr unterschiedliche Weise beginnen. joinverkettet es nur mit dem vorherigen Argument, resolvebehandelt es jedoch als Stammverzeichnis und ignoriert alle vorherigen Pfade - stellen Sie es sich als Ergebnis der Ausführung cdmit jedem Argument vor:

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

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

Eine andere Sache zu beachten ist, dass path.resolveimmer eine absolute URL führt und Ihr Arbeitsverzeichnis als Basis verwendet, um diesen Pfad aufzulösen. Aber wie __dirnamees ein absoluter Weg ist, spielt dies in Ihrem Fall keine Rolle.

Welche Antwort Sie verwenden sollten, lautet: Es hängt davon ab, wie sich Segmente /verhalten sollen - sollten sie einfach verbunden werden oder als neue Wurzel fungieren?

Wenn die anderen Argumente fest codiert sind, spielt es keine Rolle. In diesem Fall sollten Sie wahrscheinlich überlegen, (a) wie sich diese Zeile in Zukunft ändern könnte und (b) wie konsistent sie mit anderen Stellen im Code ist.


64
Wenn Sie es immer noch nicht bekommen: path.join('/a', '/b', 'c')wird zurückkehren /a/b/c, während path.resolve('/a', '/b', 'c')wird zurückkehren /b/c.
Totymedli

28
Ich würde sagen, der Name resolveist nicht der klarste, path.cd([starting dir], [final dir])wäre viel intuitiver.
João Pimentel Ferreira

19
Das think of it as the result of executing cd with each argumenthat mich endlich dazu gebracht, es zu verstehen. Vielen Dank
André Pena

@ JoãoPimentelFerreira, ich habe die Antwort oben aktualisiert, da Sie einen gültigen Punkt gemacht haben. :)
Rin Minase

also path.resolve => Pfad unter Berücksichtigung des Arbeitsverzeichnisses als Ausgangspunkt des Pfads auflösen?
Webwoman

15

Die Standardoperationen des Dateisystempfads variieren je nach Betriebssystem. Wir benötigen etwas, das es abstrahiert. Das pathModul bietet Dienstprogramme oder APIs für die Arbeit mit Datei- und Verzeichnispfaden. Sie können es mit in Ihr Projekt aufnehmen

const path = require('path');

Das path.joinundpath.resolve sind zwei verschiedene Methoden des Pfadmoduls.

Beide Methoden akzeptieren eine Folge von Pfaden oder Pfadsegmenten.

Die path.resolve()Methode löst eine Folge von Pfaden oder Pfadsegmenten in einen absoluten Pfad auf .

Die path.join()Methode verbindet alle angegebenen Pfadsegmente unter Verwendung des plattformspezifischen Trennzeichens als Trennzeichen und normalisiert dann den resultierenden Pfad.

Um Verhaltensweisen besser zu verstehen und zu unterscheiden, möchte ich dies anhand verschiedener Szenarien erläutern.

1. Wenn wir keine Argumente für eine leere Zeichenfolge angeben

In meinem Fall ist mein Dateiname index.jsund das aktuelle ArbeitsverzeichnisE:\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

und beim laufenden Ergebnis ist wie unten

λ node index.js
path.join() :  .
path.resolve() :  E:\MyFolder\Pjtz\node

Die Schlussfolgerung aus dem obigen Experiment ist, dass die path.resolve()Methode den absoluten Pfad als path.join()Rückgabe ausgibt . Darstellen des aktuellen Arbeitsverzeichnisses oder des relativen Pfads, wenn nichts angegeben ist

2. Hinzufügen eines / path als eines der Argumente.

const path=require('path');

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

und das Ergebnis ist

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

Die Schlussfolgerung, die wir aus diesem Experiment ziehen können, besteht darin, dass path.join()die Eingabeliste nur mit einem plattformspezifischen Trennzeichen verkettet wird, während die path.resolve()Reihenfolge der Pfade von rechts nach links verarbeitet wird, wobei jedem nachfolgenden Pfad vorangestellt wird, bis ein absoluter Pfad erstellt wird.

path.join()Verkettet jedes Argument mit betriebssystemspezifischen Trennzeichen, während path.resolve()jedes Argument mit root aufgelöst und eine Ausgabe erzeugt wird.


path.resolve()ist nicht gleichbedeutend mit __dirname. Das erste gibt das Arbeitsverzeichnis zurück, während das zweite den Pfad zur aktuellen Datei darstellt.
Emile Bergeron

@EmileBergeron Nach meinem Verständnis sind beide Funktionen auf dem Weg. Sie können versuchen, dem folgenden Snippet zu folgen, um zu überprüfen, ob beide gleich sind, denke ich. const path = require('path'); console.log(path.resolve()) console.log(__dirname) console.log(path.resolve()===__dirname)
samuelj90

Sie sind nur dann identisch, wenn sich die ausgeführte Datei im aktuellen Arbeitsverzeichnis befindet.
Emile Bergeron

@ EmileBergeron Ok, dass ich zustimme. Aber ich bin immer noch verwirrt darüber, wo ich angegeben habepath.resolve() is equivalent to __dirname
samuelj90

1
@ EmileBergeron Ich hatte den Kommentar aktualisiert Ich denke, es wird die Verwirrung lösen
samuelj90

13

1) path.resolve erstellt den absoluten Pfad.

Die Methode erstellt einen Absoulte-Pfad von rechts nach links bis ein absoluter Pfad erstellt wird.

Beispielsweise:

path.resolve('/a', 'b', 'c');     //    C:\a\b\c
path.resolve('/a', '/b', 'c');    //    C:\b\c
path.resolve('/a', '/b', '/c');   //    C:\c

Wenn kein absoluter Pfad generiert wird, verwendet die Methode das aktuelle Arbeitsverzeichnis:

Beispielsweise:

path.resolve('a', 'b', 'c');     //    C:\{current_working_directory}\a\b\c

2) path.join verbindet alle Pfade und normalisiert das Ergebnis

Beispielsweise:

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
Das letzte Join-Beispiel path.join('a','b','c')sollte ergeben a\b\c.
spmdc
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.