Skip to content

perf(build): keep vendor-ledger out of the startup graph - #583

Open
yhabib wants to merge 1 commit into
mainfrom
perf/ledger-chunk-out-of-startup
Open

yhabib wants to merge 1 commit into
mainfrom
perf/ledger-chunk-out-of-startup

Conversation

@yhabib

@yhabib yhabib commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator

Motivation

index.html preloaded vendor-ledger although the Ledger code loads through a dynamic import(). react-remove-scroll in vendor-libs needs tslib, and rxjs pulled tslib into vendor-ledger. Nothing paints until the startup JS arrives, and CI posted build stats, but no check could fail.

Startup JS Before After
Gzip bytes 563,709 467,539
Files 25 25
vendor-ledger in index.html Yes No

Changes

  • Moved the chunk rules from manualChunks to codeSplitting.groups, with a vendor-tslib group above them.
  • Added check:startup-budget, which fails above 480,000 bytes gzip or if vendor-ledger is in the startup list.
  • Added the check to the Build Stats job and its result to the build stats comment.
  • Checked the production build in Chromium: it boots with no errors and requests no Ledger chunk.
  • Checked the add device flow with a stubbed login: Connect loads vendor-buffer, then vendor-ledger, and Buffer exists when vendor-ledger evaluates.

Move the chunk rules to `codeSplitting.groups` and give `tslib` its own
group. `rxjs` pulled `tslib` into `vendor-ledger`, and `vendor-libs`
needs `tslib` at startup, so the entry preloaded the Ledger chunk.

Add `check:startup-budget`. It sums the gzip size of the startup JS from
`dist/index.html` and fails above the budget, or if `vendor-ledger` is
in the startup list. The Build Stats job runs it and adds the result to
the build stats comment.
@yhabib
yhabib requested a review from a team as a code owner November 6, 2026 10:51
Copilot AI balanced review requested due to automatic review settings November 6, 2026 10:51
@zeropath-ai

zeropath-ai Bot commented Nov 6, 2026

Copy link
Copy Markdown

✅ No security or compliance issues detected. Reviewed everything up to a51f745.

Security Overview
Detected Code Changes
Change Type Relevant files
Enhancement ► .github/workflows/check.yaml
    Add startup budget check and condition for PR comments
► package.json
    Add check:startup-budget script
► src/governance-app-frontend/package.json
    Add check:startup-budget script
► src/governance-app-frontend/scripts/check-startup-budget.ts
    Introduce startup budget checker script
► src/governance-app-frontend/vite.config.js
    Refactor of vendor chunking logic and build config updates

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown

📊 Build Bundle Stats

The latest build generated the following assets:

dist/index.html                                           5.86 kB │ gzip:   1.66 kB
dist/assets/index-DHR8rj0Y.css                          150.06 kB │ gzip:  24.02 kB
dist/assets/icpLedger-BvaI7wBZ.js                         0.23 kB │ gzip:   0.21 kB
dist/assets/Skeleton-EiLqCqxY.js                          0.44 kB │ gzip:   0.32 kB
dist/assets/webhid-D0yio6wG.js                            0.53 kB │ gzip:   0.32 kB
dist/assets/useTvlValue-MRck5Uv5.js                       0.60 kB │ gzip:   0.41 kB
dist/assets/nnsDapp-CIej5OWF.js                           0.68 kB │ gzip:   0.25 kB
dist/assets/SkeletonPageHeader-DBwcOs3i.js                0.76 kB │ gzip:   0.47 kB
dist/assets/PageHeader-jXzaR6sL.js                        0.77 kB │ gzip:   0.45 kB
dist/assets/CertifiedBadge-DdRViWug.js                    0.81 kB │ gzip:   0.48 kB
dist/assets/Separator-GRkuHduC.js                         0.83 kB │ gzip:   0.50 kB
dist/assets/SkeletonStatCard-CyXjN99G.js                  0.91 kB │ gzip:   0.56 kB
dist/assets/useForecastPeriod-CSnMrEUc.js                 1.01 kB │ gzip:   0.61 kB
dist/assets/utils-CrvhA-z_.js                             1.02 kB │ gzip:   0.59 kB
dist/assets/useIcpIndex-Dgh0QCtW.js                       1.09 kB │ gzip:   0.64 kB
dist/assets/numbers-Bwrk5DZy.js                           1.15 kB │ gzip:   0.57 kB
dist/assets/routeLoaders-mXItZ3Ve.js                      1.19 kB │ gzip:   0.55 kB
dist/assets/rolldown-runtime-DAXXjFlN.js                  1.26 kB │ gzip:   0.70 kB
dist/assets/advancedFeatures-ByDW0_Am.js                  1.50 kB │ gzip:   0.74 kB
dist/assets/events-CuigZYeh.js                            1.66 kB │ gzip:   0.86 kB
dist/assets/SkeletonListRows-BKCHGItP.js                  1.69 kB │ gzip:   0.53 kB
dist/assets/useLedgerNeuronCall-DyBOm1lL.js               1.89 kB │ gzip:   1.03 kB
dist/assets/errors-C_oENL0S.js                            1.95 kB │ gzip:   0.97 kB
dist/assets/AnimatedNumber-BmR-3Hdm.js                    1.98 kB │ gzip:   1.12 kB
dist/assets/useCommandPaletteSettings-Dg5hngaM.js         2.13 kB │ gzip:   1.06 kB
dist/assets/addressBook-D6N_OuXr.js                       2.14 kB │ gzip:   1.19 kB
dist/assets/useIcpIndexTransactionsPolling-BaWtHKaO.js    2.15 kB │ gzip:   1.15 kB
dist/assets/useGovernanceAppCanister-CfFDp0YU.js          2.41 kB │ gzip:   1.07 kB
dist/assets/useShortcutSettings-DVdzmxf2.js               2.41 kB │ gzip:   1.19 kB
dist/assets/useAddHotkey-5npCVzX7.js                      2.61 kB │ gzip:   1.34 kB
dist/assets/governance-BtHYUJUf.js                        2.99 kB │ gzip:   1.15 kB
dist/assets/ToggleGroup-DbKEMuQW.js                       3.09 kB │ gzip:   1.41 kB
dist/assets/useClaimPendingDeviceStakes-ChksciRX.js       3.12 kB │ gzip:   1.42 kB
dist/assets/SkeletonText-DiRyRsNA.js                      3.71 kB │ gzip:   1.29 kB
dist/assets/useAccounts-BSzIoON7.js                       4.96 kB │ gzip:   2.21 kB
dist/assets/vendor-tslib-BHbJFxAR.js                      6.23 kB │ gzip:   1.88 kB
dist/assets/tickers-WH__Fhb2.js                           6.54 kB │ gzip:   2.73 kB
dist/assets/useNowInSeconds-RPVO534B.js                   7.12 kB │ gzip:   3.04 kB
dist/assets/DeviceActionDetail-BGuqksRO.js                8.45 kB │ gzip:   3.02 kB
dist/assets/TopicFollowingAccordion-CbgdiAeh.js           8.55 kB │ gzip:   3.41 kB
dist/assets/routes-CUtGRv3p.js                            8.96 kB │ gzip:   3.07 kB
dist/assets/AlertDialog-CLtcCh0O.js                       8.99 kB │ gzip:   3.16 kB
dist/assets/ledgerIdentity-U5eHK8xL.js                   10.20 kB │ gzip:   3.72 kB
dist/assets/MutationDialog-DW8TtVXm.js                   11.55 kB │ gzip:   4.00 kB
dist/assets/spamFilter-CW_V3n-c.js                       11.77 kB │ gzip:   5.02 kB
dist/assets/ResponsiveDialog-uuNjJAjc.js                 14.56 kB │ gzip:   4.07 kB
dist/assets/_id-tk8C7kLS.js                              16.61 kB │ gzip:   5.32 kB
dist/assets/AmountInput-CHH2GJCr.js                      16.85 kB │ gzip:   6.73 kB
dist/assets/_auth-C8X17kph.js                            22.49 kB │ gzip:   8.29 kB
dist/assets/HideBalancesToggle-C0Z-8DNm.js               22.99 kB │ gzip:   8.58 kB
dist/assets/vendor-buffer-EX-AqChq.js                    26.95 kB │ gzip:   8.18 kB
dist/assets/accounts-DK-BTI2v.js                         32.02 kB │ gzip:  10.89 kB
dist/assets/SendICPButton-biURxJq2.js                    37.04 kB │ gzip:  13.52 kB
dist/assets/settings-oD1-K1by.js                         54.42 kB │ gzip:  15.56 kB
dist/assets/dashboard-B_xZJjXq.js                        57.80 kB │ gzip:  19.11 kB
dist/assets/index-IFS0tdYB.js                            62.72 kB │ gzip:  17.82 kB
dist/assets/voting-DHaHKbn8.js                           69.29 kB │ gzip:  21.68 kB
dist/assets/vendor-md-cZoz2w0Y.js                        73.29 kB │ gzip:  19.98 kB
dist/assets/button-BcWVWafA.js                           84.90 kB │ gzip:  28.37 kB
dist/assets/neurons-CnWxXTB7.js                          90.41 kB │ gzip:  27.09 kB
dist/assets/DisburseModal-CBJ6LuqB.js                   101.46 kB │ gzip:  29.62 kB
dist/assets/vendor-tanstack-C4zdTm8_.js                 120.02 kB │ gzip:  39.22 kB
dist/assets/vendor-jsqr-CjiBYtfG.js                     129.98 kB │ gzip:  47.50 kB
dist/assets/vendor-core-react-bRRjyX41.js               189.81 kB │ gzip:  59.76 kB
dist/assets/vendor-recharts-bxVcuIrP.js                 280.26 kB │ gzip:  76.81 kB
dist/assets/vendor-ledger-BuwJChzo.js                   397.24 kB │ gzip:  97.02 kB
dist/assets/vendor-icp-e5O_ocwA.js                      468.31 kB │ gzip: 117.84 kB
dist/assets/vendor-libs-DlJiCQ0N.js                     581.21 kB │ gzip: 186.96 kB

🚦 Startup JS budget

✅ The startup JS is 467,817 bytes gzip. The budget is 480,000.

25 startup files
File Gzip bytes
assets/vendor-libs-DlJiCQ0N.js 185,375
assets/vendor-icp-e5O_ocwA.js 114,853
assets/vendor-core-react-bRRjyX41.js 59,068
assets/vendor-tanstack-C4zdTm8_.js 38,776
assets/button-BcWVWafA.js 28,145
assets/index-IFS0tdYB.js 17,676
assets/ResponsiveDialog-uuNjJAjc.js 4,040
assets/AlertDialog-CLtcCh0O.js 3,148
assets/useNowInSeconds-RPVO534B.js 3,029
assets/useAccounts-BSzIoON7.js 2,200
assets/vendor-tslib-BHbJFxAR.js 1,884
assets/SkeletonText-DiRyRsNA.js 1,290
assets/useShortcutSettings-DVdzmxf2.js 1,194
assets/governance-BtHYUJUf.js 1,153
assets/errors-C_oENL0S.js 979
assets/advancedFeatures-ByDW0_Am.js 745
assets/rolldown-runtime-DAXXjFlN.js 704
assets/utils-CrvhA-z_.js 593
assets/SkeletonStatCard-CyXjN99G.js 567
assets/routeLoaders-mXItZ3Ve.js 557
assets/Separator-GRkuHduC.js 498
assets/SkeletonPageHeader-DBwcOs3i.js 476
assets/webhid-D0yio6wG.js 328
assets/Skeleton-EiLqCqxY.js 327
assets/icpLedger-BvaI7wBZ.js 212

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approved

No active review issues block approval of the startup-bundle isolation and CI budget-check changes.

No open issues 🎉

What changed in this PR

Keeps Ledger dependencies out of the frontend’s startup JavaScript and adds a CI check to guard against startup-size regressions.

Changes:

  • Replaces manual chunk rules with code-splitting groups and isolates shared tslib dependencies.
  • Adds a startup check enforcing a 480,000-byte gzip budget and rejecting vendor-ledger in the startup list.
  • Runs the check in CI and includes its report in build-stat comments, even when the budget check fails.
File Description
src/​governance-app-frontend/​vite.config.js Defines chunk groups with a higher-priority vendor-tslib group.
src/​governance-app-frontend/​scripts/​check-startup-budget.ts Checks startup assets and prints a Markdown budget report.
src/​governance-app-frontend/​package.json Exposes the frontend startup-budget command.
package.json Exposes the startup-budget command at the workspace root.
.github/​workflows/​check.yaml Enforces the budget and publishes the result in build-stat comments.

Review effort: Balanced

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.

2 participants