[node.js] node.js에서 __dirname과 ./의 차이점은 무엇입니까?

Node.js에서 프로그래밍하고 현재 디렉토리와 관련이있는 파일을 참조 할 때 __dirname일반 변수 대신 변수 를 사용해야하는 이유가 ./있습니까? 나는 지금까지 내 코드에서 ./를 사용하고 있으며의 존재를 발견했으며 __dirname본질적으로 내 ./를 그로 변환하는 것이 똑똑한 지 알고 싶습니다. 그렇다면 똑똑한 아이디어가되는 이유는 무엇입니까? .



답변

요점

Node.js에서 __dirname항상 현재 실행중인 스크립트가있는 디렉토리입니다 ( 참조 ). 사용자가 입력 그래서 만약 __dirname/d1/d2/myscript.js, 값이 될 것이다 /d1/d2.

반대로 and와 같은 라이브러리를 사용할 때 터미널 창에서 명령 .을 실행 한 node디렉토리 (예 : 작업 디렉토리)를 제공합니다 . 기술적으로 작업 디렉토리로 시작하지만을 사용하여 변경할 수 있습니다 .pathfsprocess.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존재하지 않습니다.


답변