Skip to content

Fix compat Suspense hydration children recovery - #5146

Merged
JoviDeCroock merged 1 commit into
mainfrom
JoviDeCroock/cherry-pick-pr-5145
Jul 7, 2026
Merged

Fix compat Suspense hydration children recovery#5146
JoviDeCroock merged 1 commit into
mainfrom
JoviDeCroock/cherry-pick-pr-5145

Conversation

@JoviDeCroock

Copy link
Copy Markdown
Member

Forward-ports the compat Suspense hydration children recovery fix from v10.x (#5144, released in 10.29.5 / #5145) to main.

Hydrated Suspense can recover a VNode with no DOM and no initialized children, then compat's Suspense catch path can copy oldVNode._children back to null. A later bailout expects _children to be iterable and crashes.

This normalizes recovered compat Suspense children to an empty array and adds a regression for the no-DOM hydrated suspension bailout path.

🤖 Generated with Claude Code and reviewed by me

Assisted-By: devx/e4332ca9-5b89-489a-90de-4e51c2b124d8
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

📊 Tachometer Benchmark Results

Summary

duration

  • create10k: unsure 🔍 -1% - +0% (-7.24ms - +2.23ms)
    preact-local vs preact-main
  • filter-list: unsure 🔍 -0% - +0% (-0.03ms - +0.06ms)
    preact-local vs preact-main
  • hydrate1k: unsure 🔍 -2% - +1% (-1.30ms - +0.61ms)
    preact-local vs preact-main
  • many-updates: unsure 🔍 -0% - +5% (-0.06ms - +0.76ms)
    preact-local vs preact-main
  • replace1k: unsure 🔍 -3% - +0% (-1.71ms - +0.10ms)
    preact-local vs preact-main
  • text-update: unsure 🔍 -4% - +4% (-0.07ms - +0.08ms)
    preact-local vs preact-main
  • todo: unsure 🔍 -1% - +0% (-0.26ms - +0.09ms)
    preact-local vs preact-main
  • update10th1k: unsure 🔍 -2% - +4% (-0.49ms - +1.18ms)
    preact-local vs preact-main

usedJSHeapSize

  • create10k: unsure 🔍 +0% - +0% (+0.00ms - +0.00ms)
    preact-local vs preact-main
  • filter-list: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
    preact-local vs preact-main
  • hydrate1k: unsure 🔍 -4% - +3% (-0.20ms - +0.18ms)
    preact-local vs preact-main
  • many-updates: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
    preact-local vs preact-main
  • replace1k: unsure 🔍 -0% - +0% (-0.00ms - +0.00ms)
    preact-local vs preact-main
  • text-update: unsure 🔍 -5% - +2% (-0.05ms - +0.02ms)
    preact-local vs preact-main
  • todo: unsure 🔍 +0% - +0% (+0.00ms - +0.00ms)
    preact-local vs preact-main
  • update10th1k: unsure 🔍 -1% - +0% (-0.03ms - +0.00ms)
    preact-local vs preact-main

Results

create10k

duration

VersionAvg timevs preact-localvs preact-main
preact-local836.93ms - 843.32ms-unsure 🔍
-1% - +0%
-7.24ms - +2.23ms
preact-main839.13ms - 846.12msunsure 🔍
-0% - +1%
-2.23ms - +7.24ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local19.07ms - 19.07ms-unsure 🔍
+0% - +0%
+0.00ms - +0.00ms
preact-main19.07ms - 19.07msunsure 🔍
-0% - -0%
-0.00ms - -0.00ms
-
filter-list

duration

VersionAvg timevs preact-localvs preact-main
preact-local16.55ms - 16.61ms-unsure 🔍
-0% - +0%
-0.03ms - +0.06ms
preact-main16.53ms - 16.59msunsure 🔍
-0% - +0%
-0.06ms - +0.03ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local1.55ms - 1.55ms-unsure 🔍
-0% - +0%
-0.00ms - +0.00ms
preact-main1.55ms - 1.55msunsure 🔍
-0% - +0%
-0.00ms - +0.00ms
-
hydrate1k

duration

VersionAvg timevs preact-localvs preact-main
preact-local58.33ms - 59.55ms-unsure 🔍
-2% - +1%
-1.30ms - +0.61ms
preact-main58.54ms - 60.02msunsure 🔍
-1% - +2%
-0.61ms - +1.30ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local5.09ms - 5.33ms-unsure 🔍
-4% - +3%
-0.20ms - +0.18ms
preact-main5.07ms - 5.36msunsure 🔍
-3% - +4%
-0.18ms - +0.20ms
-
many-updates

duration

VersionAvg timevs preact-localvs preact-main
preact-local16.33ms - 17.08ms-unsure 🔍
-0% - +5%
-0.06ms - +0.76ms
preact-main16.18ms - 16.53msunsure 🔍
-5% - +0%
-0.76ms - +0.06ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local3.74ms - 3.74ms-unsure 🔍
-0% - +0%
-0.00ms - +0.00ms
preact-main3.74ms - 3.74msunsure 🔍
-0% - +0%
-0.00ms - +0.00ms
-
replace1k
  • Browser: chrome-headless
  • Sample size: 100
  • Built by: CI #5643
  • Commit: fc3f8a4

duration

VersionAvg timevs preact-localvs preact-main
preact-local54.11ms - 55.41ms-unsure 🔍
-3% - +0%
-1.71ms - +0.10ms
preact-main54.93ms - 56.19msunsure 🔍
-0% - +3%
-0.10ms - +1.71ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local3.01ms - 3.01ms-unsure 🔍
-0% - +0%
-0.00ms - +0.00ms
preact-main3.01ms - 3.01msunsure 🔍
-0% - +0%
-0.00ms - +0.00ms
-

run-warmup-0

VersionAvg timevs preact-localvs preact-main
preact-local26.47ms - 27.34ms-unsure 🔍
-3% - +1%
-0.71ms - +0.39ms
preact-main26.74ms - 27.40msunsure 🔍
-1% - +3%
-0.39ms - +0.71ms
-

run-warmup-1

VersionAvg timevs preact-localvs preact-main
preact-local30.83ms - 32.03ms-unsure 🔍
-2% - +3%
-0.73ms - +0.96ms
preact-main30.72ms - 31.92msunsure 🔍
-3% - +2%
-0.96ms - +0.73ms
-

run-warmup-2

VersionAvg timevs preact-localvs preact-main
preact-local29.01ms - 30.26ms-unsure 🔍
-2% - +4%
-0.64ms - +1.11ms
preact-main28.80ms - 30.01msunsure 🔍
-4% - +2%
-1.11ms - +0.64ms
-

run-warmup-3

VersionAvg timevs preact-localvs preact-main
preact-local24.59ms - 24.88ms-unsure 🔍
-1% - +1%
-0.17ms - +0.23ms
preact-main24.56ms - 24.84msunsure 🔍
-1% - +1%
-0.23ms - +0.17ms
-

run-warmup-4

VersionAvg timevs preact-localvs preact-main
preact-local22.69ms - 24.15ms-unsure 🔍
-7% - +1%
-1.64ms - +0.35ms
preact-main23.39ms - 24.74msunsure 🔍
-2% - +7%
-0.35ms - +1.64ms
-

run-final

VersionAvg timevs preact-localvs preact-main
preact-local20.17ms - 20.60ms-unsure 🔍
-3% - +0%
-0.58ms - +0.02ms
preact-main20.46ms - 20.87msunsure 🔍
-0% - +3%
-0.02ms - +0.58ms
-
text-update
  • Browser: chrome-headless
  • Sample size: 200
  • Built by: CI #5643
  • Commit: fc3f8a4

duration

VersionAvg timevs preact-localvs preact-main
preact-local1.95ms - 2.06ms-unsure 🔍
-4% - +4%
-0.07ms - +0.08ms
preact-main1.95ms - 2.06msunsure 🔍
-4% - +4%
-0.08ms - +0.07ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local1.02ms - 1.07ms-unsure 🔍
-5% - +2%
-0.05ms - +0.02ms
preact-main1.03ms - 1.09msunsure 🔍
-2% - +5%
-0.02ms - +0.05ms
-
todo

duration

VersionAvg timevs preact-localvs preact-main
preact-local31.53ms - 31.73ms-unsure 🔍
-1% - +0%
-0.26ms - +0.09ms
preact-main31.57ms - 31.86msunsure 🔍
-0% - +1%
-0.09ms - +0.26ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local1.26ms - 1.26ms-unsure 🔍
+0% - +0%
+0.00ms - +0.00ms
preact-main1.26ms - 1.26msunsure 🔍
-0% - -0%
-0.00ms - -0.00ms
-
update10th1k

duration

VersionAvg timevs preact-localvs preact-main
preact-local29.81ms - 31.03ms-unsure 🔍
-2% - +4%
-0.49ms - +1.18ms
preact-main29.50ms - 30.65msunsure 🔍
-4% - +2%
-1.18ms - +0.49ms
-

usedJSHeapSize

VersionAvg timevs preact-localvs preact-main
preact-local2.96ms - 2.98ms-unsure 🔍
-1% - +0%
-0.03ms - +0.00ms
preact-main2.97ms - 3.00msunsure 🔍
-0% - +1%
-0.00ms - +0.03ms
-

tachometer-reporter-action v2 for CI

@JoviDeCroock JoviDeCroock mentioned this pull request Jul 7, 2026
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

Size Change: +6 B (+0.01%)

Total Size: 48 kB

📦 View Changed
Filename Size Change
compat/dist/compat.js 3.94 kB +2 B (+0.05%)
compat/dist/compat.mjs 3.87 kB +2 B (+0.05%)
compat/dist/compat.umd.js 4 kB +2 B (+0.05%)
ℹ️ View Unchanged
Filename Size
debug/dist/debug.js 3.91 kB
debug/dist/debug.mjs 3.91 kB
debug/dist/debug.umd.js 3.99 kB
devtools/dist/devtools.js 263 B
devtools/dist/devtools.mjs 273 B
devtools/dist/devtools.umd.js 348 B
dist/preact.js 4.85 kB
dist/preact.mjs 4.87 kB
dist/preact.umd.js 4.91 kB
hooks/dist/hooks.js 1.52 kB
hooks/dist/hooks.mjs 1.55 kB
hooks/dist/hooks.umd.js 1.59 kB
jsx-runtime/dist/jsxRuntime.js 892 B
jsx-runtime/dist/jsxRuntime.mjs 861 B
jsx-runtime/dist/jsxRuntime.umd.js 966 B
test-utils/dist/testUtils.js 473 B
test-utils/dist/testUtils.mjs 473 B
test-utils/dist/testUtils.umd.js 555 B

compressed-size-action

@coveralls

Copy link
Copy Markdown

Coverage Status

coverage: 98.528%. remained the same — JoviDeCroock/cherry-pick-pr-5145 into main

@JoviDeCroock
JoviDeCroock merged commit df509db into main Jul 7, 2026
13 checks passed
@JoviDeCroock
JoviDeCroock deleted the JoviDeCroock/cherry-pick-pr-5145 branch July 7, 2026 14:59
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.

3 participants