L'essentiel
Dans Node.js, se __dirnametrouve toujours le répertoire dans lequel réside le script en cours d'exécution ( voir ceci ). Donc , si vous avez tapé __dirnamedans /d1/d2/myscript.js, la valeur serait /d1/d2.
En revanche, .vous donne le répertoire à partir duquel vous avez exécuté la nodecommande dans votre fenêtre de terminal (c'est-à-dire votre répertoire de travail) lorsque vous utilisez des bibliothèques comme pathet fs. Techniquement, il commence comme votre répertoire de travail mais peut être modifié à l'aide de process.chdir().
L'exception est lorsque vous utilisez .avec require(). Le chemin à l'intérieur requireest toujours relatif au fichier contenant l'appel à require.
Par exemple...
Disons que la structure de votre répertoire est
/dir1
/dir2
pathtest.js
et pathtest.jscontient
var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));
et vous faites
cd /dir1/dir2
node pathtest.js
vous obtenez
. = /dir1/dir2
__dirname = /dir1/dir2
Votre répertoire de travail est /dir1/dir2ainsi .résolu. Puisque pathtest.jsse trouve dans /dir1/dir2c'est ce qui se __dirnamerésout également.
Cependant, si vous exécutez le script à partir de /dir1
cd /dir1
node dir2/pathtest.js
vous obtenez
. = /dir1
__dirname = /dir1/dir2
Dans ce cas, votre répertoire de travail était /dir1donc c'est ce qui a été .résolu, mais __dirnamese résout toujours à /dir1/dir2.
Utilisation à l' .intérieur require...
Si l' intérieur dir2/pathtest.jsvous avez un requireappel en inclure un fichier à l' intérieur dir1vous toujours faire
require('../thefile')
car le chemin à l'intérieur requireest toujours relatif au fichier dans lequel vous l'appelez. Cela n'a rien à voir avec votre répertoire de travail.