Das Wesentliche
In Node.js __dirname
befindet sich immer das Verzeichnis, in dem sich das aktuell ausgeführte Skript befindet ( siehe dies ). Also , wenn Sie eingegeben haben __dirname
in /d1/d2/myscript.js
, wäre der Wert /d1/d2
.
Im Gegensatz dazu erhalten .
Sie das Verzeichnis, aus dem Sie den node
Befehl in Ihrem Terminalfenster (dh Ihrem Arbeitsverzeichnis) ausgeführt haben, wenn Sie Bibliotheken wie path
und verwenden fs
. Technisch gesehen beginnt es als Ihr Arbeitsverzeichnis, kann aber mit geändert werden process.chdir()
.
Die Ausnahme ist, wenn Sie .
mit verwenden require()
. Der Pfad darin require
ist immer relativ zu der Datei, die den Aufruf von enthält require
.
Zum Beispiel...
Angenommen, Ihre Verzeichnisstruktur ist
/dir1
/dir2
pathtest.js
und pathtest.js
enthält
var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));
und du machst
cd /dir1/dir2
node pathtest.js
du erhältst
. = /dir1/dir2
__dirname = /dir1/dir2
Ihr Arbeitsverzeichnis ist /dir1/dir2
so, wie .
es aufgelöst wird. Da pathtest.js
sich in befindet /dir1/dir2
, __dirname
löst sich das auch auf.
Wenn Sie das Skript jedoch von ausführen /dir1
cd /dir1
node dir2/pathtest.js
du erhältst
. = /dir1
__dirname = /dir1/dir2
In diesem Fall war Ihr Arbeitsverzeichnis /dir1
so, dass es .
aufgelöst wurde, aber __dirname
immer noch aufgelöst wird /dir1/dir2
.
Verwenden von .
innen require
...
Wenn dir2/pathtest.js
Sie einen require
Aufruf haben, eine Datei einzuschließen dir1
, würden Sie dies immer tun
require('../thefile')
weil der Pfad darin require
immer relativ zu der Datei ist, in der Sie ihn aufrufen. Es hat nichts mit Ihrem Arbeitsverzeichnis zu tun.