Animation Runtime Bundle Size Benchmark (September 2026)
Measured gzipped JavaScript for five animation runtimes in identical minimal React apps, with versions, build settings and the numbers we lost on.
Core Takeaway
In a production Vite 5 build of five otherwise identical minimal React apps, gzipped JavaScript for the animation runtime ranged from 58 KB for dotlottie-web to 758 KB for the ExodeUI React SDK. Rive was 100 KB, GSAP 71 KB and Framer Motion 80 KB. ExodeUI is the heaviest because it bundles the Rapier 2D WebAssembly physics engine, and we are publishing that result against ourselves.
The results table
All five apps use React 18.3.1 and React DOM, which add about 44 KB gzip to every row. The differences between rows are the animation runtimes themselves. Measure is the sum of all emitted .js files after gzip -c.
| Runtime | Version | Raw | Gzip | Relative to Lottie |
|---|---|---|---|---|
| @lottiefiles/dotlottie-web | 0.80.0 | 200 KB | 58 KB | 1.0x |
| GSAP | 3.15.0 | 208 KB | 71 KB | 1.2x |
| Framer Motion | 11.18.2 | 248 KB | 80 KB | 1.4x |
| @rive-app/canvas | 2.42.0 | 333 KB | 100 KB | 1.7x |
| exodeui (React SDK) | 6.4.5 | 2,113 KB | 758 KB | 12.8x |
Why ExodeUI is the heaviest, in one sentence
The ExodeUI SDK includes @dimforge/rapier2d-compat, a WebAssembly rigid-body physics engine of roughly 1.69 MB, which is about 80 percent of the payload. The other four runtimes interpolate keyframes or drive a playhead and do not simulate physics, so their runtimes are small. That explains the number but does not excuse it, and it does not make 758 KB smaller.
- Rapier ships even when a component only needs a spring.
- Lazy WASM loading and physics tree-shaking are the top requests on the runtime roadmap.
- Compiled scene files are small, often a few KB. The runtime, not the asset, is the weight.
Methodology, so you can reproduce it
Five separate minimal apps, each rendering one animated element using the library documentation first example. Same toolchain, same React version, measured the same way.
- Build tool: Vite 5.4.21 with @vitejs/plugin-react 4, minify esbuild, production mode.
- React: 18.3.1 in all five apps.
- Measurement: sum of emitted .js files, raw and after gzip -c.
- Not measured: runtime frames per second, memory, WASM instantiation time, and scene asset size.
- Caveat: Rive .riv assets are typically much smaller than equivalent .exode JSON, which is a separate axis from runtime size.
What to do with the number today
If you adopt ExodeUI, do not put the runtime in your first-paint bundle. Load it at the interactive surface with a dynamic import so the cost is paid only by users who reach the component.
- For a decorative loop or a hero effect, use a lighter runtime. That is an honest recommendation.
- For a component that only needs a spring, current ExodeUI is a poor trade on size. Use CSS or Motion.
- For full rigid-body physics driven by app state, lazy-load the runtime per route.
How to cite this benchmark
The table above is the citable unit. It is versioned by the runtime versions listed, measured with the build settings above, and dated September 2026. Re-run it before quoting a newer release, because the ExodeUI number is expected to change as lazy loading and tree-shaking ship.
- Cite as: ExodeUI, Animation Runtime Bundle Size Benchmark, September 2026.
- Quote the gzip column, not the raw column, when comparing shipped weight.
- State the React baseline when you quote a delta, because every row includes it.
Frequently Asked Questions
Sources
- Original benchmark write-up with full narrative — ExodeUI blog
- Vite production build options — Vite docs
- Rapier 2D physics engine — Dimforge