Суть
У 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завжди відносно файлу, в якому ви його викликаєте. Це не має нічого спільного з вашим робочим каталогом.