Skip to content

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR - #35022

Merged
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer
Nov 5, 2025
Merged

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR#35022
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer

Conversation

@sebmarkbage

Copy link
Copy Markdown
Contributor

We've long had the CPU suspense feature behind a flag under the terrible API unstable_expectedLoadTime={arbitraryNumber}. We've known for a long time we want it to just be defer={true} (or just <Suspense defer> in the short hand syntax). So this adds the new name and warns for the old name.

For only the new name, I also implemented SSR semantics in Fizz. It has two effects here.

  1. It renders the fallback before the content (similar to prerender) allowing siblings to complete quicker.
  2. It always outlines the result. When streaming this should really happen naturally but if you defer a prerendered content it also implies that it's expensive and should be outlined. It gives you a opt-in to outlining similar to suspensey images and css but let you control it manually.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 31, 2025
This is similar to what we do with prerenders.
@react-sizebot

Copy link
Copy Markdown

Comparing: 6fb7754...0871e9a

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.42 kB=117.09 kB117.10 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.29 kB=121.13 kB121.14 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.72 kB+0.01%119.49 kB119.50 kB
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-experimental/react-server/cjs/react-server.production.js+0.48%154.49 kB155.24 kB+0.35%26.79 kB26.88 kB
oss-experimental/react-server/cjs/react-server.development.js+0.34%216.41 kB217.14 kB+0.31%37.46 kB37.58 kB
oss-experimental/react-markup/cjs/react-markup.production.js+0.28%252.23 kB252.93 kB+0.24%46.29 kB46.40 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js+0.26%266.33 kB267.01 kB+0.20%48.57 kB48.67 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js+0.24%294.53 kB295.24 kB+0.23%51.55 kB51.67 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js+0.24%295.45 kB296.17 kB+0.21%51.37 kB51.48 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js+0.24%264.86 kB265.50 kB+0.24%47.00 kB47.11 kB
facebook-www/ReactDOMServer-prod.modern.js+0.24%256.60 kB257.21 kB+0.19%45.83 kB45.92 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js+0.24%300.87 kB301.58 kB+0.22%53.92 kB54.04 kB
facebook-www/ReactDOMServer-prod.classic.js+0.24%258.94 kB259.55 kB+0.18%46.17 kB46.25 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js+0.24%270.40 kB271.04 kB+0.19%49.13 kB49.22 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js+0.23%308.71 kB309.43 kB+0.22%53.76 kB53.88 kB

Generated by 🚫 dangerJS against 0871e9a

@sebmarkbage
sebmarkbage merged commit 0ba2f01 into react:mainNov 5, 2025
240 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
sebmarkbage added a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@sebmarkbage@react-sizebot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR by sebmarkbage · Pull Request #35022 · react/react · GitHub
Skip to content

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR - #35022

Merged
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer
Nov 5, 2025
Merged

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR#35022
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer

Conversation

@sebmarkbage

Copy link
Copy Markdown
Contributor

We've long had the CPU suspense feature behind a flag under the terrible API unstable_expectedLoadTime={arbitraryNumber}. We've known for a long time we want it to just be defer={true} (or just <Suspense defer> in the short hand syntax). So this adds the new name and warns for the old name.

For only the new name, I also implemented SSR semantics in Fizz. It has two effects here.

  1. It renders the fallback before the content (similar to prerender) allowing siblings to complete quicker.
  2. It always outlines the result. When streaming this should really happen naturally but if you defer a prerendered content it also implies that it's expensive and should be outlined. It gives you a opt-in to outlining similar to suspensey images and css but let you control it manually.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 31, 2025
This is similar to what we do with prerenders.
@react-sizebot

Copy link
Copy Markdown

Comparing: 6fb7754...0871e9a

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.42 kB=117.09 kB117.10 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.29 kB=121.13 kB121.14 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.72 kB+0.01%119.49 kB119.50 kB
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-experimental/react-server/cjs/react-server.production.js+0.48%154.49 kB155.24 kB+0.35%26.79 kB26.88 kB
oss-experimental/react-server/cjs/react-server.development.js+0.34%216.41 kB217.14 kB+0.31%37.46 kB37.58 kB
oss-experimental/react-markup/cjs/react-markup.production.js+0.28%252.23 kB252.93 kB+0.24%46.29 kB46.40 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js+0.26%266.33 kB267.01 kB+0.20%48.57 kB48.67 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js+0.24%294.53 kB295.24 kB+0.23%51.55 kB51.67 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js+0.24%295.45 kB296.17 kB+0.21%51.37 kB51.48 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js+0.24%264.86 kB265.50 kB+0.24%47.00 kB47.11 kB
facebook-www/ReactDOMServer-prod.modern.js+0.24%256.60 kB257.21 kB+0.19%45.83 kB45.92 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js+0.24%300.87 kB301.58 kB+0.22%53.92 kB54.04 kB
facebook-www/ReactDOMServer-prod.classic.js+0.24%258.94 kB259.55 kB+0.18%46.17 kB46.25 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js+0.24%270.40 kB271.04 kB+0.19%49.13 kB49.22 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js+0.23%308.71 kB309.43 kB+0.22%53.76 kB53.88 kB

Generated by 🚫 dangerJS against 0871e9a

@sebmarkbage
sebmarkbage merged commit 0ba2f01 into react:mainNov 5, 2025
240 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
sebmarkbage added a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@sebmarkbage@react-sizebot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR by sebmarkbage · Pull Request #35022 · react/react · GitHub
Skip to content

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR - #35022

Merged
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer
Nov 5, 2025
Merged

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR#35022
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer

Conversation

@sebmarkbage

Copy link
Copy Markdown
Contributor

We've long had the CPU suspense feature behind a flag under the terrible API unstable_expectedLoadTime={arbitraryNumber}. We've known for a long time we want it to just be defer={true} (or just <Suspense defer> in the short hand syntax). So this adds the new name and warns for the old name.

For only the new name, I also implemented SSR semantics in Fizz. It has two effects here.

  1. It renders the fallback before the content (similar to prerender) allowing siblings to complete quicker.
  2. It always outlines the result. When streaming this should really happen naturally but if you defer a prerendered content it also implies that it's expensive and should be outlined. It gives you a opt-in to outlining similar to suspensey images and css but let you control it manually.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 31, 2025
This is similar to what we do with prerenders.
@react-sizebot

Copy link
Copy Markdown

Comparing: 6fb7754...0871e9a

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.42 kB=117.09 kB117.10 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.29 kB=121.13 kB121.14 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.72 kB+0.01%119.49 kB119.50 kB
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-experimental/react-server/cjs/react-server.production.js+0.48%154.49 kB155.24 kB+0.35%26.79 kB26.88 kB
oss-experimental/react-server/cjs/react-server.development.js+0.34%216.41 kB217.14 kB+0.31%37.46 kB37.58 kB
oss-experimental/react-markup/cjs/react-markup.production.js+0.28%252.23 kB252.93 kB+0.24%46.29 kB46.40 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js+0.26%266.33 kB267.01 kB+0.20%48.57 kB48.67 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js+0.24%294.53 kB295.24 kB+0.23%51.55 kB51.67 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js+0.24%295.45 kB296.17 kB+0.21%51.37 kB51.48 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js+0.24%264.86 kB265.50 kB+0.24%47.00 kB47.11 kB
facebook-www/ReactDOMServer-prod.modern.js+0.24%256.60 kB257.21 kB+0.19%45.83 kB45.92 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js+0.24%300.87 kB301.58 kB+0.22%53.92 kB54.04 kB
facebook-www/ReactDOMServer-prod.classic.js+0.24%258.94 kB259.55 kB+0.18%46.17 kB46.25 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js+0.24%270.40 kB271.04 kB+0.19%49.13 kB49.22 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js+0.23%308.71 kB309.43 kB+0.22%53.76 kB53.88 kB

Generated by 🚫 dangerJS against 0871e9a

@sebmarkbage
sebmarkbage merged commit 0ba2f01 into react:mainNov 5, 2025
240 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
sebmarkbage added a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@sebmarkbage@react-sizebot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR by sebmarkbage · Pull Request #35022 · react/react · GitHub
Skip to content

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR - #35022

Merged
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer
Nov 5, 2025
Merged

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR#35022
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer

Conversation

@sebmarkbage

Copy link
Copy Markdown
Contributor

We've long had the CPU suspense feature behind a flag under the terrible API unstable_expectedLoadTime={arbitraryNumber}. We've known for a long time we want it to just be defer={true} (or just <Suspense defer> in the short hand syntax). So this adds the new name and warns for the old name.

For only the new name, I also implemented SSR semantics in Fizz. It has two effects here.

  1. It renders the fallback before the content (similar to prerender) allowing siblings to complete quicker.
  2. It always outlines the result. When streaming this should really happen naturally but if you defer a prerendered content it also implies that it's expensive and should be outlined. It gives you a opt-in to outlining similar to suspensey images and css but let you control it manually.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 31, 2025
This is similar to what we do with prerenders.
@react-sizebot

Copy link
Copy Markdown

Comparing: 6fb7754...0871e9a

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.42 kB=117.09 kB117.10 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.29 kB=121.13 kB121.14 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.72 kB+0.01%119.49 kB119.50 kB
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-experimental/react-server/cjs/react-server.production.js+0.48%154.49 kB155.24 kB+0.35%26.79 kB26.88 kB
oss-experimental/react-server/cjs/react-server.development.js+0.34%216.41 kB217.14 kB+0.31%37.46 kB37.58 kB
oss-experimental/react-markup/cjs/react-markup.production.js+0.28%252.23 kB252.93 kB+0.24%46.29 kB46.40 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js+0.26%266.33 kB267.01 kB+0.20%48.57 kB48.67 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js+0.24%294.53 kB295.24 kB+0.23%51.55 kB51.67 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js+0.24%295.45 kB296.17 kB+0.21%51.37 kB51.48 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js+0.24%264.86 kB265.50 kB+0.24%47.00 kB47.11 kB
facebook-www/ReactDOMServer-prod.modern.js+0.24%256.60 kB257.21 kB+0.19%45.83 kB45.92 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js+0.24%300.87 kB301.58 kB+0.22%53.92 kB54.04 kB
facebook-www/ReactDOMServer-prod.classic.js+0.24%258.94 kB259.55 kB+0.18%46.17 kB46.25 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js+0.24%270.40 kB271.04 kB+0.19%49.13 kB49.22 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js+0.23%308.71 kB309.43 kB+0.22%53.76 kB53.88 kB

Generated by 🚫 dangerJS against 0871e9a

@sebmarkbage
sebmarkbage merged commit 0ba2f01 into react:mainNov 5, 2025
240 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
sebmarkbage added a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@sebmarkbage@react-sizebot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR by sebmarkbage · Pull Request #35022 · react/react · GitHub
Skip to content

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR - #35022

Merged
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer
Nov 5, 2025
Merged

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR#35022
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer

Conversation

@sebmarkbage

Copy link
Copy Markdown
Contributor

We've long had the CPU suspense feature behind a flag under the terrible API unstable_expectedLoadTime={arbitraryNumber}. We've known for a long time we want it to just be defer={true} (or just <Suspense defer> in the short hand syntax). So this adds the new name and warns for the old name.

For only the new name, I also implemented SSR semantics in Fizz. It has two effects here.

  1. It renders the fallback before the content (similar to prerender) allowing siblings to complete quicker.
  2. It always outlines the result. When streaming this should really happen naturally but if you defer a prerendered content it also implies that it's expensive and should be outlined. It gives you a opt-in to outlining similar to suspensey images and css but let you control it manually.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 31, 2025
This is similar to what we do with prerenders.
@react-sizebot

Copy link
Copy Markdown

Comparing: 6fb7754...0871e9a

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.42 kB=117.09 kB117.10 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.29 kB=121.13 kB121.14 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.72 kB+0.01%119.49 kB119.50 kB
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-experimental/react-server/cjs/react-server.production.js+0.48%154.49 kB155.24 kB+0.35%26.79 kB26.88 kB
oss-experimental/react-server/cjs/react-server.development.js+0.34%216.41 kB217.14 kB+0.31%37.46 kB37.58 kB
oss-experimental/react-markup/cjs/react-markup.production.js+0.28%252.23 kB252.93 kB+0.24%46.29 kB46.40 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js+0.26%266.33 kB267.01 kB+0.20%48.57 kB48.67 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js+0.24%294.53 kB295.24 kB+0.23%51.55 kB51.67 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js+0.24%295.45 kB296.17 kB+0.21%51.37 kB51.48 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js+0.24%264.86 kB265.50 kB+0.24%47.00 kB47.11 kB
facebook-www/ReactDOMServer-prod.modern.js+0.24%256.60 kB257.21 kB+0.19%45.83 kB45.92 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js+0.24%300.87 kB301.58 kB+0.22%53.92 kB54.04 kB
facebook-www/ReactDOMServer-prod.classic.js+0.24%258.94 kB259.55 kB+0.18%46.17 kB46.25 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js+0.24%270.40 kB271.04 kB+0.19%49.13 kB49.22 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js+0.23%308.71 kB309.43 kB+0.22%53.76 kB53.88 kB

Generated by 🚫 dangerJS against 0871e9a

@sebmarkbage
sebmarkbage merged commit 0ba2f01 into react:mainNov 5, 2025
240 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
sebmarkbage added a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@sebmarkbage@react-sizebot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR by sebmarkbage · Pull Request #35022 · react/react · GitHub
Skip to content

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR - #35022

Merged
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer
Nov 5, 2025
Merged

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR#35022
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer

Conversation

@sebmarkbage

Copy link
Copy Markdown
Contributor

We've long had the CPU suspense feature behind a flag under the terrible API unstable_expectedLoadTime={arbitraryNumber}. We've known for a long time we want it to just be defer={true} (or just <Suspense defer> in the short hand syntax). So this adds the new name and warns for the old name.

For only the new name, I also implemented SSR semantics in Fizz. It has two effects here.

  1. It renders the fallback before the content (similar to prerender) allowing siblings to complete quicker.
  2. It always outlines the result. When streaming this should really happen naturally but if you defer a prerendered content it also implies that it's expensive and should be outlined. It gives you a opt-in to outlining similar to suspensey images and css but let you control it manually.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 31, 2025
This is similar to what we do with prerenders.
@react-sizebot

Copy link
Copy Markdown

Comparing: 6fb7754...0871e9a

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.42 kB=117.09 kB117.10 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.29 kB=121.13 kB121.14 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.72 kB+0.01%119.49 kB119.50 kB
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-experimental/react-server/cjs/react-server.production.js+0.48%154.49 kB155.24 kB+0.35%26.79 kB26.88 kB
oss-experimental/react-server/cjs/react-server.development.js+0.34%216.41 kB217.14 kB+0.31%37.46 kB37.58 kB
oss-experimental/react-markup/cjs/react-markup.production.js+0.28%252.23 kB252.93 kB+0.24%46.29 kB46.40 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js+0.26%266.33 kB267.01 kB+0.20%48.57 kB48.67 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js+0.24%294.53 kB295.24 kB+0.23%51.55 kB51.67 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js+0.24%295.45 kB296.17 kB+0.21%51.37 kB51.48 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js+0.24%264.86 kB265.50 kB+0.24%47.00 kB47.11 kB
facebook-www/ReactDOMServer-prod.modern.js+0.24%256.60 kB257.21 kB+0.19%45.83 kB45.92 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js+0.24%300.87 kB301.58 kB+0.22%53.92 kB54.04 kB
facebook-www/ReactDOMServer-prod.classic.js+0.24%258.94 kB259.55 kB+0.18%46.17 kB46.25 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js+0.24%270.40 kB271.04 kB+0.19%49.13 kB49.22 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js+0.23%308.71 kB309.43 kB+0.22%53.76 kB53.88 kB

Generated by 🚫 dangerJS against 0871e9a

@sebmarkbage
sebmarkbage merged commit 0ba2f01 into react:mainNov 5, 2025
240 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
sebmarkbage added a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@sebmarkbage@react-sizebot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR by sebmarkbage · Pull Request #35022 · react/react · GitHub
Skip to content

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR - #35022

Merged
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer
Nov 5, 2025
Merged

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR#35022
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer

Conversation

@sebmarkbage

Copy link
Copy Markdown
Contributor

We've long had the CPU suspense feature behind a flag under the terrible API unstable_expectedLoadTime={arbitraryNumber}. We've known for a long time we want it to just be defer={true} (or just <Suspense defer> in the short hand syntax). So this adds the new name and warns for the old name.

For only the new name, I also implemented SSR semantics in Fizz. It has two effects here.

  1. It renders the fallback before the content (similar to prerender) allowing siblings to complete quicker.
  2. It always outlines the result. When streaming this should really happen naturally but if you defer a prerendered content it also implies that it's expensive and should be outlined. It gives you a opt-in to outlining similar to suspensey images and css but let you control it manually.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 31, 2025
This is similar to what we do with prerenders.
@react-sizebot

Copy link
Copy Markdown

Comparing: 6fb7754...0871e9a

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.42 kB=117.09 kB117.10 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.29 kB=121.13 kB121.14 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.72 kB+0.01%119.49 kB119.50 kB
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-experimental/react-server/cjs/react-server.production.js+0.48%154.49 kB155.24 kB+0.35%26.79 kB26.88 kB
oss-experimental/react-server/cjs/react-server.development.js+0.34%216.41 kB217.14 kB+0.31%37.46 kB37.58 kB
oss-experimental/react-markup/cjs/react-markup.production.js+0.28%252.23 kB252.93 kB+0.24%46.29 kB46.40 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js+0.26%266.33 kB267.01 kB+0.20%48.57 kB48.67 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js+0.24%294.53 kB295.24 kB+0.23%51.55 kB51.67 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js+0.24%295.45 kB296.17 kB+0.21%51.37 kB51.48 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js+0.24%264.86 kB265.50 kB+0.24%47.00 kB47.11 kB
facebook-www/ReactDOMServer-prod.modern.js+0.24%256.60 kB257.21 kB+0.19%45.83 kB45.92 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js+0.24%300.87 kB301.58 kB+0.22%53.92 kB54.04 kB
facebook-www/ReactDOMServer-prod.classic.js+0.24%258.94 kB259.55 kB+0.18%46.17 kB46.25 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js+0.24%270.40 kB271.04 kB+0.19%49.13 kB49.22 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js+0.23%308.71 kB309.43 kB+0.22%53.76 kB53.88 kB

Generated by 🚫 dangerJS against 0871e9a

@sebmarkbage
sebmarkbage merged commit 0ba2f01 into react:mainNov 5, 2025
240 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
sebmarkbage added a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@sebmarkbage@react-sizebot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR by sebmarkbage · Pull Request #35022 · react/react · GitHub
Skip to content

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR - #35022

Merged
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer
Nov 5, 2025
Merged

Rename <Suspense unstable_expectedLoadTime> to <Suspense defer> and implement in SSR#35022
sebmarkbage merged 3 commits into
react:mainfrom
sebmarkbage:suspensedefer

Conversation

@sebmarkbage

Copy link
Copy Markdown
Contributor

We've long had the CPU suspense feature behind a flag under the terrible API unstable_expectedLoadTime={arbitraryNumber}. We've known for a long time we want it to just be defer={true} (or just <Suspense defer> in the short hand syntax). So this adds the new name and warns for the old name.

For only the new name, I also implemented SSR semantics in Fizz. It has two effects here.

  1. It renders the fallback before the content (similar to prerender) allowing siblings to complete quicker.
  2. It always outlines the result. When streaming this should really happen naturally but if you defer a prerendered content it also implies that it's expensive and should be outlined. It gives you a opt-in to outlining similar to suspensey images and css but let you control it manually.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 31, 2025
This is similar to what we do with prerenders.
@react-sizebot

Copy link
Copy Markdown

Comparing: 6fb7754...0871e9a

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=605.41 kB605.41 kB=107.22 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=664.38 kB664.42 kB=117.09 kB117.10 kB
facebook-www/ReactDOM-prod.classic.js=688.25 kB688.29 kB=121.13 kB121.14 kB
facebook-www/ReactDOM-prod.modern.js=678.67 kB678.72 kB+0.01%119.49 kB119.50 kB
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-stable/react-server/cjs/react-server.production.js+2.20%142.39 kB145.52 kB+1.71%25.03 kB25.46 kB
oss-experimental/react-server/cjs/react-server.production.js+0.48%154.49 kB155.24 kB+0.35%26.79 kB26.88 kB
oss-experimental/react-server/cjs/react-server.development.js+0.34%216.41 kB217.14 kB+0.31%37.46 kB37.58 kB
oss-experimental/react-markup/cjs/react-markup.production.js+0.28%252.23 kB252.93 kB+0.24%46.29 kB46.40 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js+0.26%266.33 kB267.01 kB+0.20%48.57 kB48.67 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js+0.24%294.53 kB295.24 kB+0.23%51.55 kB51.67 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js+0.24%295.45 kB296.17 kB+0.21%51.37 kB51.48 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js+0.24%264.86 kB265.50 kB+0.24%47.00 kB47.11 kB
facebook-www/ReactDOMServer-prod.modern.js+0.24%256.60 kB257.21 kB+0.19%45.83 kB45.92 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js+0.24%300.87 kB301.58 kB+0.22%53.92 kB54.04 kB
facebook-www/ReactDOMServer-prod.classic.js+0.24%258.94 kB259.55 kB+0.18%46.17 kB46.25 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js+0.24%270.40 kB271.04 kB+0.19%49.13 kB49.22 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js+0.23%308.71 kB309.43 kB+0.22%53.76 kB53.88 kB

Generated by 🚫 dangerJS against 0871e9a

@sebmarkbage
sebmarkbage merged commit 0ba2f01 into react:mainNov 5, 2025
240 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
…mplement in SSR (#35022)
We've long had the CPU suspense feature behind a flag under the terrible
API `unstable_expectedLoadTime={arbitraryNumber}`. We've known for a
long time we want it to just be `defer={true}` (or just `<Suspense
defer>` in the short hand syntax). So this adds the new name and warns
for the old name.
For only the new name, I also implemented SSR semantics in Fizz. It has
two effects here.
1) It renders the fallback before the content (similar to prerender)
allowing siblings to complete quicker.
2) It always outlines the result. When streaming this should really
happen naturally but if you defer a prerendered content it also implies
that it's expensive and should be outlined. It gives you a opt-in to
outlining similar to suspensey images and css but let you control it
manually.
DiffTrain build for [0ba2f01](0ba2f01)
sebmarkbage added a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
github-actionsBot pushed a commit that referenced this pull request Nov 5, 2025
Follow up to #35022.
It's now replaced by the `defer` option.
Sounds like nobody is actually using this option, including Meta, so we
can just delete it.
DiffTrain build for [fa767da](fa767da)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@sebmarkbage@react-sizebot