В чем разница между __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
не существует.
Как в Node.js "подключить" функции из других файлов?
Node / Express: EADDRINUSE, адрес уже занят - как остановить процесс, использующий порт?
Как задать переменные окружения из файла package.json?
Как указать необходимую версию Node.js в файле package.json?
Разница между "require(x)" и "import x"