Skip to content

perf: lazy-load lottie animations in Inbox and Screensaver#17606

Open
pauldambra wants to merge 1 commit into
perf/lazy-amchartsfrom
perf/lazy-lottie
Open

perf: lazy-load lottie animations in Inbox and Screensaver#17606
pauldambra wants to merge 1 commit into
perf/lazy-amchartsfrom
perf/lazy-lottie

Conversation

@pauldambra

@pauldambra pauldambra commented Jun 13, 2026

Copy link
Copy Markdown
Member

this approach worked nicely in the app
robot recorded what it believes is the affected page on the preview link

17606-lottie-screensaver

Changes

Third bundle-split in the ratchet. lottie-web (~600 KiB) shipped on every page via two always-loaded OS-chrome surfaces:

  • Inbox -> lottie-react (hourglass loading animations)
  • Screensaver -> react-lottie (logo animation)

(AboutHero and CommunityCTA also use react-lottie but are page-split, so they don't keep it eager.)

Both now use the repo's client-only React.lazy pattern (same as HedgehogMode) behind a Suspense fallback={null}, so lottie loads only when those surfaces render.

Please sanity-check on the preview: the Inbox loading spinner (open the inbox while questions load) and the Screensaver animation (display options -> enable screensaver).

Expected impact

lottie-web (~600 KiB) drops out of the app eager closure. Stacked on the amcharts PR; the preview eager-graph comment shows the cumulative reduction.

Checklist

  • Words are spelled using American English
  • Verify Inbox loading animation + Screensaver still render on the preview

🤖 Agent context

Stack: #17603 (checker) <- #17604 (mapbox, -1.62 MiB) <- #17605 (amcharts, -2.16 MiB) <- this (lottie). Both lottie wrappers (lottie-react, react-lottie) bundle lottie-web — a dedup opportunity for later. Remaining eager candidates: @mdxeditor/CodeMirror (OSTable), jspdf (OSChrome HeaderBar), Stickers (MDX scope), @radix-ui/react-icons.

lottie-web (~600 KiB) was eager via two paths: Inbox (lottie-react) and the
Screensaver (react-lottie) — both part of the always-loaded OS chrome. Switch
both to the repo's client-only React.lazy pattern (HedgehogMode style) behind a
Suspense boundary, so lottie loads only when those surfaces actually render.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Deploy preview

Status Details Updated (UTC)
🟢 Ready View preview Jun 14, 2026 10:52AM

@github-actions

github-actions Bot commented Jun 13, 2026

Copy link
Copy Markdown
Contributor

Bundle report

Total JS (gzip)

6.26 MiB (-44.4 KiB / -0.7%)

Largest changed named chunks
Chunk Gzip Δ vs master
app.js 1970.5 KiB -83.4 KiB / -4.1%
95b98745c7115a4e6236ad090c96001665718c45.js 81.9 KiB new
fe8bb93dcba62e8ce8a062d724dbc8a69309bd57.js 81.6 KiB new
95bf0a8db0fdc7eac4931d8500b2428276eea615.js 8.1 KiB new
f54b42984bfe4d114461fcea2710af414ac1fe74.js 23.8 KiB +7.5 KiB / +46.5%
035c3a5dbce655498ebf426080fef9033b4583db.js 1.7 KiB -3.0 KiB / -63.6%

Eager graph (static-import closure per entrypoint)

Entrypoint Eager size Budget Modules
app 24.84 MiB (-4558.1 KiB / -15.2%) report-only 5502
Largest modules in the app closure
Module Size
css ./node_modules/.pnpm/css-loader@5.2.7_webpack@5.101.3/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[8].oneOf[1].use[1]!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.5.6_webpack@5.101.3/node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[8].oneOf[1].use[2]!./src/styles/global.css 710.0 KiB
./src/components/Stickers/Stickers.tsx 696.4 KiB
./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.3.1/node_modules/@radix-ui/react-icons/dist/react-icons.esm.js 481.4 KiB
./node_modules/.pnpm/@codemirror+view@6.38.2/node_modules/@codemirror/view/dist/index.js 458.1 KiB
./.cache/caches/gatsby-plugin-mdx/mdx-scopes-dir/31a094f140f119e73085d847ae81b99b.js + 2 modules 435.9 KiB
./node_modules/.pnpm/rehype-raw@7.0.0/node_modules/rehype-raw/lib/index.js + 29 modules 395.1 KiB
./node_modules/.pnpm/@posthog+icons@0.36.6_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.cjs.js 364.8 KiB
./src/hooks/useCustomers.tsx + 55 modules 358.4 KiB
./node_modules/.pnpm/@posthog+icons@0.36.6_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js 354.8 KiB
./node_modules/.pnpm/react-markdown@8.0.7_@types+react@16.14.66_react@18.3.1/node_modules/react-markdown/lib/react-markdown.js + 88 modules 351.4 KiB
./node_modules/.pnpm/jspdf@3.0.2/node_modules/jspdf/dist/jspdf.es.min.js 334.1 KiB
./node_modules/.pnpm/cloudinary-core@2.14.0_lodash@4.17.21/node_modules/cloudinary-core/cloudinary-core.js 281.9 KiB
./node_modules/.pnpm/@codesandbox+sandpack-react@2.20.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@codesandbox/sandpack-react/dist/index.mjs 266.6 KiB
./src/components/ProductComparisonTable/index.tsx + 114 modules 264.0 KiB
./node_modules/.pnpm/d3@7.9.0/node_modules/d3/src/index.js + 208 modules 247.4 KiB

Eager-graph budgets are report-only until a baseline is established. Sizes are gzip of public/**/*.js; eager size is webpack module source bytes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant