피드로 돌아가기
Node.js 22.10.0 (Current)
Node.js BlogNode.js Blog
Backend

Node.js 22.10.0이 module-sync 내보내기 조건을 도입해 require(esm) 지원 시 CJS와 ESM 이중 패키징 문제 해결

Node.js 22.10.0 (Current)

2024년 10월 16일6intermediate

Context

Node.js에서 require(esm) 기능이 도입되면서 패키지 작성자들이 CJS와 ESM을 동시에 지원해야 하는 이중 패키징 문제(dual-package hazard)에 직면했다. 기존 번들러들의 "module" 조건만으로는 Node.js 네이티브 로더의 ESM 해석 규칙(예: 확장자 없는 import 금지) 차이로 인해 완벽한 지원이 불가능했다.

Technical Solution

  • "module-sync" 내보내기 조건 추가: require(esm)이 활성화된 환경에서 동기식 ESM을 제공하도록 설정
  • 조건부 exports 구조로 구현: Node.js 버전별로 다른 진입점 지정 가능 (module-sync → ESM, default → CJS)
  • "module" 조건과 별도 이름 사용: Node.js ESM 해석 규칙(CJS 스타일 모듈 해석 미지원)을 강제하기 위해 기존 "module" 조건 재사용 회피
  • Semver-minor 변경으로 구현: 이전 LTS 버전으로 백포팅 가능하도록 설계
  • 패키지 작성자용 마이그레이션 경로 제공: require(esm) 미지원 구 버전 지원 종료 시 exports 조건 단순화 가능

Key Takeaway

Node.js의 네이티브 ESM 로더와 번들러의 모듈 해석 규칙 차이를 인정하고 별도의 조건으로 분리하면, 하위호환성을 유지하면서도 패키지 작성자에게 명확한 기능 감지 메커니즘을 제공할 수 있다.


ESM-first 패키지를 배포하는 작성자들은 package.json의 exports에 "module-sync" 조건을 추가해 require(esm)을 지원하는 Node.js

2

2.

1

0.0+ 환경에서 ESM을 제공하고, 구 버전에서는 CJS 진입점으로 자동 폴백되도록 설정함으로써 이중 패키징 위험을 회피할 수 있다.

원문 읽기