Gibt es einen Unterschied, wenn Sie beide path.join
und path.resolve
mit __dirname
zum Auflösen des absoluten Pfads in Node.js verwenden?
Sollte einer von ihnen bevorzugt werden, wenn er so verwendet wird (absolute Pfadauflösungen machen 90% der Anwendungsfälle aus)?
Dh
const absolutePath = path.join(__dirname, some, dir);
vs.
const absolutePath = path.resolve(__dirname, some, dir);
Beide Methoden normalisieren den Pfad.
Dies ist kein Duplikat dieser Frage, da die akzeptierte Antwort falsch ist.
Antworten:
Ja, es gibt einen Unterschied zwischen den Funktionen, aber die Art und Weise, wie Sie sie in diesem Fall verwenden, führt zum gleichen Ergebnis.
path.join
Gibt einen normalisierten Pfad zurück, indem zwei Pfade zusammengeführt werden. Es kann einen absoluten Pfad zurückgeben, dies ist jedoch nicht unbedingt immer der Fall.Zum Beispiel:
beschließt zu
app/libs/ssl
path.resolve
wird sich dagegen in einen absoluten Pfad auflösen.Zum Beispiel, wenn Sie ausführen:
Der zurückgegebene Pfad ist,
/foo
da dies der erste absolute Pfad ist, der erstellt werden kann.Wenn Sie jedoch Folgendes ausführen:
Der zurückgegebene Pfad wird
/foo/test
erneut angezeigt, da dies der erste absolute Pfad ist, der von rechts nach links gebildet werden kann.Wenn Sie keinen Pfad angeben, der das Stammverzeichnis angibt, werden die der
resolve
Funktion zugewiesenen Pfade an das aktuelle Arbeitsverzeichnis angehängt. Also, wenn Ihr Arbeitsverzeichnis war/home/mark/project/
:beschließt zu
/home/mark/project/test/back
Verwenden
__dirname
ist der absolute Pfad zu dem Verzeichnis, das die Quelldatei enthält. Wenn Siepath.resolve
oder verwenden, gebenpath.join
sie das gleiche Ergebnis zurück, wenn Sie den gleichen Pfad angeben__dirname
. In solchen Fällen ist es wirklich nur eine Frage der Präferenz.quelle
__dirname
ist der absolute Pfad zu dem Verzeichnis, das die ausgeführte Quelldatei enthält, nicht das aktuelle Arbeitsverzeichnis . Ersteres ist immer dasselbe (es sei denn, Sie verschieben die Datei). Letzteres ist ein prozessweiter Parameter , der davon abhängt, wie Sie den Knoten gestartet haben und ob Sie ihn geändert haben oder nicht .__dirname
undpath.resolve(__dirname)
?path.resolve('/bar/bae', '/foo', 'test');
das erste Argument im Wesentlichen verworfen wird, weil/foo/test
"der erste absolute Pfad ist, der von rechts nach links gebildet werden kann", aber Sie haben nicht erklärt, warum , deshalb verstehe ich die Logik bei der Arbeit wirklich nicht. Ich meine, ich habe keinen Einblick in die hypothetische Verzeichnisstruktur, die Sie in Ihrem Beispiel verwenden, daher kann ich mir nicht vorstellen, warum sie/bar/bae/foo/test
ungültig ist.path.resolve
das Verhalten hier richtig :path.resolve
arbeitet vom Argument ganz rechts aus, bewegt sich nach links durch die Argumentliste und stellt den Wert jedes Arguments bis zu einem absoluten Pfad voran (dh einem, der mit dem Stammverzeichnis/
oder [speziell in Windows] beginnt ] wird ein Laufwerksbuchstabe erstellt) und gibt diesen Pfad zurück. Es wird ignoriert,/bar/bae
da es zu diesem Zeitpunkt bereits den absoluten Pfad hat/foo/test
und daher keinen Grund sieht, weiter zu gehen.vs.
path.join
verkettet Dies__dirname
ist der Verzeichnisname der aktuellen Datei, der mit Werten vonsome
unddir
mit plattformspezifischem Trennzeichen verknüpft ist.Wohingegen
path.resolve
verarbeiten wird__dirname
,some
und dasdir
heißt von rechts nach links vorangestellt wird es durch sie zu verarbeiten.Wenn einer der Werte eines Root-Pfads
some
oderdir
einem Root-Pfad entspricht, wird der vorherige Pfad weggelassen und der Rest wird verarbeitet, indem er als Root betrachtet wirdUm das Konzept besser zu verstehen, möchte ich beide etwas detaillierter wie folgt erläutern:
Das
path.join
undpath.resolve
sind zwei verschiedene Methoden oder Funktionen des von nodejs bereitgestellten Pfadmoduls.Wenn beide eine Pfadliste akzeptieren, der Unterschied jedoch im Ergebnis liegt, dh wie sie diesen Pfad verarbeiten.
path.join
Verkettet alle angegebenen Pfadsegmente unter Verwendung des plattformspezifischen Trennzeichens als Trennzeichen und normalisiert dann den resultierenden Pfad. Während despath.resolve()
Prozesses wird die Reihenfolge der Pfade von rechts nach links festgelegt, wobei jeder nachfolgende Pfad vorangestellt wird, bis ein absoluter Pfad erstellt wird.Wenn keine Argumente angegeben werden
Das folgende Beispiel hilft Ihnen, beide Konzepte klar zu verstehen:
Mein Dateiname ist
index.js
und das aktuelle Arbeitsverzeichnis istE:\MyFolder\Pjtz\node
Ergebnis
path.resolve()
Die Methode gibt den absoluten Pfad alspath.join()
Rückgabe aus. Darstellen des aktuellen Arbeitsverzeichnisses, wenn nichts angegeben istWenn ein Stammpfad als Argumente übergeben wird
Ergebnis i
path.join()
Verkettet die Eingabeliste nur mit einem plattformspezifischen Trennzeichen, während derpath.resolve()
Prozess die Reihenfolge der Pfade von rechts nach links verarbeitet, wobei jedem nachfolgenden Pfad ein Präfix vorangestellt wird, bis ein absoluter Pfad erstellt wird.quelle
von doc für
path.resolve
:Aber
path.join
bleibt hinter SchrägstrichenSo
quelle