Node.js에서 프로그래밍하고 현재 디렉토리와 관련이있는 파일을 참조 할 때 __dirname
일반 변수 대신 변수 를 사용해야하는 이유가 ./
있습니까? 나는 지금까지 내 코드에서 ./를 사용하고 있으며의 존재를 발견했으며 __dirname
본질적으로 내 ./를 그로 변환하는 것이 똑똑한 지 알고 싶습니다. 그렇다면 똑똑한 아이디어가되는 이유는 무엇입니까? .
답변
요점
Node.js에서 __dirname
항상 현재 실행중인 스크립트가있는 디렉토리입니다 ( 참조 ). 사용자가 입력 그래서 만약 __dirname
에 /d1/d2/myscript.js
, 값이 될 것이다 /d1/d2
.
반대로 and와 같은 라이브러리를 사용할 때 터미널 창에서 명령 .
을 실행 한 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
는 항상 경로 를 호출하는 파일과 관련이 있기 때문 입니다. 작업 디렉토리와 관련이 없습니다.
답변
./
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'));
나는 경우 cd
에 /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
, ./
(이 경우 CWD로 변환 /home/user/
). 그리고 /home/user/files/somefile.txt
존재하지 않습니다.