이번 빌드에서 측정한 값
Chrome, 2026-09-28. 모든 조건과 표본은 성능 가이드에 있습니다. 측정 방법 보기
- 28.0KBKB gzip · 16개 내보내기 전체
웹 진입점 전체를 압축한 크기입니다. 피어 의존성은 React뿐입니다.
- 0애니메이션 중 JS 프레임 콜백
숫자·높이·하이라이트가 함께 바뀌는 동안 12개 애니메이션을 모두 브라우저가 재생합니다.
- 1값이 바뀔 때마다 React 커밋
MotionNumber는 값이 바뀔 때 렌더하고, 굴러가는 동안에는 렌더하지 않습니다. - 113000자 스트리밍 동안 React 커밋
MotionStream은 글자를 직접 붙이고 1초에 몇 번만 React에 반영합니다.
01가장 편함
태그 하나와 내 데이터
모든 컴포넌트는 혼자서 동작합니다. Provider, 감싸는 컴포넌트, 설정 호출이 없습니다. 목록형 컴포넌트는 items와 renderItem을 받고, 레이아웃·글자·스타일은 그대로 내 것입니다.
- 컴포넌트 하나를 가져와 값을 넘기면 연동이 끝납니다.
- 목록·탭·페이저는 내 배열을 읽고, 키는 기본으로
item.id를 씁니다. - 글자는 진짜 글자로 남습니다. 줄바꿈되고, 글꼴 확대를 따르고, 선택할 수 있습니다.
<MotionNumber value={total} />;<MotionSwap value={status}>{label}</MotionSwap>;<MotionHeight open={open}>{details}</MotionHeight>;<MotionHighlight items={tabs} value={tab} onValueChange={setTab} />;<MotionList items={tasks} renderItem={(task) => task.title} />;<ProgressRing value={progress} />;
실제로 움직이는 컴포넌트 6개와, 각각을 만드는 코드 한 줄.
예제를 준비하는 중…
02가장 빠름
재생은 브라우저가, React는 가만히
웹에서는 애니메이션 라이브러리를 싣지 않습니다. 컴포넌트가 모션을 Web Animations API에 넘기므로, 숫자가 구르거나 패널 크기가 바뀌는 동안 프레임마다 JavaScript를 돌리지 않고 React도 렌더하지 않습니다.
- 애니메이션 12개가 함께 도는 동안 JS 프레임 콜백 0회.
- React 커밋은 프레임마다가 아니라 값이 바뀔 때 한 번.
- 스트리밍 글 3000자에 React 커밋 11회. 아래 예제가 자신의 렌더 횟수를 직접 셉니다.
예제를 준비하는 중…
03가장 안정적
언제 끊어도 튀지 않습니다
새 값은 항상 화면에 보이는 모습에서 출발하고, 스프링은 속도를 이어받습니다. 연타, 몰려오는 데이터, 방향 전환도 의도한 움직임처럼 보입니다. 움직임이 끝나면 남아 도는 것이 없습니다.
- 숫자가 갈라지지 않습니다. 남는 자리는 구르면서 제자리로 미끄러집니다.
- 5ms 간격으로 새 값 200개를 넣은 뒤 남은 애니메이션 0개, 최종 글자는 정확히 일치.
- React StrictMode에서도 안전합니다. 백그라운드로 간 React Native 앱에서는 모션이 끝 상태로 정리됩니다.
예제를 준비하는 중…
숫자와 글
내용과 크기
선택과 넘기기
목록
제스처
겹침 화면
진행
- 채팅 답변접히는 추천 질문, 일정한 속도로 흘러나오는 답변, 바뀌는 상태 줄.
MotionStreamMotionListMotionSwapMotionHeight - 결제 요약장바구니가 바뀌면 수량·줄 합계·총액이 구르고, 쿠폰 안내가 들어오고 나가며, 결제는 의도적으로 길게 눌러야 합니다.
MotionListMotionNumberMotionPresenceMotionHold - 받은편지함실시간 개수가 있는 필터 탭, 밀어서 치우는 행, 빈자리를 메우는 목록.
MotionHighlightMotionListMotionSwipeMotionNumber - 사진 피드사진을 넘기고, 썸네일로 이동하고, 어떤 사진이든 전체 화면으로 열고, 상세 정보를 끌어올립니다.
MotionPagerMotionHighlightMotionZoomMotionSheet
웹과 React Native, 같은 import
Metro는 네이티브 구현을, 웹 번들러는 DOM 구현을 고릅니다. 각 플랫폼은 가장 잘하는 방식으로 모션을 재생합니다.
// Web and React Native: the same import.
import { MotionNumber, MotionList } from '@kkwaenggwari/animated-chorus';
export function Score({ points, players }) {
return (
<>
<MotionNumber value={points} />
<MotionList items={players} renderItem={(player) => player.name} />
</>
);
}| 부분 | 웹 | React Native |
|---|---|---|
| 이동·크기 변형과 투명도 | Web Animations API, 스프링은 해석적으로 샘플링 | 네이티브 드라이버를 쓰는 Animated |
| 너비와 높이 | Web Animations API | 레이아웃이므로 JS 드라이버를 쓰는 Animated |
| 스트리밍 글 | 글자를 붙이며 페이드인, React 렌더는 1초에 몇 번 | 진짜 Text, 페이드 없이 공개 |
| 시트와 확대 | 최상위 레이어의 네이티브 dialog | 투명한 Modal, 뒤로 가기 버튼으로 닫힘 |
2분이면 시작합니다
설치하고, 컴포넌트 하나를 가져와, 값을 넘기세요.
npm install @kkwaenggwari/animated-chorus