本次建置的實測數據
Chrome,2026-09-28。所有條件與樣本都在效能指南中。 測量方法
- 28.0KBKB gzip,全部 16 個匯出
整個 Web 進入點,已壓縮。唯一的 peer 相依是 React。
- 0動畫進行時的 JS 影格回呼
數字、高度與醒目標示同時變化:全部 12 個動畫都由瀏覽器播放。
- 1每次值變化的 React commit 次數
MotionNumber在值改變時渲染,滾動過程中從不渲染。 - 11串流 3000 個字元時的 React commit 次數
MotionStream直接附加字元,每秒只併入 React 幾次。
01最簡單
一個標籤加上你的資料
每個元件都能獨立運作:不需要 Provider、包裝元件或初始化呼叫。集合類元件接收 items 與 renderItem,版面、文字與樣式都歸你所有。
- 匯入一個元件、傳一個值,整合就完成了。
- 清單、分頁標籤與翻頁器讀取你的陣列;key 預設為
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} />;
六個即時運作的元件,以及各自背後的那一行程式碼。
正在準備範例…
02最快
交給瀏覽器播放,React 保持靜止。
在 Web 上不必載入動畫函式庫:元件把動態交給 Web Animations API,所以滾動的數字或改變尺寸的面板在移動時不耗費每一格的 JavaScript,也不觸發 React 渲染。
- 12 個動畫同時執行時,JS 影格回呼為 0 次。
- 每次值變化只有一次 React commit,而不是每一格一次。
- 串流文字:3000 個字元只有 11 次 React commit。下方的範例會計算自己的渲染次數。
正在準備範例…
03最穩定
隨時中斷,從不跳動。
每個新值都從畫面上的當下狀態開始,彈簧會保留速度,所以快速連點、資料一次湧入與反向操作看起來都是刻意的。動態結束後,不會留下任何還在執行的東西。
- 數字從不斷開:保留的位數會一邊滾動一邊滑動。
- 間隔 5 ms 連續給 200 個新值:之後只剩 0 個動畫,最後的文字完全正確。
- 在 React StrictMode 下也安全。React Native 應用程式在背景時,動態會直接落到結束狀態。
正在準備範例…
數字與文字
內容與尺寸
選擇與翻頁
清單
手勢
浮層
進度
- 聊天回答會收起的建議、以穩定節奏串流的回答,以及會切換的狀態列。
MotionStreamMotionListMotionSwapMotionHeight - 結帳摘要購物車改變時,數量、小計與總額都會滾動;優惠券提示會進出場;付款需要刻意長按。
MotionListMotionNumberMotionPresenceMotionHold - 收件匣附即時計數的篩選分頁、可以滑走的列,以及會自動補上空隙的清單。
MotionHighlightMotionListMotionSwipeMotionNumber - 相片動態滑動瀏覽相片、點縮圖跳轉、以全螢幕開啟任一張相片,並往上拉查看詳細資訊。
MotionPagerMotionHighlightMotionZoomMotionSheet
Web 與 React Native 使用同一個 import
Metro 會選原生實作,Web 打包工具會選 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} />
</>
);
}| 部分 | Web | React Native |
|---|---|---|
| transform 與 opacity | Web Animations API,彈簧經解析取樣 | 使用原生驅動的 Animated |
| 寬度與高度 | Web Animations API | 使用 JS 驅動的 Animated,因為這屬於版面配置 |
| 串流文字 | 附加字元並淡入;React 每秒只渲染幾次 | 真正的 Text,不淡入直接顯示 |
| 底部面板與縮放 | 頂層的原生 dialog | 透明的 Modal;返回鍵可關閉 |
兩分鐘上手
安裝、匯入一個元件、傳一個值。
npm install @kkwaenggwari/animated-chorus