node.js

¿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.