Prevent unrelated client settings rerenders#4052
Draft
cursor[bot] wants to merge 1 commit into
Draft
Conversation
Co-authored-by: Julius Marminge <juliusmarminge@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What Changed
useSyncExternalStoreWithSelectorinstead of subscribing components to the full settings snapshot first.Object.issemantics.Why
Selector consumers such as the diff panel and sidebar previously re-rendered whenever any client preference changed. React Scan confirmed that a component selecting only
wordWraprendered on every unrelatedsidebarThreadPreviewCountupdate.UI Changes
React Scan before/after recordings are attached to the Cursor run:
react_scan_settings_subscription_before.mp4: five unrelated updates move the selected consumer from 2 to 12 render calls; changingwordWrapmoves it to 14.react_scan_settings_subscription_after.mp4: five unrelated updates leave the consumer at 4; changingwordWrapcorrectly moves it to 6.The fixture used React Strict Mode, so each actual consumer commit appears as two render calls. React Scan is visibly enabled in both recordings.
Checklist
Validation:
vp check --fix,vp run typecheck, and the web settings hook unit test all pass. A post-fix React Doctor performance scan completed across 985 files with no finding inuseSettings.ts.Note
Prevent unrelated rerenders in
useClientSettingsby subscribing to store slicesRewrites
useClientSettingsto useuseSyncExternalStoreWithSelector, so components only re-render when their selected slice of client settings changes. Usesshallowequality when a selector is provided, andObject.isotherwise. Addsuse-sync-external-storeas a runtime dependency.Macroscope summarized 909cbf7.