기본 패턴
javascript
import { fileURLToPath } from "node:url";
const __filename = fileURLToPath(import.meta.url);설명
- ESM으로 넘어오면 가장 먼저 부딪히는 차이 중 하나가
__filename과__dirname이 없다는 점입니다. ESM은 CommonJS와 다른 메타데이터 모델을 쓰기 때문입니다. import.meta.url은 현재 모듈의file:URL을 나타내며, ESM 환경에서 자기 파일 위치를 기준으로 다른 자원을 읽을 때 핵심 출발점이 됩니다.- 현대 Node에서는
import.meta.dirname,import.meta.filename도 지원하지만,fileURLToPath(import.meta.url)패턴은 더 넓은 버전 호환성과 생태계 관성 때문에 여전히 많이 보입니다. - 중요한 점은 ESM의 경로 해석이 "파일 시스템 문자열"보다 "URL 의미론"에 더 가깝다는 것입니다. 그래서 상대 경로 처리와 자원 로딩을 볼 때도 URL 기반 사고가 필요합니다.
- 이 카드는 경로 유틸 팁이 아니라 ESM 감각 전환에 가깝습니다. CommonJS에서 파일 경로를 다루던 방식과 ESM에서의 기준점이 다르다는 점을 먼저 잡아야 합니다.
빠른 정리
| 요소 | 의미 |
|---|---|
import.meta.url | 현재 모듈의 file: URL |
fileURLToPath() | URL을 파일 시스템 경로 문자열로 변환 |
import.meta.dirname | 현대 Node에서 제공되는 디렉터리 경로 메타 |
| 핵심 차이 | ESM은 URL 기반 사고가 기본 |
| 잘 맞는 사용처 | 상대 자원 로딩, 워커/서브모듈 경로 구성 |
주의할 점
ESM 코드에서 CommonJS 경로 습관을 그대로 가져오면 상대 경로와 확장자 해석에서 바로 꼬이기 쉽습니다.
특히 워커 경로나 파일 읽기 기준점을 만들 때 import.meta.url을 먼저 떠올리는 편이 좋습니다.
참고 링크
2 sources