Istota
W Node.js __dirnamezawsze znajduje się katalog, w którym znajduje się aktualnie wykonywany skrypt ( zobacz to ). Więc jeśli wpisane __dirnamena /d1/d2/myscript.jswartość byłaby /d1/d2.
Z kolei .daje katalog, z którego uruchomiłeś nodepolecenie w oknie terminala (tj. Katalog roboczy), gdy korzystasz z bibliotek takich jak pathi fs. Technicznie zaczyna się jako katalog roboczy, ale można go zmienić za pomocą process.chdir().
Wyjątkiem jest sytuacja, gdy używasz .z require(). Ścieżka wewnątrz requirejest zawsze względna do pliku zawierającego wywołanie require.
Na przykład...
Powiedzmy, że twoja struktura katalogów to
/dir1
/dir2
pathtest.js
i pathtest.jszawiera
var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));
a ty
cd /dir1/dir2
node pathtest.js
dostajesz
. = /dir1/dir2
__dirname = /dir1/dir2
Twój katalog roboczy jest /dir1/dir2więc tym, co .rozwiązuje. Ponieważ pathtest.jsznajduje się w /dir1/dir2tym, to również __dirnamerozwiązuje.
Jeśli jednak uruchomisz skrypt z /dir1
cd /dir1
node dir2/pathtest.js
dostajesz
. = /dir1
__dirname = /dir1/dir2
W takim przypadku Twój katalog roboczy był /dir1taki, że został .rozwiązany, ale __dirnamenadal jest rozwiązany /dir1/dir2.
Używanie .wewnątrz require...
Jeśli w środku dir2/pathtest.jsmasz requirewezwanie do dołączenia pliku dir1, zawsze tak zrobisz
require('../thefile')
ponieważ ścieżka wewnątrz requirejest zawsze względna do pliku, w którym go wywołujesz. Nie ma to nic wspólnego z twoim katalogiem roboczym.