module scope에서 실행 파일 경로를 얻어보자!
node type: module
npm 라이브러리들의 docs를 보다보면 commonJS보다 ES module을 사용하는 것을 자주 볼 수 있었다. 이왕 이렇게 된거 node 버전을 16에서 17로 업그레이드 하고 type을 commonJ에서 ES module로 사용하기로 했다. 업그레이드하고 require들을 모두 import, export로 바꾼뒤 실행해보니 __dirname이 정의되어 있지 않단다. ES module에서는 어떻게 바뀐건지 확인해보자.
ES module에서 cwd(), import.meta.url, path.resolve()
먼저 공식문서를 확인해 보자 ES module과 commonJS의 차이는 노드 공식문서에서 확인 할 수 있다.
공식문서에서 권장하는 방법은 import.meta.url이다. 콘솔로 찍어 확인해보자.
.
├── a
│ └── test.js
├── ex.js
ex.js
import './a/test.js';
import path from 'path';
import { cwd } from 'process';
console.log('-----ex.js-----');
console.log('meta.url: ' + import.meta.url);
console.log('path.resolve(): ' + path.resolve());
console.log('cwd: ' + cwd());
test.js
import path from 'path';
import { cwd } from 'process';
console.log('----test.js-----');
console.log('meta.url: ' + import.meta.url);
console.log('path.resolve(): ' + path.resolve());
console.log('cwd: ' + cwd());
ex.js와 test.js를 만들어 test.js를 ex.js에 import한뒤 ex.js를 실행해보자.
path.resolve()와 process.cwd()는 ex.js의 경로를 나타내고 있다. 즉 entry point 파일의 directory 경로다.
import.meta.url은 실제 import.meta.url을 호출한 파일의 경로다.
ES module에서 __dirname
따라서 해당 파일의 경로를 사용하는 __dirname을 ES module에서 사용하고 싶다면 import.meta.url을 사용하면 된다. 하지만 import.meta.url은 basename과 file:///가 붙어나와 commonJS의 __dirname과는 차이가 있다.
__dirname과 완벽하게 같고싶다면 path.dirname(fileURLToPath(import.meta.url))을 사용하면 된다.
console.log('----test.js-----');
import path from 'path';
import { fileURLToPath } from 'url';
const metaUrl = import.meta.url;
console.log('meta.url: ' + metaUrl);
console.log('__dirname: ' + path.dirname(fileURLToPath(metaUrl)));
import './a/test.js';
import path from 'path';
import { fileURLToPath } from 'url';
console.log('-----ex.js-----');
const metaUrl = import.meta.url;
console.log('meta.url: ' + metaUrl);
console.log('__dirname: ' + path.dirname(fileURLToPath(metaUrl)));
결과
정리
entry point 경로: process.cwd(), path.resolve()
현재 파일 경로: __dirname, import.meta.url
import.meta.url === `file://${__dirname}/${basename}` 이므로
__dirname === path.dirname(fileURLToPath(import.meta.url))
'Node.js' 카테고리의 다른 글
[Web Socket] ws 모듈을 이용한 웹 채팅방 구현(without socket.io) (0) | 2022.03.12 |
---|---|
[Nodejs] passport.js 소스코드 까보기 (0) | 2022.02.27 |