La esencia
En Node.js, __dirnamees siempre el directorio en el que reside el script que se está ejecutando actualmente ( consulte esto ). Así que si ha escrito __dirnameen /d1/d2/myscript.js, el valor sería /d1/d2.
Por el contrario, .le proporciona el directorio desde el que ejecutó el nodecomando en la ventana de su terminal (es decir, su directorio de trabajo) cuando utiliza bibliotecas como pathy 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 requiresiempre 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.jscontiene
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/dir2así que eso es lo que .resuelve. Como pathtest.jsse encuentra en /dir1/dir2eso, eso también se __dirnameresuelve.
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 /dir1lo que .resolvió, pero __dirnameaún lo resuelve /dir1/dir2.
Usando .dentro require...
Si dentro dir2/pathtest.jstiene una requirellamada para incluir un archivo dentro dir1, siempre lo haría
require('../thefile')
porque la ruta dentro requiresiempre es relativa al archivo en el que lo está llamando. No tiene nada que ver con su directorio de trabajo.