В чем разница между __dirname и ./ в Node.js?
При написании кода на Node.js и обращении к файлам, расположенным относительно вашей текущей директории, есть ли смысл использовать переменную __dirname вместо обычного ./? Я до недавнего времени использовал ./ в своем коде и только что узнал о существовании __dirname. В основном, хочу понять, стоит ли заменять ./ на __dirname, и если да, то почему это будет хорошей идеей.
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 не существует.
Как узнать версию установленного npm пакета?
Как в Node.js "подключить" функции из других файлов?
Как задать переменные окружения из файла package.json?
Самый быстрый способ скопировать файл в Node.js
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"