Lors de la programmation dans Node.js et du référencement de fichiers situés quelque part par rapport à votre répertoire actuel, y a-t-il une raison d'utiliser la __dirname
variable au lieu d'un simple habituel ./
? J'ai utilisé ./ jusqu'à présent dans mon code et je viens de découvrir l'existence de __dirname
, et je veux essentiellement savoir s'il serait intelligent de convertir mes ./ en cela, et si oui, pourquoi ce serait une idée intelligente .
498
.
est utilisé à l'intérieurrequire
. Le chemin à l'intérieurrequire
est toujours relatif au fichier contenant l'appel àrequire
.Réponses:
L'essentiel
Dans Node.js, se
__dirname
trouve toujours le répertoire dans lequel réside le script en cours d'exécution ( voir ceci ). Donc , si vous avez tapé__dirname
dans/d1/d2/myscript.js
, la valeur serait/d1/d2
.En revanche,
.
vous donne le répertoire à partir duquel vous avez exécuté lanode
commande dans votre fenêtre de terminal (c'est-à-dire votre répertoire de travail) lorsque vous utilisez des bibliothèques commepath
etfs
. Techniquement, il commence comme votre répertoire de travail mais peut être modifié à l'aide deprocess.chdir()
.L'exception est lorsque vous utilisez
.
avecrequire()
. Le chemin à l'intérieurrequire
est toujours relatif au fichier contenant l'appel àrequire
.Par exemple...
Disons que la structure de votre répertoire est
et
pathtest.js
contientet vous faites
vous obtenez
Votre répertoire de travail est
/dir1/dir2
ainsi.
résolu. Puisquepathtest.js
se trouve dans/dir1/dir2
c'est ce qui se__dirname
résout également.Cependant, si vous exécutez le script à partir de
/dir1
vous obtenez
Dans ce cas, votre répertoire de travail était
/dir1
donc c'est ce qui a été.
résolu, mais__dirname
se résout toujours à/dir1/dir2
.Utilisation à l'
.
intérieurrequire
...Si l' intérieur
dir2/pathtest.js
vous avez unrequire
appel en inclure un fichier à l' intérieurdir1
vous toujours fairecar le chemin à l'intérieur
require
est toujours relatif au fichier dans lequel vous l'appelez. Cela n'a rien à voir avec votre répertoire de travail.la source
./
n'est pas toujours le répertoire à partir duquel le nœud a été lancé. Cela commence de cette façon, mais peut être modifié viaprocess.chdir()
. Il./
s'agit donc toujours du répertoire de travail actuel, qui est généralement le nœud de répertoire à partir duquel le nœud a été lancé, sauf si votre code a explicitement modifié le répertoire de travail.../someDir
dans un script et que vous allez exécuter la commande à partir d'un dossier différent?./
fait référence au répertoire de travail courant, sauf dans larequire()
fonction. Lors de l'utilisationrequire()
, il se traduit./
dans le répertoire du fichier actuel appelé.__dirname
est toujours le répertoire du fichier courant.Par exemple, avec la structure de fichiers suivante
/home/user/dir/files/config.json
/home/user/dir/files/somefile.txt
/home/user/dir/dir.js
Si
cd
j'entre/home/user/dir
et quenode dir.js
je cours, j'auraiMais quand je lance le même script que
/home/user/
je reçoisL'utilisation a
./
fonctionné avecrequire
mais pas pourfs.readFileSync
. C'est parce quefs.readFileSync
, se./
traduit par le cwd (dans ce cas/home/user/
). Et/home/user/files/somefile.txt
n'existe pas.la source
/movies
, mais comme mon module se trouve dans un fichier/custom_modules/
, il__dirname
essaie de récupérer le film depuis,/custom_modules/movies
./
ouprocess.cwd()
. voir nodejs.org/api/process.html#process_process_cwd