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


498

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


47
tl; dr : 기본적으로 차이점은 './'와 'process.cwd ()'는 스크립트를 호출하는 터미널의 현재 디렉토리를 참조하지만 '__dirname'은 스크립트가있는 디렉토리를 나타냅니다 저장되었습니다.
Gui Imamura

1
when .가 사용될 때를 제외하고require . 내부 경로 require는 항상에 대한 호출이 포함 된 파일을 기준으로합니다 require.
Govind Rai

답변:


814

요점

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는 항상 경로 를 호출하는 파일과 관련이 있기 때문 입니다. 작업 디렉토리와 관련이 없습니다.


38
IMO,이 설명은 허용 된 답변의 설명보다 약간 명확합니다 ( "현재 디렉토리"는 약간 모호합니다).
화신

5
동의한다. 수락 된 답변을 변경하겠습니다. 이 답변은 원래 답변이 수락 된 후 2.5 년 후에 추가되었으며 지금은 2 년 후인 것만 알았습니다. :) 안하는 것보다 늦게하는 것이 낫다!
thisissami

14
그 지적이의 가치는 ./아니다 항상 노드에서 시작되었다 디렉토리. 그런 식으로 시작하지만을 통해 변경할 수 있습니다 process.chdir(). 따라서 ./코드가 작업 디렉토리를 명시 적으로 변경하지 않는 한 항상 현재 작업 디렉토리이며 일반적으로 디렉토리 노드가 시작된 디렉토리입니다.
gilly3 2016 년

3
Using에 대해 약간 혼란 스럽습니다. 내부 요구 부분, 내부 경로가 항상 호출중인 파일과 관련이 있으면 경로가 require ( '../ dir1 / thefile') 대신 require ( '../ thefile')가 아니어야합니까? 나는 .. 경로의 현재 위치를 dir2에서 dir1로 한 단계 뒤로 가져 왔다고 생각했다. 여전히 dir1을 경로에 넣어야합니까, 아니면 뭔가 이해가되지 않습니까?
andromada

1
../someDir일부 스크립트에서 사용해야 하고 다른 폴더에서 명령을 실행하려는 경우 어떻게해야 합니까?
cbdeveloper 2016

154

./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존재하지 않습니다.


오 __dirname이 현재 작업 디렉토리라고 생각했습니다. 설명해 주셔서 감사합니다!
thisissami

fs로 앱의 작업 디렉토리를 참조하는 방법이 있습니까? 예를 들어, 내가 작업 디렉토리에서 파일을로드하기 위해 노력하고있어 /movies,하지만 내 모듈 파일에 있기 때문에 /custom_modules/, __dirname시도는에서 영화, 잡아/custom_modules/movies

2
당신은 사용할 수 있습니다 ./또는 process.cwd(). 참조 nodejs.org/api/process.html#process_process_cwd
fent

require 문에서 __dirname over ./를 사용하는 것은 좋은 생각 이 아닙니다 . 노드에서 동일하게 작동하지만 쉽게 피할 수있는 패키지의 browserify 빌드에 문제가 발생할 수 있기 때문입니다.
Jed Watson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.