Al programar en Node.js y hacer referencia a archivos que se encuentran en algún lugar en relación con su directorio actual, ¿hay alguna razón para usar la __dirname
variable en lugar de solo una regular ./
? He estado usando ./ hasta ahora en mi código y acabo de descubrir la existencia de __dirname
, y esencialmente quiero saber si sería inteligente convertir mis ./ a eso, y si es así, ¿por qué sería una idea inteligente? .
498
.
se usa en el interiorrequire
. La ruta internarequire
siempre es relativa al archivo que contiene la llamada arequire
.Respuestas:
La esencia
En Node.js,
__dirname
es siempre el directorio en el que reside el script que se está ejecutando actualmente ( consulte esto ). Así que si ha escrito__dirname
en/d1/d2/myscript.js
, el valor sería/d1/d2
.Por el contrario,
.
le proporciona el directorio desde el que ejecutó elnode
comando en la ventana de su terminal (es decir, su directorio de trabajo) cuando utiliza bibliotecas comopath
yfs
. Técnicamente, comienza como su directorio de trabajo pero se puede cambiar usandoprocess.chdir()
.La excepción es cuando usas
.
conrequire()
. La ruta internarequire
siempre es relativa al archivo que contiene la llamada arequire
.Por ejemplo...
Digamos que su estructura de directorio es
y
pathtest.js
contieney lo hace
usted obtiene
Su directorio de trabajo es
/dir1/dir2
así que eso es lo que.
resuelve. Comopathtest.js
se encuentra en/dir1/dir2
eso, eso también se__dirname
resuelve.Sin embargo, si ejecuta el script desde
/dir1
usted obtiene
En ese caso, su directorio de trabajo fue
/dir1
lo que.
resolvió, pero__dirname
aún lo resuelve/dir1/dir2
.Usando
.
dentrorequire
...Si dentro
dir2/pathtest.js
tiene unarequire
llamada para incluir un archivo dentrodir1
, siempre lo haríaporque la ruta dentro
require
siempre es relativa al archivo en el que lo está llamando. No tiene nada que ver con su directorio de trabajo.fuente
./
no siempre es el directorio desde el que se inició el nodo. Comienza de esa manera, pero se puede cambiar a través deprocess.chdir()
. Entonces,./
siempre es el directorio de trabajo actual, que generalmente es el nodo de directorio desde el que se inició, a menos que su código haya cambiado explícitamente el directorio de trabajo.../someDir
algún script y va a ejecutar el comando desde una carpeta diferente?./
se refiere al directorio de trabajo actual, excepto en larequire()
función. Cuando se usarequire()
, se traduce./
al directorio del archivo actual llamado.__dirname
es siempre el directorio del archivo actual.Por ejemplo, con la siguiente estructura de archivos
/home/user/dir/files/config.json
/home/user/dir/files/somefile.txt
/home/user/dir/dir.js
Si
cd
entro/home/user/dir
y corronode dir.js
obtendréPero cuando ejecuto el mismo script
/home/user/
, obtengoUso
./
trabajado conrequire
pero no parafs.readFileSync
. Eso es porquefs.readFileSync
, se./
traduce en el cwd (en este caso/home/user/
). Y/home/user/files/somefile.txt
no existe.fuente
/movies
, pero dado que mi módulo está en un archivo/custom_modules/
,__dirname
trata de tomar la película de,/custom_modules/movies
./
oprocess.cwd()
. ver nodejs.org/api/process.html#process_process_cwd