Суть
В Node.js __dirname
- это всегда каталог, в котором находится исполняемый в данный момент скрипт ( см. ).Поэтому, если вы ввели __dirname
в /d1/d2/myscript.js
, значение будет /d1/d2
.
. В отличие от этого, .
дает вам каталог, из которого вы запустили команду node
в окне терминала (т.е. ваш рабочий каталог), когда вы используете такие библиотеки, как path
и fs
.Технически, он начинается как ваш рабочий каталог, но может быть изменен с помощью process.chdir()
.
Исключение составляют случаи, когда вы используете .
с require()
.Путь внутри require
всегда относительно файла, содержащего вызов require
.
Например ...
Допустим, ваша структура каталогов
/dir1
/dir2
pathtest.js
и pathtest.js
содержит
var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));
, и вы делаете
cd /dir1/dir2
node pathtest.js
, вы получаете
. = /dir1/dir2
__dirname = /dir1/dir2
Ваш рабочий каталог /dir1/dir2
, вот что .
разрешает до.Так как pathtest.js
находится в /dir1/dir2
, к этому разрешается и __dirname
.
Однако, если вы запустите скрипт из /dir1
cd /dir1
node dir2/pathtest.js
, вы получите
. = /dir1
__dirname = /dir1/dir2
В этом случае ваш рабочий каталог был /dir1
, поэтому .
разрешено, но __dirname
все еще разрешается в /dir1/dir2
.
Использование .
внутри require
...
Если внутри dir2/pathtest.js
у вас есть require
вызов, чтобы включить файл внутри dir1
, вы бы всегда делали
require('../thefile')
потому что путь внутри require
всегда относительно файла, в котором вы его вызываете.Это не имеет ничего общего с вашим рабочим каталогом.