perf: memoize render-path work in item renderer and root#460
Merged
Conversation
Three render-mechanism costs eliminated, none behavior-changing:
- ItemComponent re-ran replaceContentDataConnectorsDeep on every render
of every item — a deep placeholder scan (plus deep clone when
connectors exist) over the full item data including loaderData
payloads (~0.5ms per full-page re-render pass with realistic
product-section data on M4, ~5x that on low-end mobile). Now memoized
per snapshot: getSnapShot() is identity-stable, and context-only
updates already swap the store reference via setData({}) in
syncReusedInstance, so [data, context.dataContext] is a sufficient
dependency key.
- RenderRoot walked and re-registered the full component list on every
render; registration is idempotent but the spread + loop ran each
time. Component arrays are module-level constants — register each
list identity once via WeakSet.
- WeaverseHydrogenRoot rebuilt the route-keyed data context object on
every render; now memoized on matches. Component.displayName is also
assigned only when it actually changes instead of every render.
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.
Three render-mechanism costs eliminated, none behavior-changing:
ItemComponent re-ran replaceContentDataConnectorsDeep on every render
of every item — a deep placeholder scan (plus deep clone when
connectors exist) over the full item data including loaderData
payloads (~0.5ms per full-page re-render pass with realistic
product-section data on M4, ~5x that on low-end mobile). Now memoized
per snapshot: getSnapShot() is identity-stable, and context-only
updates already swap the store reference via setData({}) in
syncReusedInstance, so [data, context.dataContext] is a sufficient
dependency key.
RenderRoot walked and re-registered the full component list on every
render; registration is idempotent but the spread + loop ran each
time. Component arrays are module-level constants — register each
list identity once via WeakSet.
WeaverseHydrogenRoot rebuilt the route-keyed data context object on
every render; now memoized on matches. Component.displayName is also
assigned only when it actually changes instead of every render.