노트

Lynx

Lynx

프론트엔드#react#performance · 연결된 개념 3개

쉽게 말하면

Lynx는 웹 개발자가 아는 React와 CSS로 짠 화면을 휴대폰의 진짜 앱 화면으로 그려 주는 도구예요. 웹 페이지를 앱 안에 띄우는 게 아니라서 첫 화면이 빈 채로 기다리는 시간을 줄이려고 만들었어요.

비유의 한계 웹처럼 짜도 브라우저는 아니에요. 네이티브에선 DOM이나 window가 없어 웹 라이브러리를 그대로 못 쓰고, 첫 화면에 필요한 번들이나 데이터를 네트워크로 받아야 하면 첫 프레임도 기다려야 해요.

Lynx는 웹 기술(마크업, CSS, JavaScript)로 작성한 UI를 iOS·Android·HarmonyOS의 네이티브 화면과 웹에 렌더링하는 크로스플랫폼 UI 프레임워크다. ByteDance에서 만들어 TikTok 등에서 쓰다가 2025년 3월 5일 오픈소스로 공개했다. 웹뷰처럼 페이지를 띄우는 방식이 아니라, React Native·Flutter와 같은 부류의 네이티브 렌더링 프레임워크다.

구조

  • 이중 스레드(dual-thread): 메인 스레드는 첫 화면 렌더링, 레이아웃, 메인 스레드 스크립트를 맡는다. 백그라운드 스레드는 컴포넌트 생명주기와 사용자 코드 대부분을 돌린다. 복잡한 로직이 UI 반응을 막지 않게 나눈 것이다
  • PrimJS: QuickJS를 바탕으로 Lynx용으로 만든 경량 자바스크립트 엔진이다. 메인 스레드는 미리 컴파일한 PrimJS 바이트코드를 실행해 런타임 파싱을 건너뛴다. 백그라운드 스레드는 PrimJS나 JavaScriptCore에서 돈다
  • ReactLynx: Lynx의 공식 React 프레임워크로, 내부는 Preact 기반이다. react 대신 @lynx-js/react에서 거의 같은 API를 가져다 쓴다. Lynx 자체는 React 전용이 아니어서, 공개 당시 공식 블로그는 다른 프레임워크가 사용량의 절반가량을 차지한다고 밝혔다
  • 브라우저가 아니다: 네이티브 플랫폼에서는 DOM API와 window·document가 없고 lynx 전역 객체와 자체 API를 쓴다. 웹 코드를 옮기려면 이 차이에 맞춰 다시 써야 한다

즉시 첫 프레임 렌더링(IFR)

데이터가 처음부터 준비되어 있으면 메인 스레드가 첫 화면을 동기적으로 다 그린 뒤 보여 줘서 흰 화면이나 중간 상태가 없다. 그동안 백그라운드 스레드는 자기 노드 트리를 따로 만들고, 두 트리의 차이를 맞춰 이후 업데이트에 대비한다. 웹에서 SSR(Server-Side Rendering)로 얻던 효과를 클라이언트 안에서 내는 셈이다.

다만 공식 문서도 "마법이 아니다"라고 밝힌다. 페이지 번들을 동기로 불러올 수 없거나 주요 콘텐츠를 네트워크 요청으로 받아야 하면 IFR이 되지 않는다. 그 경우 흰 화면의 원인은 렌더링이 아니라 비동기 I/O다.

언제 고려하나

앱 안의 웹뷰 화면(웹뷰 브리지(웹↔네이티브 통신))은 웹 기술로 만들지만, 브라우저 엔진 위에서 페이지를 불러와 그린다. Lynx 문서는 요소를 네이티브 뷰에 대응시켜 기존 웹뷰의 성능 병목을 피한다고 설명한다. Lynx는 웹에 가까운 개발 방식은 살리면서 렌더링을 네이티브로 바꾸는 선택지다. 엔진을 기존 네이티브 앱에 넣어 일부 화면에만 쓸 수도 있다. 공식 블로그는 웹에서 Lynx로 옮긴 화면들의 실행(launch) 시간이 전반적으로 2~4배 줄었다고 소개한다(ByteDance 내부 관찰).

출처: Lynx 블로그 — Lynx: Unlock Native for More · Lynx — Instant First-Frame Rendering · ReactLynx — Rendering Process and Lifecycle · What is ReactLynx? · Lynx — Integrate with Existing Apps · Lynx — Main Thread Runtime · PrimJS (GitHub) · Lynx 문서 색인(llms.txt)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • Fiber 아키텍처

    Fiber는 React 16부터 쓰는 내부 자료구조이자 렌더링 엔진이다. 엘리먼트마다 Fiber 노드를 만들어 렌더 작업을 작은 단위로 쪼개고, 우선순위를 매기고, 중간에 멈췄다 다시 이어 갈 수 있게 한다.

  • react와 렌더러의 분리

    React는 컴포넌트를 정의하는 API(Application Programming Interface)를 담은 react 패키지와, 그 컴포넌트 트리를 특정 플랫폼의 화면으로 바꾸는 렌더러(renderer) 패키지로 나뉜다. 브라우저 DOM(Document Object Model)용이 react-dom, iOS·Android 네이티브 뷰용이 react-native다.

  • 브라우저 렌더링 파이프라인

    브라우저가 받은 HTML·CSS·JS를 화면의 픽셀로 바꾸는 순서. 처음 로드할 때도, 이후 무언가 바뀔 때도 같은 단계를 거친다. 바뀐 내용에 따라 어느 단계부터 다시 시작하는지만 다르다.

  • Electron 앱 구조

    Electron은 Chromium과 Node.js를 묶어 웹 기술(HTML·CSS·JavaScript)로 데스크톱 앱을 만드는 프레임워크다. 앱은 OS(Operating System) 권한을 가진 메인 프로세스(Main Process) 하나와, 창마다 하나씩 뜨는 렌더러 프로세스(Renderer Process)로 나뉜다.

  • HTMX

    HTML 속성만으로 서버에 요청을 보내고, 응답으로 받은 HTML 조각을 페이지 일부에 끼워 넣게 해 주는 작은 라이브러리. 클라이언트에서 JSON(JavaScript Object Notation)을 받아 상태와 화면을 그리는 SPA(Single Page Application)와 달리, 서버가 화면 조각을 만들어 보내는 방식(하이퍼미디어, Hypermedia)으로 돌아간다.

보기 옵션