From 33a32441e991e126e5e874f831bd3afc237a3ecf Mon Sep 17 00:00:00 2001 From: Josh Story Date: Thu, 18 Apr 2024 21:06:04 -0700 Subject: [PATCH] Remove `renderToStaticNodeStream` (#28873) Stacked on #28872 renderToStaticNodeStream was not originally deprecated when renderToNodeStream was deprecated because it did not yet have a clear analog in the modern streaming implementation for SSR. In React 19 we have already removed renderToNodeStream. This change removes renderToStaticNodeStream as well because you can replicate it's semantics using renderToPipeableStream with onAllReady or renderToReadableStream with await stream.allready. --- packages/react-dom/npm/server.browser.js | 1 - packages/react-dom/npm/server.bun.js | 1 - packages/react-dom/npm/server.edge.js | 1 - packages/react-dom/npm/server.node.js | 1 - packages/react-dom/server.browser.js | 6 - packages/react-dom/server.bun.js | 7 -- packages/react-dom/server.edge.js | 7 -- packages/react-dom/server.node.js | 6 - ...eactDOMServerIntegrationNewContext-test.js | 91 --------------- .../__tests__/ReactServerRendering-test.js | 67 ----------- .../src/server/ReactDOMFizzServerBun.js | 13 +-- .../src/server/ReactDOMLegacyServerBrowser.js | 14 +-- .../src/server/ReactDOMLegacyServerNode.js | 8 +- .../server/ReactDOMLegacyServerNodeStream.js | 107 ------------------ .../src/server/react-dom-server.bun.stable.js | 6 +- 15 files changed, 4 insertions(+), 332 deletions(-) delete mode 100644 packages/react-dom/src/server/ReactDOMLegacyServerNodeStream.js diff --git a/packages/react-dom/npm/server.browser.js b/packages/react-dom/npm/server.browser.js index 4627357ca7460..318fe36fa203a 100644 --- a/packages/react-dom/npm/server.browser.js +++ b/packages/react-dom/npm/server.browser.js @@ -12,7 +12,6 @@ if (process.env.NODE_ENV === 'production') { exports.version = l.version; exports.renderToString = l.renderToString; exports.renderToStaticMarkup = l.renderToStaticMarkup; -exports.renderToStaticNodeStream = l.renderToStaticNodeStream; exports.renderToReadableStream = s.renderToReadableStream; if (s.resume) { exports.resume = s.resume; diff --git a/packages/react-dom/npm/server.bun.js b/packages/react-dom/npm/server.bun.js index cd45f7d7f1fa7..74390e99c86a4 100644 --- a/packages/react-dom/npm/server.bun.js +++ b/packages/react-dom/npm/server.bun.js @@ -15,6 +15,5 @@ exports.renderToReadableStream = b.renderToReadableStream; if (b.resume) { exports.resume = b.resume; } -exports.renderToStaticNodeStream = b.renderToStaticNodeStream; exports.renderToString = l.renderToString; exports.renderToStaticMarkup = l.renderToStaticMarkup; diff --git a/packages/react-dom/npm/server.edge.js b/packages/react-dom/npm/server.edge.js index c71b3ee805992..50192934179b2 100644 --- a/packages/react-dom/npm/server.edge.js +++ b/packages/react-dom/npm/server.edge.js @@ -12,7 +12,6 @@ if (process.env.NODE_ENV === 'production') { exports.version = b.version; exports.renderToReadableStream = b.renderToReadableStream; -exports.renderToStaticNodeStream = b.renderToStaticNodeStream; exports.renderToString = l.renderToString; exports.renderToStaticMarkup = l.renderToStaticMarkup; if (b.resume) { diff --git a/packages/react-dom/npm/server.node.js b/packages/react-dom/npm/server.node.js index 9aed61fffb37a..edee039b26b0a 100644 --- a/packages/react-dom/npm/server.node.js +++ b/packages/react-dom/npm/server.node.js @@ -12,7 +12,6 @@ if (process.env.NODE_ENV === 'production') { exports.version = l.version; exports.renderToString = l.renderToString; exports.renderToStaticMarkup = l.renderToStaticMarkup; -exports.renderToStaticNodeStream = l.renderToStaticNodeStream; exports.renderToPipeableStream = s.renderToPipeableStream; if (s.resumeToPipeableStream) { exports.resumeToPipeableStream = s.resumeToPipeableStream; diff --git a/packages/react-dom/server.browser.js b/packages/react-dom/server.browser.js index 490bc81504095..b27f4410dccff 100644 --- a/packages/react-dom/server.browser.js +++ b/packages/react-dom/server.browser.js @@ -23,12 +23,6 @@ export function renderToStaticMarkup() { arguments, ); } -export function renderToStaticNodeStream() { - return require('./src/server/ReactDOMLegacyServerBrowser').renderToStaticNodeStream.apply( - this, - arguments, - ); -} export function renderToReadableStream() { return require('./src/server/react-dom-server.browser').renderToReadableStream.apply( diff --git a/packages/react-dom/server.bun.js b/packages/react-dom/server.bun.js index 8e868a862159d..7d054e5534e2b 100644 --- a/packages/react-dom/server.bun.js +++ b/packages/react-dom/server.bun.js @@ -18,13 +18,6 @@ export function renderToReadableStream() { ); } -export function renderToStaticNodeStream() { - return require('./src/server/react-dom-server.bun').renderToStaticNodeStream.apply( - this, - arguments, - ); -} - export function renderToString() { return require('./src/server/ReactDOMLegacyServerBrowser').renderToString.apply( this, diff --git a/packages/react-dom/server.edge.js b/packages/react-dom/server.edge.js index d5a0ce6eb46f0..7282c4ed6c87f 100644 --- a/packages/react-dom/server.edge.js +++ b/packages/react-dom/server.edge.js @@ -18,13 +18,6 @@ export function renderToReadableStream() { ); } -export function renderToStaticNodeStream() { - return require('./src/server/react-dom-server.edge').renderToStaticNodeStream.apply( - this, - arguments, - ); -} - export function renderToString() { return require('./src/server/ReactDOMLegacyServerBrowser').renderToString.apply( this, diff --git a/packages/react-dom/server.node.js b/packages/react-dom/server.node.js index acdaa234f3c55..5f9c78f6dbd1d 100644 --- a/packages/react-dom/server.node.js +++ b/packages/react-dom/server.node.js @@ -23,12 +23,6 @@ export function renderToStaticMarkup() { arguments, ); } -export function renderToStaticNodeStream() { - return require('./src/server/ReactDOMLegacyServerNode').renderToStaticNodeStream.apply( - this, - arguments, - ); -} export function renderToPipeableStream() { return require('./src/server/react-dom-server.node').renderToPipeableStream.apply( diff --git a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js index 2e573164a2e16..24009f1eda47b 100644 --- a/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js @@ -324,97 +324,6 @@ describe('ReactDOMServerIntegration', () => { expect(e.textContent).toBe('dark'); }); - it('does not pollute parallel node streams', () => { - const LoggedInUser = React.createContext(); - - const AppWithUser = user => ( - -
- {whoAmI => whoAmI} -
-
- {whoAmI => whoAmI} -
-
- ); - - const streamAmy = ReactDOMServer.renderToStaticNodeStream( - AppWithUser('Amy'), - ).setEncoding('utf8'); - const streamBob = ReactDOMServer.renderToStaticNodeStream( - AppWithUser('Bob'), - ).setEncoding('utf8'); - - // Testing by filling the buffer using internal _read() with a small - // number of bytes to avoid a test case which needs to align to a - // highWaterMark boundary of 2^14 chars. - streamAmy._read(20); - streamBob._read(20); - streamAmy._read(20); - streamBob._read(20); - - expect(streamAmy.read()).toBe('
Amy
'); - expect(streamBob.read()).toBe('
Bob
'); - }); - - it('does not pollute parallel node streams when many are used', () => { - const CurrentIndex = React.createContext(); - - const NthRender = index => ( - -
- {idx => idx} -
-
- {idx => idx} -
-
- ); - - const streams = []; - - // Test with more than 32 streams to test that growing the thread count - // works properly. - const streamCount = 34; - - for (let i = 0; i < streamCount; i++) { - streams[i] = ReactDOMServer.renderToStaticNodeStream( - NthRender(i % 2 === 0 ? 'Expected to be recreated' : i), - ).setEncoding('utf8'); - } - - // Testing by filling the buffer using internal _read() with a small - // number of bytes to avoid a test case which needs to align to a - // highWaterMark boundary of 2^14 chars. - for (let i = 0; i < streamCount; i++) { - streams[i]._read(20); - } - - // Early destroy every other stream - for (let i = 0; i < streamCount; i += 2) { - streams[i].destroy(); - } - - // Recreate those same streams. - for (let i = 0; i < streamCount; i += 2) { - streams[i] = ReactDOMServer.renderToStaticNodeStream( - NthRender(i), - ).setEncoding('utf8'); - } - - // Read a bit from all streams again. - for (let i = 0; i < streamCount; i++) { - streams[i]._read(20); - } - - // Assert that all stream rendered the expected output. - for (let i = 0; i < streamCount; i++) { - expect(streams[i].read()).toBe( - '
' + i + '
', - ); - } - }); - it('does not pollute sync renders after an error', () => { const LoggedInUser = React.createContext('default'); const Crash = () => { diff --git a/packages/react-dom/src/__tests__/ReactServerRendering-test.js b/packages/react-dom/src/__tests__/ReactServerRendering-test.js index ab200d10517f7..b964656c5c7c7 100644 --- a/packages/react-dom/src/__tests__/ReactServerRendering-test.js +++ b/packages/react-dom/src/__tests__/ReactServerRendering-test.js @@ -577,73 +577,6 @@ describe('ReactDOMServer', () => { }); }); - describe('renderToStaticNodeStream', () => { - it('should generate simple markup', () => { - const SuccessfulElement = React.createElement(() => ); - expect(() => { - const response = - ReactDOMServer.renderToStaticNodeStream(SuccessfulElement); - expect(response.read().toString()).toMatch(new RegExp('')); - }).toErrorDev( - 'ReactDOMServer.renderToStaticNodeStream() is deprecated and will be removed in an upcomingrelease of React', - {withoutStack: true}, - ); - }); - - it('should handle errors correctly', () => { - const FailingElement = React.createElement(() => { - throw new Error('An Error'); - }); - - let response; - expect(() => { - response = ReactDOMServer.renderToStaticNodeStream(FailingElement); - }).toErrorDev( - 'ReactDOMServer.renderToStaticNodeStream() is deprecated and will be removed in an upcomingrelease of React', - {withoutStack: true}, - ); - return new Promise(resolve => { - response.once('error', () => { - resolve(); - }); - expect(response.read()).toBeNull(); - }); - }); - - it('should omit text and suspense placeholders', async () => { - let resolve = null; - const promise = new Promise(res => { - resolve = () => { - resolved = true; - res(); - }; - }); - let resolved = false; - function Suspender() { - if (resolved) { - return 'resolved'; - } - throw promise; - } - - let response; - expect(() => { - response = ReactDOMServer.renderToStaticNodeStream( -
- - - -
, - ); - }).toErrorDev( - 'ReactDOMServer.renderToStaticNodeStream() is deprecated and will be removed in an upcomingrelease of React', - {withoutStack: true}, - ); - await resolve(); - expect(response.read().toString()).toEqual('
resolved
'); - }); - }); - it('warns with a no-op when an async setState is triggered', () => { class Foo extends React.Component { UNSAFE_componentWillMount() { diff --git a/packages/react-dom/src/server/ReactDOMFizzServerBun.js b/packages/react-dom/src/server/ReactDOMFizzServerBun.js index bc0206cdc8057..4cceb66e7cdf7 100644 --- a/packages/react-dom/src/server/ReactDOMFizzServerBun.js +++ b/packages/react-dom/src/server/ReactDOMFizzServerBun.js @@ -146,15 +146,4 @@ function renderToReadableStream( }); } -function renderToStaticNodeStream() { - throw new Error( - 'ReactDOMServer.renderToStaticNodeStream(): The Node Stream API is not available ' + - 'in Bun. Use ReactDOMServer.renderToReadableStream() instead.', - ); -} - -export { - renderToReadableStream, - renderToStaticNodeStream, - ReactVersion as version, -}; +export {renderToReadableStream, ReactVersion as version}; diff --git a/packages/react-dom/src/server/ReactDOMLegacyServerBrowser.js b/packages/react-dom/src/server/ReactDOMLegacyServerBrowser.js index 01fdbd8d50b62..43bf22bddbdfd 100644 --- a/packages/react-dom/src/server/ReactDOMLegacyServerBrowser.js +++ b/packages/react-dom/src/server/ReactDOMLegacyServerBrowser.js @@ -39,16 +39,4 @@ function renderToStaticMarkup( ); } -function renderToStaticNodeStream() { - throw new Error( - 'ReactDOMServer.renderToStaticNodeStream(): The streaming API is not available ' + - 'in the browser. Use ReactDOMServer.renderToStaticMarkup() instead.', - ); -} - -export { - renderToString, - renderToStaticMarkup, - renderToStaticNodeStream, - version, -}; +export {renderToString, renderToStaticMarkup, version}; diff --git a/packages/react-dom/src/server/ReactDOMLegacyServerNode.js b/packages/react-dom/src/server/ReactDOMLegacyServerNode.js index 07765e2b74333..681a07b411002 100644 --- a/packages/react-dom/src/server/ReactDOMLegacyServerNode.js +++ b/packages/react-dom/src/server/ReactDOMLegacyServerNode.js @@ -10,7 +10,6 @@ import type {ReactNodeList} from 'shared/ReactTypes'; import {version, renderToStringImpl} from './ReactDOMLegacyServerImpl'; -import {renderToStaticNodeStream} from './ReactDOMLegacyServerNodeStream'; type ServerOptions = { identifierPrefix?: string, @@ -40,9 +39,4 @@ function renderToStaticMarkup( ); } -export { - renderToString, - renderToStaticMarkup, - renderToStaticNodeStream, - version, -}; +export {renderToString, renderToStaticMarkup, version}; diff --git a/packages/react-dom/src/server/ReactDOMLegacyServerNodeStream.js b/packages/react-dom/src/server/ReactDOMLegacyServerNodeStream.js deleted file mode 100644 index 374a4a5068839..0000000000000 --- a/packages/react-dom/src/server/ReactDOMLegacyServerNodeStream.js +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @flow - */ - -import type {ReactNodeList} from 'shared/ReactTypes'; - -import type {Request} from 'react-server/src/ReactFizzServer'; - -import { - createRequest, - startWork, - startFlowing, - abort, -} from 'react-server/src/ReactFizzServer'; - -import { - createResumableState, - createRenderState, - createRootFormatContext, -} from 'react-dom-bindings/src/server/ReactFizzConfigDOMLegacy'; - -import {Readable} from 'stream'; - -type ServerOptions = { - identifierPrefix?: string, -}; - -class ReactMarkupReadableStream extends Readable { - request: Request; - startedFlowing: boolean; - constructor() { - // Calls the stream.Readable(options) constructor. Consider exposing built-in - // features like highWaterMark in the future. - super({}); - this.request = (null: any); - this.startedFlowing = false; - } - - // $FlowFixMe[missing-local-annot] - _destroy(err, callback) { - abort(this.request); - callback(err); - } - - // $FlowFixMe[missing-local-annot] - _read(size) { - if (this.startedFlowing) { - startFlowing(this.request, this); - } - } -} - -function onError() { - // Non-fatal errors are ignored. -} - -let didWarnAboutDeprecatedRenderToStaticNodeStream = false; - -function renderToStaticNodeStream( - children: ReactNodeList, - options?: ServerOptions, -): Readable { - if (__DEV__) { - if (!didWarnAboutDeprecatedRenderToStaticNodeStream) { - didWarnAboutDeprecatedRenderToStaticNodeStream = true; - console.error( - 'ReactDOMServer.renderToStaticNodeStream() is deprecated and will be removed in an upcoming' + - 'release of React. Use ReactDOMServer.renderToPipeableStream() and wait to `pipe` until the `onAllReady`' + - ' callback has been called to produce a document suitable for static use cases.', - ); - } - } - - function onAllReady() { - // We wait until everything has loaded before starting to write. - // That way we only end up with fully resolved HTML even if we suspend. - destination.startedFlowing = true; - startFlowing(request, destination); - } - const destination = new ReactMarkupReadableStream(); - const resumableState = createResumableState( - options ? options.identifierPrefix : undefined, - undefined, - ); - const request = createRequest( - children, - resumableState, - createRenderState(resumableState, true), - createRootFormatContext(), - Infinity, - onError, - onAllReady, - undefined, - undefined, - undefined, - ); - destination.request = request; - startWork(request); - return destination; -} - -export {renderToStaticNodeStream}; diff --git a/packages/react-dom/src/server/react-dom-server.bun.stable.js b/packages/react-dom/src/server/react-dom-server.bun.stable.js index 74f933dcfeb96..4d17773002f7f 100644 --- a/packages/react-dom/src/server/react-dom-server.bun.stable.js +++ b/packages/react-dom/src/server/react-dom-server.bun.stable.js @@ -7,8 +7,4 @@ * @flow */ -export { - renderToReadableStream, - renderToStaticNodeStream, - version, -} from './ReactDOMFizzServerBun.js'; +export {renderToReadableStream, version} from './ReactDOMFizzServerBun.js';