Czy programując w Node.js i odwołując się do plików, które znajdują się gdzieś w stosunku do bieżącego katalogu, czy jest jakiś powód, aby używać tej __dirname
zmiennej zamiast zwykłego ./
? Do tej pory używałem ./ w swoim kodzie i właśnie odkryłem istnienie __dirname
i zasadniczo chcę wiedzieć, czy mądrze byłoby przekonwertować moje ./ na to, a jeśli tak, to dlaczego byłby to dobry pomysł .
498
.
jest używany wewnątrzrequire
. Ścieżka wewnątrzrequire
jest zawsze względna do pliku zawierającego wywołanierequire
.Odpowiedzi:
Istota
W Node.js
__dirname
zawsze znajduje się katalog, w którym znajduje się aktualnie wykonywany skrypt ( zobacz to ). Więc jeśli wpisane__dirname
na/d1/d2/myscript.js
wartość byłaby/d1/d2
.Z kolei
.
daje katalog, z którego uruchomiłeśnode
polecenie w oknie terminala (tj. Katalog roboczy), gdy korzystasz z bibliotek takich jakpath
ifs
. Technicznie zaczyna się jako katalog roboczy, ale można go zmienić za pomocąprocess.chdir()
.Wyjątkiem jest sytuacja, gdy używasz
.
zrequire()
. Ścieżka wewnątrzrequire
jest zawsze względna do pliku zawierającego wywołanierequire
.Na przykład...
Powiedzmy, że twoja struktura katalogów to
i
pathtest.js
zawieraa ty
dostajesz
Twój katalog roboczy jest
/dir1/dir2
więc tym, co.
rozwiązuje. Ponieważpathtest.js
znajduje się w/dir1/dir2
tym, to również__dirname
rozwiązuje.Jeśli jednak uruchomisz skrypt z
/dir1
dostajesz
W takim przypadku Twój katalog roboczy był
/dir1
taki, że został.
rozwiązany, ale__dirname
nadal jest rozwiązany/dir1/dir2
.Używanie
.
wewnątrzrequire
...Jeśli w środku
dir2/pathtest.js
maszrequire
wezwanie do dołączenia plikudir1
, zawsze tak zrobiszponieważ ścieżka wewnątrz
require
jest zawsze względna do pliku, w którym go wywołujesz. Nie ma to nic wspólnego z twoim katalogiem roboczym.źródło
./
nie zawsze jest to katalog, z którego uruchomiono węzeł. Zaczyna się w ten sposób, ale można to zmienić za pomocąprocess.chdir()
. Tak więc./
zawsze jest bieżący katalog roboczy, którym zwykle jest węzeł katalogu, z którego został uruchomiony, chyba że kod wyraźnie zmienił katalog roboczy.../someDir
jakiegoś skryptu i zamierzasz uruchomić polecenie z innego folderu?./
odnosi się do bieżącego katalogu roboczego, z wyjątkiemrequire()
funkcji. Podczas używaniarequire()
tłumaczy./
się do katalogu bieżącego pliku o nazwie.__dirname
jest zawsze katalogiem bieżącego pliku.Na przykład o następującej strukturze plików
/home/user/dir/files/config.json
/home/user/dir/files/somefile.txt
/home/user/dir/dir.js
Jeśli
cd
wejdę/home/user/dir
i ucieknęnode dir.js
, dostanęAle kiedy uruchamiam ten sam skrypt
/home/user/
, otrzymujęUżywanie
./
działało z,require
ale nie dlafs.readFileSync
. To dlatego, że dlafs.readFileSync
,./
przekłada się na CWD (w tym przypadku/home/user/
). I/home/user/files/somefile.txt
nie istnieje.źródło
/movies
, ale ponieważ mój moduł znajduje się w pliku/custom_modules/
,__dirname
próbuje pobrać film z/custom_modules/movies
./
lubprocess.cwd()
. patrz nodejs.org/api/process.html#process_process_cwd