5

В чем разница между __dirname и ./ в Node.js?

15

При написании кода на Node.js и обращении к файлам, расположенным относительно вашей текущей директории, есть ли смысл использовать переменную __dirname вместо обычного ./? Я до недавнего времени использовал ./ в своем коде и только что узнал о существовании __dirname. В основном, хочу понять, стоит ли заменять ./ на __dirname, и если да, то почему это будет хорошей идеей.

1 ответ(ов)

1

./ обозначает текущую рабочую директорию, за исключением функции require(). При использовании require() ./ интерпретируется как директория текущего файла, в котором он вызывается. В то время как __dirname всегда указывает на директорию текущего файла.

Рассмотрим следующий пример структуры файлов:

/home/user/dir/files/config.json
{
  "hello": "world"
}
/home/user/dir/files/somefile.txt
text file
/home/user/dir/dir.js
var fs = require('fs');

console.log(require('./files/config.json'));
console.log(fs.readFileSync('./files/somefile.txt', 'utf8'));

Если я перейду в директорию /home/user/dir и запущу node dir.js, я получу следующий вывод:

{ hello: 'world' }
text file

Но если я выполню тот же скрипт из директории /home/user/, я получу:

{ hello: 'world' }

Error: ENOENT, no such file or directory './files/somefile.txt'
    at Object.openSync (fs.js:228:18)
    at Object.readFileSync (fs.js:119:15)
    at Object.<anonymous> (/home/user/dir/dir.js:4:16)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)
    at EventEmitter._tickCallback (node.js:192:40)

В данном случае ./ работал в require, но не с fs.readFileSync. Это происходит потому, что для fs.readFileSync ./ преобразуется в текущую рабочую директорию (в данном случае /home/user/). А файл /home/user/files/somefile.txt не существует.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь