피드로 돌아가기
Node.js 22 is now available!
Node.js BlogNode.js Blog
Backend

Node.js가 22 버전 출시로 require()를 통한 ESM 지원, WebSocket 클라이언트 기본 활성화, V8 12.4 업그레이드를 통한 성능 개선 제공

Node.js 22 is now available!

2024년 4월 24일7intermediate

Context

Node.js 애플리케이션에서 CommonJS와 ES Module 간의 상호운용성 제한이 있었으며, 외부 의존성 없이 WebSocket 클라이언트를 사용할 수 없었다. 또한 기존 스트림의 High Water Mark 설정(16KiB)이 메모리 활용 최적화 기회를 제한했다.

Technical Solution

  • require() 함수로 동기 ESM 로드 지원: --experimental-require-module 플래그 하에서 package.json에 "type": "module" 지정되고 top-level await가 없는 ESM을 require()로 로드 가능
  • WebSocket 클라이언트를 기본 활성화: 이전 --experimental-websocket 플래그에서 정식 기능으로 변경하여 외부 의존성 없이 WebSocket 클라이언트 제공
  • V8 엔진을 12.4로 업그레이드: WebAssembly Garbage Collection, Array.fromAsync, Set 메서드, iterator 헬퍼 추가
  • Maglev 컴파일러를 기본 활성화: 지원 아키텍처에서 자동 활성화하여 단기 실행 CLI 프로그램 성능 향상
  • 스트림 기본 High Water Mark를 16KiB에서 64KiB로 증가: 메모리 사용량 증가를 감수하고 전반적 성능 향상
  • node --run 스크립트 실행 기능 추가: package.json의 스크립트를 CLI를 통해 직접 실행 가능 (node --run test 포함)
  • Watch Mode를 정식 기능으로 변경: 감시 파일 변경 시 Node.js 프로세스 자동 재시작
  • node:fs 모듈에 glob/globSync 함수 추가: 파일 경로 패턴 매칭 기능 제공
  • AbortSignal 인스턴스 생성 효율성 향상: fetch와 test runner에서 성능 개선

Key Takeaway

Node.js 22는 기존 CommonJS 기반 프로젝트의 점진적 마이그레이션을 지원하면서(require() ESM 로드), 동시에 V8 최적화와 스트림 기본값 조정으로 성능 향상을 달성했으며, 10월 LTS 전환 전 6개월간 검증 기간을 제공한다.


CommonJS 기반의 레거시 Node.js 프로젝트에서 점진적으로 ES Module로 전환하려는 팀은 Node.js 22의 --experimental-require-module 플래그를 활용하면 전체 프로젝트 재작성 없이 동기 ESM 모듈을 부분적으로 로드할 수 있다. 또한 메모리 제약이 심한 환경(임베디드, 엣지 컴퓨팅)에서는 setDefaultHighWaterMark()로 스트림 버퍼 크기를 명시적으로 제어해야 한다.

원문 읽기