path.join vs path.resolve mit __dirname


141

Gibt es einen Unterschied, wenn Sie beide path.join und path.resolvemit __dirnamezum 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.


Diese Frage wird diskutiert auf meta
Nino Filiu

Antworten:


151

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.joinGibt 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:

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

beschließt zu app/libs/ssl

path.resolvewird sich dagegen in einen absoluten Pfad auflösen.

Zum Beispiel, wenn Sie ausführen:

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

Der zurückgegebene Pfad ist, /fooda dies der erste absolute Pfad ist, der erstellt werden kann.

Wenn Sie jedoch Folgendes ausführen:

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

Der zurückgegebene Pfad wird /foo/testerneut 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 resolveFunktion zugewiesenen Pfade an das aktuelle Arbeitsverzeichnis angehängt. Also, wenn Ihr Arbeitsverzeichnis war /home/mark/project/:

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

beschließt zu

/home/mark/project/test/back

Verwenden __dirnameist der absolute Pfad zu dem Verzeichnis, das die Quelldatei enthält. Wenn Sie path.resolveoder verwenden, geben path.joinsie 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.


25
Nit: __dirnameist 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 .
Josh3736

2
Gibt es also keinen Unterschied zwischen __dirnameund path.resolve(__dirname)?
Georgec

1
@georaldc: Ich habe einen gefunden: Knoten <<< "path = require ('path'); console.log (__ dirname); console.log (path.resolve (__ dirname))"
Colin

8
Ich hasse es, es zu sagen, aber diese Antwort ergibt für mich wirklich keinen Sinn und ich würde mich über eine Klarstellung freuen. Sie bemerken, dass 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/testungültig ist.
temporärer_Benutzername

3
@temporary_user_name Die Antwort ist in Bezug auf path.resolvedas Verhalten hier richtig : path.resolvearbeitet 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/baeda es zu diesem Zeitpunkt bereits den absoluten Pfad hat /foo/testund daher keinen Grund sieht, weiter zu gehen.
Jamie Ridding

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

vs.

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

path.joinverkettet Dies __dirnameist der Verzeichnisname der aktuellen Datei, der mit Werten von someund dirmit plattformspezifischem Trennzeichen verknüpft ist.

Wohingegen

path.resolveverarbeiten wird __dirname, someund das dirheißt von rechts nach links vorangestellt wird es durch sie zu verarbeiten.

Wenn einer der Werte eines Root-Pfads someoder direinem Root-Pfad entspricht, wird der vorherige Pfad weggelassen und der Rest wird verarbeitet, indem er als Root betrachtet wird

Um das Konzept besser zu verstehen, möchte ich beide etwas detaillierter wie folgt erläutern:

Das path.joinund path.resolvesind 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.joinVerkettet alle angegebenen Pfadsegmente unter Verwendung des plattformspezifischen Trennzeichens als Trennzeichen und normalisiert dann den resultierenden Pfad. Während des path.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.jsund das aktuelle Arbeitsverzeichnis istE:\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

Ergebnis

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

path.resolve()Die Methode gibt den absoluten Pfad als path.join()Rückgabe aus. Darstellen des aktuellen Arbeitsverzeichnisses, wenn nichts angegeben ist

Wenn ein Stammpfad als Argumente übergeben wird

const path=require('path');

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

Ergebnis i

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

path.join()Verkettet die Eingabeliste nur mit einem plattformspezifischen Trennzeichen, während der path.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.


Die Frage betraf speziell path.join vs path.resolve mit __dirname .
Estus Flask

Ich hatte die Antwort basierend auf Ihren Kommentaren aktualisiert. Danke für das Update
samuelj90

3

von doc für path.resolve:

Der resultierende Pfad wird normalisiert und nachfolgende Schrägstriche werden entfernt, sofern der Pfad nicht in das Stammverzeichnis aufgelöst wird.

Aber path.joinbleibt hinter Schrägstrichen

So

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

Was bedeutet das Wort "normalisiert" in diesem Zusammenhang?
Apollo

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.