¿Cuál es la diferencia entre__dirname y./ en node.js?
(2)
La esencia
En Node.js, __dirname
es siempre el directorio en el que reside el script que se está ejecutando actualmente ( vea esto ). Entonces, si escribió __dirname
en /d1/d2/myscript.js
, el valor sería /d1/d2
.
Por el contrario,. le da el directorio desde el que ejecutó el comando de node
en su ventana de terminal (es decir, su directorio de trabajo).
La excepción es cuando usas .
con require()
. La ruta dentro del require
siempre es relativa al archivo que contiene la llamada a require
.
Por ejemplo...
Digamos que su estructura de directorios 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
y eso es lo que .
se resuelve a. Como pathtest.js
se encuentra en /dir1/dir2
eso es lo que __dirname
resuelve también.
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 era /dir1
y eso es lo que .
resuelto a, pero __dirname
aún se resuelve a /dir1/dir2
.
Utilizando .
por dentro require
...
Si dentro de dir2/pathtest.js
usted tiene una llamada dir1
para incluir un archivo dentro de dir1
, siempre lo haría
require(''../thefile'')
porque la ruta dentro de la solicitud siempre es relativa al archivo en el que lo está llamando. No tiene nada que ver con su directorio de trabajo.
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 variable __dirname
lugar de solo un ./
? He estado utilizando ./ 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 un inteligente? idea.
./
refiere al directorio de trabajo actual, excepto en la función require()
. Cuando se utiliza require()
, 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
{
"hello": "world"
}
/home/user/dir/files/somefile.txt
text file
/home/user/dir/dir.js
var fs = require(''fs'');
console.log(require(''./files/config.json''));
console.log(fs.readFileSync(''./files/somefile.txt'', ''utf8''));
Si cd
en /home/user/dir
y ejecuto node dir.js
obtendré
{ hello: ''world'' }
text file
Pero cuando ejecuto el mismo script desde /home/user/
obtengo
{ hello: ''world'' }
Error: ENOENT, no such file or directory ''./files/somefile.txt''
at Object.openSync (fs.js:228:18)
at Object.readFileSync (fs.js:119:15)
at Object.<anonymous> (/home/user/dir/dir.js:4:16)
at Module._compile (module.js:432:26)
at Object..js (module.js:450:10)
at Module.load (module.js:351:31)
at Function._load (module.js:310:12)
at Array.0 (module.js:470:10)
at EventEmitter._tickCallback (node.js:192:40)
Usar ./
trabajado con require
pero no para fs.readFileSync
. Esto se debe a que para fs.readFileSync
, ./
traduce en cwd (en este caso /home/user/
). Y /home/user/files/somefile.txt
no existe.