피드로 돌아가기
Dev.toInfrastructure
원문 읽기
Chromium 대비 30배 가벼운 10MB Rust 기반 Headless JS Renderer 구현
rakers — a headless JS renderer in Rust
AI 요약
Context
클라이언트 사이드 렌더링(CSR) 사이트의 콘텐츠 추출을 위해 Puppeteer와 같은 Headless Browser가 사용됨. 하지만 300MB 이상의 무거운 Footprint와 느린 Cold Start 시간이 CI 환경 및 경량 프로세싱에서 병목 지점으로 작용함.
Technical Solution
- Layout Engine과 GPU Compositing 등 불필요한 브라우저 기능을 제거하고 DOM 생성과 JS 실행에만 집중한 Minimalist 설계
- html5ever를 활용해 HTML을 DOM Tree로 파싱하고, QuickJS(rquickjs)를 통해 ES2023 표준의 JS 실행 환경 구축
- 프레임워크 호환성을 위해 필수 DOM API(createElement, querySelector 등)를 JavaScript Stub으로 구현하여 주입하는 방식 채택
- ureq 기반의 동기적 Rust Fetch를 통해 XHR 요청을 처리함으로써 런타임 템플릿 로드 가능 구조 설계
- C 컴파일러 없는 환경을 위한 boa_engine 백엔드 옵션을 제공하여 배포 유연성 확보
Impact
- 바이너리 크기를 300MB(Chrome)에서 10MB 수준으로 약 96% 감축
- 브라우저 기동 시간(1~2초)을 제거하여 실행 속도 및 배포 효율성 대폭 개선
- TodoMVC 23개 구현체 중 21개(약 91%)의 호환성을 검증하여 범용적 JS 렌더링 성능 확보
Key Takeaway
특정 목적(콘텐츠 추출)을 위해 전체 스택(Full Browser)이 아닌 필요한 최소 기능 집합(DOM Stub + JS Engine)만을 추상화하여 리소스 효율성을 극대화하는 Lean Architecture의 전형적인 사례임.
실천 포인트
- Headless Browser 도입 전, CSS Layout이나 GPU 가속이 정말 필요한지 검토 - 복잡한 의존성 제거를 위해 Rust 기반의 정적 바이너리 컴파일 및 Web-standard 호환 라이브러리 활용 고려 - 외부 라이브러리 의존성을 줄이기 위해 핵심 API만을 구현한 Stub 레이어 설계 적용