피드로 돌아가기
Node.js BlogBackend
원문 읽기
Node.js가 require(esm) 기능을 v20.19.0에서 실험 플래그 제거로 안정화하여 CommonJS와 ES 모듈 간 상호운용성 확대
Node.js 20.19.0 (LTS)
AI 요약
Context
Node.js v20.x는 유지보수 모드(패치만 허용)였으나, require(esm) 기능의 생태계 영향도가 커서 예외적으로 마이너 릴리스를 진행했다. 기존에는 --experimental-require-module 플래그 뒤에만 이 기능이 존재해 프로덕션 도입이 제한되었다.
Technical Solution
- require(esm) 기능을 기본 활성화: v20.x에서 --experimental-require-module 플래그 제거하고 경고 메시지도 --trace-require-module 명시 시에만 발생
- 에러 처리 개선: require()로 ES 모듈을 로드할 때 ERR_REQUIRE_ESM 대신, top-level await 포함 모듈은 ERR_REQUIRE_ASYNC_MODULE으로 구분
- 네임스페이스 객체 반환: require()로 로드된 ES 모듈은 import()와 동일한 ES 모듈 네임스페이스 객체 또는 모듈의 "module.exports" 반환
- 기능 감지 메커니즘: process.features.require_module로 현재 인스턴스에서 require(esm) 활성화 여부 확인 가능
- "module-sync" exports 조건 추가: 패키지가 require(esm) 지원 여부를 감지하고 require()와 import 모두로 로드 가능한 방식 제공
- 모듈 구문 자동 감지 활성화: --experimental-detect-module 플래그를 기본값으로 설정하여 .js 확장자 또는 확장자 없는 파일에서 CommonJS 파싱 실패 시 자동으로 ES 모듈로 재시도
- 비활성화 옵션 제공: --no-experimental-require-module 플래그로 기능 비활성화 가능
Impact
모듈 구문 감지는 CommonJS 모듈에서 성능 영향 없음, ES 모듈에서는 약간의 성능 저하 발생 (package.json에 "type": "module" 추가 시 비용 제거 가능)
Key Takeaway
호환성 깨지는 변화도 생태계 영향도가 충분히 크면 유지보수 모드 규칙을 예외 처리할 수 있으며, 자동 감지와 명시적 비활성화 옵션을 함께 제공하면 마이그레이션 부담을 크게 줄일 수 있다.
실천 포인트
CommonJS와 ES 모듈을 혼용하는 Node.js 애플리케이션에서 require(esm)를 v
2
0.
1
9.0 이상으로 업그레이드하면 플래그 없이 native ES 모듈을 동기적으로 로드할 수 있으므로, 단계적 모듈 마이그레이션 전략을 수립할 때 추가 비용 없이 두 모듈 시스템을 병행할 수 있다.