피드로 돌아가기
Node.js 23.5.0 (Current)
Node.js BlogNode.js Blog
Backend

Node.js 23.5.0이 module.registerHooks() API를 도입해 require()와 import 모두에서 동작하는 모듈 로더 커스터마이제이션 훅 제공

Node.js 23.5.0 (Current)

2024년 12월 19일6intermediate

Context

CJS 몽키패칭을 현대적인 로더 시스템으로 마이그레이션하려면 require()와 import를 모두 가로챌 수 있어야 하는데, 기존 module.register() 훅은 require() 또는 createRequire()를 완전히 커버하지 못했다. 또한 오프스레드 실행으로 인해 디버깅이 어렵고 데드락 문제가 발생했다.

Technical Solution

  • module.registerHooks() 도입: 동일 스레드에서 require(), import, createRequire()로 로드되는 모든 모듈에 대해 resolve 및 load 훅을 등록
  • resolve 훅: 모듈 경로 지정자(specifier)를 변환하여 실제 로드될 모듈 경로를 재지정 (예: 'foo'를 'bar'로 교체)
  • load 훅: 로드된 모듈의 소스 코드를 변환하여 반환 (예: 소스 코드 내 특정 값 치환)
  • 온스레드 실행: resolve/load 훅을 모듈이 로드되는 동일 스레드에서 실행하여 console.log() 손실 방지 및 디버깅 용이성 향상
  • 직접 함수 전달: 중간 로더 패키지가 훅이 인식할 수 없는 파일(설정 파일 등)에서 사용자 옵션을 가져올 수 있도록 함수 객체를 직접 registerHooks()에 전달 가능

Impact

해당 섹션에 정량적 수치 없음

Key Takeaway

오프스레드 실행으로 인한 디버깅 어려움과 데드락 문제를 동일 스레드 실행으로 해결하고, 기존 CJS 몽키패칭 패턴의 사용성을 유지하면서 현대적 ES 모듈 시스템과 통합할 수 있는 설계 원칙을 제시했다.


CommonJS 기반의 기존 레거시 프로젝트에서 require() 호출을 가로채 동적으로 모듈 경로나 코드를 변환해야 한다면, Node.js

2

3.

5.0의 module.registerHooks()를 사용하여 동일 스레드에서 resolve/load 훅을 등록하면 ES 모듈과 CJS 모두에 대한 일관된 인터셉션을 구현하고 디버깅할 수 있다.

원문 읽기