본문 바로가기
개발 · IT/백엔드

Node.js 모듈 전쟁: CJS vs ESM, 지금 시작할 때 선택은?

by 플라퉁 2025. 10. 30.
반응형

IT 썸네일 이미지
IT 썸네일 이미지

1️⃣ CommonJS (CJS)

특징

  • require() / module.exports 방식
  • Node.js 역사상 기본 모듈 시스템
  • 모든 Node.js 버전에서 호환됨

장점

  • 기존 레거시 패키지와 호환성 좋음
  • 익숙한 문법, 빠른 개발 가능
  • __dirname, __filename 사용 용이

단점

  • 브라우저 환경과 호환 어려움
  • 트리쉐이킹(tree-shaking) 불가능 → 번들 최적화 어려움
  • 점점 ESM 중심으로 패키지들이 업데이트됨

2️⃣ ES Modules (ESM)

특징

  • import / export 방식
  • 최신 Node.js(12+ 이상)에서 정식 지원
  • 브라우저 JS와 동일한 모듈 시스템

장점

  • 브라우저 코드와 동일 문법 → isomorphic JS 개발 가능
  • 트리쉐이킹 지원 → 번들 최적화, Tree-shaking 가능
  • 최신 라이브러리 대부분 ESM 지원

단점

  • 기존 CJS 패키지 import 시 createRequire 필요
  • __dirname, __filename 사용 시 별도 처리 필요
  • 초기 설정(package.json에 "type": "module") 필요

3️⃣ 요즘 추천 방식

기준추천

 

신규 프로젝트 ESM
레거시 프로젝트 유지보수 CJS
브라우저와 공유/번들 예정 ESM
라이브러리 사용 호환성 혼합 가능 (ESM + CJS)

 

현실적 결론:

  • Node.js 최신 프로젝트 → ESM 기준으로 시작하는 게 장기적으로 유리
  • 단, 패키지 호환성, 레거시 코드 존재 시 CJS 고려
  • 혼합 가능 → ESM 프로젝트 안에서 CJS 패키지 import {createRequire} from 'module' 사용 가능

💡 추가 팁

  • package.json → "type": "module" 설정 시 .js 파일은 ESM으로 인식
  • 파일별로 ESM/CJS 혼합 가능 → 점진적 마이그레이션 가능
  • ES2022 이후 Node.js 기준 → 거의 모든 기능 지원

 

 

반응형

댓글