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ó el node
comando en la ventana de su terminal (es decir, su directorio de trabajo) cuando utiliza bibliotecas como path
y fs
. Técnicamente, comienza como su directorio de trabajo pero se puede cambiar usando process.chdir()
.
La excepción es cuando usas .
con require()
. La ruta interna require
siempre es relativa al archivo que contiene la llamada a require
.
Por ejemplo...
Digamos que su estructura de directorio es
/dir1
/dir2
pathtest.js
y pathtest.js
contiene
var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));
y lo hace
cd /dir1/dir2
node pathtest.js
usted obtiene
. = /dir1/dir2
__dirname = /dir1/dir2
Su directorio de trabajo es /dir1/dir2
así que eso es lo que .
resuelve. Como pathtest.js
se encuentra en /dir1/dir2
eso, eso también se __dirname
resuelve.
Sin embargo, si ejecuta el script desde /dir1
cd /dir1
node dir2/pathtest.js
usted obtiene
. = /dir1
__dirname = /dir1/dir2
En ese caso, su directorio de trabajo fue /dir1
lo que .
resolvió, pero __dirname
aún lo resuelve /dir1/dir2
.
Usando .
dentro require
...
Si dentro dir2/pathtest.js
tiene una require
llamada para incluir un archivo dentro dir1
, siempre lo haría
require('../thefile')
porque 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.