L'essenza
In Node.js __dirnameè sempre la directory in cui risiede lo script attualmente in esecuzione ( vedere questo ). Quindi, se avete digitato __dirnamein /d1/d2/myscript.js, il valore sarebbe /d1/d2.
Al contrario, .ti dà la directory da cui hai eseguito il nodecomando nella finestra del tuo terminale (cioè la tua directory di lavoro) quando usi librerie come pathe fs. Tecnicamente, inizia come directory di lavoro ma può essere modificata utilizzando process.chdir().
L'eccezione è quando si usa .con require(). Il percorso all'interno requireè sempre relativo al file contenente la chiamata a require.
Per esempio...
Supponiamo che sia la tua struttura di directory
/dir1
/dir2
pathtest.js
e pathtest.jscontiene
var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));
e tu fai
cd /dir1/dir2
node pathtest.js
hai capito
. = /dir1/dir2
__dirname = /dir1/dir2
La tua directory di lavoro è /dir1/dir2quindi questo è ciò che si .risolve. Dato che pathtest.jssi trova in /dir1/dir2questo è ciò che si __dirnamerisolve anche.
Tuttavia, se si esegue lo script da /dir1
cd /dir1
node dir2/pathtest.js
hai capito
. = /dir1
__dirname = /dir1/dir2
In quel caso, la tua directory di lavoro era /dir1quindi ciò che è stato .risolto, ma __dirnamesi risolve ancora /dir1/dir2.
Usando .dentro require...
Se all'interno dir2/pathtest.jssi dispone di una requirechiamata in includere un file all'interno dir1si dovrebbe sempre fare
require('../thefile')
perché il percorso all'interno requireè sempre relativo al file in cui lo stai chiamando. Non ha nulla a che fare con la tua directory di lavoro.