Ao programar no Node.js e referenciar arquivos localizados em algum lugar em relação ao seu diretório atual, existe algum motivo para usar a __dirname
variável em vez de apenas uma regular ./
? Eu tenho usado ./ até agora no meu código e descobri a existência de __dirname
, e quero essencialmente saber se seria inteligente converter meus ./ para isso e, se sim, por que essa seria uma idéia inteligente .
498
.
é usado dentrorequire
. O caminho internorequire
é sempre relativo ao arquivo que contém a chamada pararequire
.Respostas:
A essência
No Node.js,
__dirname
é sempre o diretório em que o script atualmente em execução reside ( veja isso ). Então, se você digitou__dirname
em/d1/d2/myscript.js
, o valor seria/d1/d2
.Por outro lado,
.
fornece o diretório a partir do qual você executou onode
comando na janela do terminal (ou seja, o diretório de trabalho) quando você usa bibliotecas comopath
efs
. Tecnicamente, ele começa como seu diretório de trabalho, mas pode ser alterado usandoprocess.chdir()
.A exceção é quando você usa
.
comrequire()
. O caminho internorequire
é sempre relativo ao arquivo que contém a chamada pararequire
.Por exemplo...
Digamos que sua estrutura de diretórios seja
e
pathtest.js
contéme você faz
você recebe
Seu diretório de trabalho é
/dir1/dir2
o que.
resolve. Desde quepathtest.js
está localizado em/dir1/dir2
que é o que__dirname
resolve também.No entanto, se você executar o script a partir de
/dir1
você recebe
Nesse caso, seu diretório de trabalho era
/dir1
e foi assim que.
resolveu, mas__dirname
ainda resolve/dir1/dir2
.Usando
.
dentrorequire
...Se dentro de
dir2/pathtest.js
você tiver umarequire
chamada para incluir um arquivo dentro,dir1
você sempre fariaporque o caminho interno
require
é sempre relativo ao arquivo no qual você está chamando. Não tem nada a ver com o seu diretório de trabalho.fonte
./
nem sempre é o diretório em que o nó foi iniciado. Começa assim, mas pode ser alterado viaprocess.chdir()
. Portanto,./
sempre é o diretório de trabalho atual, que geralmente é o nó do diretório, a menos que seu código altere explicitamente o diretório de trabalho.../someDir
algum script e executar o comando em uma pasta diferente?./
refere-se ao diretório de trabalho atual, exceto narequire()
função Ao usá-require()
lo, ele se traduz./
no diretório do arquivo atual chamado.__dirname
é sempre o diretório do arquivo atual.Por exemplo, com a seguinte estrutura de arquivo
/home/user/dir/files/config.json
/home/user/dir/files/somefile.txt
/home/user/dir/dir.js
Se eu
cd
entrar/home/user/dir
e corrernode dir.js
, tereiMas quando executo o mesmo script
/home/user/
, receboUsando
./
trabalhou comrequire
mas não parafs.readFileSync
. Isso porquefs.readFileSync
,./
traduz-se no cwd (neste caso/home/user/
). E/home/user/files/somefile.txt
não existe.fonte
/movies
, mas desde que meu módulo está em um arquivo/custom_modules/
,__dirname
tenta agarrar o filme a partir,/custom_modules/movies
./
ouprocess.cwd()
. veja nodejs.org/api/process.html#process_process_cwd