피드로 돌아가기
Node.js 18.19.0 (LTS)
Node.js BlogNode.js Blog
Backend

Node.js 18.19.0이 npm 10.2.3을 백포트하고 ES 모듈 로더 체인, import.meta.resolve(), --experimental-default-type 플래그를 추가해 모듈 시스템 유연성 확대

Node.js 18.19.0 (LTS)

2023년 11월 29일6intermediate

Context

Node.js 20에서 2개월간 검증된 npm 10이 18.x LTS 라인에 백포트되면서 모든 릴리스 라인이 지원되는 npm 버전을 확보하게 됐다. 기존 로더 시스템은 후속 로더 체인을 지원하지 않았고, 모듈 커스터마이제이션 훅과 메인 스레드 간의 통신 채널이 부재했다. CommonJS 우선 모듈 시스템으로 인해 명시적 타입 지정 없이는 .js 파일이 항상 CommonJS로 처리되었다.

Technical Solution

  • npm을 10.2.3으로 업그레이드: Node.js 20에서 검증된 버전을 백포트해 패키지 관리 기능 현대화
  • 로더 체인 활성화: --experimental-loader ts-node --experimental-loader loader-written-in-typescript처럼 다중 로더를 순차적으로 적용 가능하도록 변경 (#43772)
  • 모듈 훅 등록 API 도입: node:module의 register() API로 훅 파일을 지정하고 메인 스레드와 훅 스레드 간 MessageChannel 기반 통신 채널 구축 (#46826, #48842, #48559)
  • import.meta.resolve() 구현: ES 모듈에서 specifier를 절대 URL로 해석하는 기능 추가, CommonJS의 require.resolve()와 동등한 역할 수행 (#49028)
  • --experimental-default-type 플래그 도입: .js 확장자와 package.json type 필드가 없는 파일의 기본 모듈 타입을 CommonJS에서 ES 모듈로 변경 가능하게 함 (#49869)
  • 내장 test runner 다중 변경사항 백포트: 테스트 러너 기능 개선 사항들을 LTS에 적용

Key Takeaway

Node.js 18.19.0은 모듈 시스템의 제어 가능성과 호환성을 동시에 강화했다: register() API를 통한 명시적 훅 관리, 로더 체인으로 확장성 확보, --experimental-default-type으로 기존 CommonJS 프로젝트의 마이그레이션 경로를 제공함으로써 ES 모듈로의 점진적 전환을 지원한다.


Node.js 기반 프로젝트에서 커스텀 모듈 변환(TypeScript 컴파일, 경로 별칭 처리 등)이 필요한 경우, --import와 register()를 조합하면 진입점 실행 이전에 훅이 등록되므로 모든 모듈 해석 단계에서 커스터마이제이션을 일관되게 적용할 수 있다. --experimental-default-type=module을 사용하면 CommonJS 기반 기존 프로젝트를 .mjs 확장자 변경 없이 ES 모듈 런타임으로 전환할 수 있으므로, 대규모 모노레포의 단계적 마이그레이션 전략으로 활용 가능하다.

원문 읽기