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

Node.js 23.0.0이 require(esm) 기능을 기본값으로 활성화해 ES 모듈을 CommonJS require()로 직접 로드 가능하게 변경

Node.js 23.0.0 (Current)

2024년 10월 16일6intermediate

Context

기존에는 Native ES 모듈을 require()로 로드할 때 ERR_REQUIRE_ESM 에러가 발생하였으며, 이 기능을 사용하려면 --experimental-require-module 플래그를 명시적으로 사용해야 했다. Node.js 20.x와 22.x에서는 실험적 기능으로만 제공되어 프로덕션 환경에서 ES 모듈과 CommonJS의 모듈 시스템 간 혼합 사용이 제한되었다.

Technical Solution

  • require(esm) 기능 기본값 활성화: v23.x부터 --experimental-require-module 플래그 없이 ES 모듈을 require()로 로드 가능
  • 비동기 모듈 검증 강화: top-level await를 포함한 ES 모듈 로드 시 ERR_REQUIRE_ASYNC_MODULE 에러로 구분하여 더 명확한 오류 처리 제공
  • 모듈 네임스페이스 객체 반환: require()로 로드된 ES 모듈은 import()와 동일한 ES 모듈 네임스페이스 객체 반환
  • 호환성 감지 메커니즘 제공: process.features.require_module 플래그와 "module-sync" 내보내기 조건으로 require(esm) 지원 여부를 런타임에 감지
  • 비활성화 옵션 제공: --no-experimental-require-module 플래그로 필요 시 기능 비활성화 가능
  • 실험적 경고 발생: v23.x에서 처음 require()로 ES 모듈을 로드할 때 실험적 기능 경고 메시지 출력
  • Windows 32비트 지원 제거: Windows 32비트 시스템에 대한 공식 지원 중단
  • node --run 명령 안정화: 이전 실험적 기능을 정식 기능으로 전환
  • 테스트 러너 개선: 커버리지 파일에 대한 glob 패턴 지원 추가

Impact

아티클에 정량적 성능 지표가 없음

Key Takeaway

Node.js는 v23에서 require(esm) 기능을 기본값으로 활성화하여 모듈 시스템 간 혼용성을 증진하되, 실험적 경고와 --no-experimental-require-module 옵션으로 단계적 안정화를 진행하고 있다. 패키지 개발자는 "module-sync" 내보내기 조건을 사용해 동일한 ES 모듈을 require()와 import()로 모두 로드할 수 있도록 지원할 수 있다.


CommonJS 의존도가 높은 Node.js 프로젝트에서 ES 모듈로의 마이그레이션 시, v23 이상으로 업그레이드하면 require(esm) 기본 활성화로 인해 require()와 import()를 동시에 사용 가능하므로 단계적 마이그레이션이 용이해진다. 라이브러리 개발자는 process.features.require_module을 검사하거나 "module-sync" 내보내기 조건으로 양쪽 방식을 모두 지원하는 버전 관리 전략을 수립할 수 있다.

원문 읽기