피드로 돌아가기
Node.js BlogBackend
원문 읽기
Node.js 20.10.0이 --experimental-default-type 및 --experimental-detect-module 플래그로 CommonJS 기본값 시스템 전환 및 자동 모듈 타입 감지 지원
Node.js 20.10.0 (LTS)
AI 요약
Context
Node.js는 역사적으로 CommonJS를 암묵적 기본값으로 사용해 왔으나, ES 모듈 채택 확대에 따라 명시적 패키지 설정 없이도 모듈 타입을 유연하게 처리해야 하는 요구가 증대했다. 사용자가 package.json의 "type" 필드 또는 파일 확장자(.mjs, .cjs)를 명시하지 않은 .js 파일과 확장자 없는 파일의 모듈 타입 해석이 일관성 없이 처리되고 있었다.
Technical Solution
- --experimental-default-type=module 플래그 도입: 명시적 선언이 없는 경우 Node.js의 기본 모듈 시스템을 CommonJS에서 ES 모듈로 전환 가능하게 설정 (이미 명시된 타입은 영향 없음)
- string input 및 무확장 파일 처리: --eval 또는 STDIN으로 제공되는 문자열 입력, 상위 폴더에 package.json이 없는 경우의 .js 또는 무확장 파일을 ES 모듈로 해석
- --experimental-detect-module 플래그 추가: 파일을 파싱하여 ES 모듈 문법 자동 감지 후 문법 발견 시 ES 모듈로, 미발견 시 CommonJS로 실행
- Wasm 파일 감지 확장: --experimental-wasm-modules 플래그 사용 시 무확장 파일이 Wasm 매직 바이트 헤더를 포함하면 WebAssembly로 해석
- fs.writeFile 계열 함수 flush 옵션 추가: 'flush' 옵션을 통해 성공적 쓰기 작업 완료 후 데이터를 영구 저장소에 명시적으로 플러시하는 기능 제공
- WebSocket 글로벌 객체 지원: --experimental-websocket 플래그로 WHATWG 표준 WebSocket 글로벌 추가
- vm.Script 컴파일 캐시 복구: importModuleDynamically 옵션 사용 시에도 --experimental-vm-modules를 사용하지 않으면 V8 컴파일 캐시 재사용 가능하도록 수정 (v16.x 이후 발생한 성능 저하 해결)
Impact
vm.Script의 컴파일 캐시 복구로 인해 v16.x에서 업그레이드하지 못했던 사용자(특히 Jest 사용자)가 성능 저하 없이 업그레이드 가능해짐.
Key Takeaway
Node.js의 모듈 시스템 기본값 전환은 명시적 package.json "type" 필드 설정을 통한 옵트아웃 메커니즘과 함께 제공되며, 감지 기능은 startup time 증가를 야기하므로 패키지 저자들은 기본값이라도 명시적으로 "type" 필드를 추가할 것이 권장된다.
실천 포인트
Node.js 패키지 개발 시 .js 또는 무확장 파일 사용 시에도 package.json에 명시적으로 "type": "commonjs" 또는 "type": "module" 필드를 추가하면 --experimental-detect-module의 파싱 오버헤드를 회피하고 모듈 타입을 명확히 할 수 있다.