피드로 돌아가기
Node.js BlogBackend
원문 읽기
Node.js 22.12.0이 require()로 native ES module 로딩을 실험 플래그 제거로 정식 지원하며 동시에 resizable ArrayBuffer를 Buffer와 동기화
Node.js 22.12.0 (LTS)
AI 요약
Context
Node.js v20.x와 v22.x에서 native ES module을 require()로 로드하는 기능이 --experimental-require-module 플래그 뒤에만 존재했으므로 프로덕션 환경에서 사용하기 어려웠다. Buffer가 resizable ArrayBuffer에서 생성될 때 기본 ArrayBuffer 크기 변경 시 동기화되지 않아 메모리 상태 불일치가 발생했다.
Technical Solution
- require()로 native ES module 로드 기능을 v22.x에서 플래그 없이 기본 활성화: v23.x 수준의 기본 지원으로 통일
- ERR_REQUIRE_ESM 예외를 제거하고 대신 top-level await 포함 시에만 ERR_REQUIRE_ASYNC_MODULE 예외 발생으로 세분화
- require(esm) 반환값을 ES module namespace 객체 또는 module.exports 직렬화 형식으로 이원 지원
- "module-sync" exports condition 추가로 require(esm) 지원 여부 감지 및 require/import 통합 로드 가능
- process.features.require_module 플래그로 현재 Node.js 인스턴스에서 require(esm) 활성화 여부 확인 가능하게 제공
- Buffer가 resizable ArrayBuffer로 생성되면 ArrayBuffer.resize() 호출 시 Buffer.byteLength가 자동 동기화되도록 수정
- --no-experimental-require-module 플래그로 기능 비활성화 옵션 제공하여 회귀 발생 시 회피 경로 제시
Key Takeaway
CommonJS와 ES Module의 경계를 require()로 넘을 수 있게 함으로써 Node.js 패키지 생태계에서 모듈 이원화 대응을 한 단계 단순화했으며, 동시에 메모리 버퍼 동기화로 동적 메모리 재할당 환경에서의 예측 가능성을 확보했다.
실천 포인트
CommonJS 환경에서 ES module 의존성을 가진 패키지를 유지보수하는 경우, 노드
2
2.
1
2.0 이상으로 업그레이드한 뒤 require()로 직접 ES module을 로드할 수 있으므로 트랜스파일 또는 프록시 래퍼 제거로 빌드 복잡도를 감소시킬 수 있다. 또한 메모리 재할당이 필요한 임베디드 또는 WebAssembly 상호작용 환경에서는 resizable ArrayBuffer 기반 Buffer가 이제 크기 변경 추적을 자동 처리하므로 수동 재생성 로직을 제거할 수 있다.