Cloudflare Workers, Node.js 호환성 강화 위해 module registry 재작성
핵심 내용
Cloudflare Workers가 Node.js 호환성과 성능을 높이기 위해 module registry를 재작성하고 new_module_registry 플래그를 도입했다.
자세히 보기
Cloudflare Workers의 런타임 workerd가 Node.js와의 정밀한 호환성 및 속도 향상을 위해 module registry를 재작성했다. 이번 변경으로 서버리스 컨텍스트에서 모든 stable Node.js API가 기본 지원되며, 압축 번들 크기 제한이 제거되어 모든 플랜에서 최대 64 MiB까지 배포할 수 있게 되었다.
기존 방식의 한계와 새로운 설계
기존 런타임은 모듈 해석 일관성 부족으로 인해 esbuild 등을 사용해 의존성을 단일 파일로 번들링하는 방식을 채택했다. 이는 import.meta.resolve() 미지원 등 표준 호환성 문제를 피하기 위한 것이었으나, V8 isolate마다 소스를 중복 컴파일하고 메모리를 낭비하는 비효율을 초래했다.
새로운 registry는 URL을 specifier 포맷으로 채택하고, lazy compile과 cache sharing을 초기 설계에 반영했다. 이를 통해 Rolldown과 같은 최신 bundler가 변환을 줄이고 런타임의 모듈 해석 기능에 더 의존할 수 있게 되었다.
new_module_registry 플래그로 지원되는 기능
new_module_registry compatibility flag를 활성화하면 다음과 같은 개선 사항이 적용된다:
- import.meta 지원: import.meta.url, import.meta.main, **import.meta.resolve()**가 Node.js 및 브라우저 표준과 동일하게 동작한다.
- URL 기반 해석: 쿼리 문자열과 fragment를 포함한 실제 URL로 module specifier를 해석하며, percent-encoding 정규화 규칙을 준수한다.
- Import attributes 검증: with { type: 'json' } 등 이해하지 못하는 attribute 사용 시 예외를 발생시켜 스펙 위반을 방지한다.
- require(esm) 규칙 준수: CommonJS에서 ES module을 require할 때 Node.js의 규칙을 따르며, top-level await가 포함된 모듈은 require를 차단한다.
- WebAssembly 지원: source phase imports를 통해 컴파일된 WebAssembly.Module을 직접 import할 수 있다.
적용 및 주의사항
새로운 registry는 기존 registry와 병행 운영되며, 배포된 Worker는 기존 방식으로 동작한다. 새로운 기능을 사용하려면 new_module_registry flag를 명시적으로 추가해야 하며, 기본 활성화 날짜는 아직 정해지지 않았다. node: built-ins는 polyfill이 아닌 내장 module로 처리되어 접근 경로와 무관하게 동일한 instance로 해석된다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.