Суть
В 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всегда относительно файла, в котором вы его вызываете. Это не имеет ничего общего с вашим рабочим каталогом.