Das Wesentliche
In Node.js __dirnamebefindet sich immer das Verzeichnis, in dem sich das aktuell ausgeführte Skript befindet ( siehe dies ). Also , wenn Sie eingegeben haben __dirnamein /d1/d2/myscript.js, wäre der Wert /d1/d2.
Im Gegensatz dazu erhalten .Sie das Verzeichnis, aus dem Sie den nodeBefehl in Ihrem Terminalfenster (dh Ihrem Arbeitsverzeichnis) ausgeführt haben, wenn Sie Bibliotheken wie pathund 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 requireist immer relativ zu der Datei, die den Aufruf von enthält require.
Zum Beispiel...
Angenommen, Ihre Verzeichnisstruktur ist
/dir1
/dir2
pathtest.js
und pathtest.jsenthä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/dir2so, wie .es aufgelöst wird. Da pathtest.jssich in befindet /dir1/dir2, __dirnamelö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 /dir1so, dass es .aufgelöst wurde, aber __dirnameimmer noch aufgelöst wird /dir1/dir2.
Verwenden von .innen require...
Wenn dir2/pathtest.jsSie einen requireAufruf haben, eine Datei einzuschließen dir1, würden Sie dies immer tun
require('../thefile')
weil der Pfad darin requireimmer relativ zu der Datei ist, in der Sie ihn aufrufen. Es hat nichts mit Ihrem Arbeitsverzeichnis zu tun.