From 0d4e24bad1b7d24b91db5fade3528e0d9f0d7a16 Mon Sep 17 00:00:00 2001 From: Josh Story Date: Thu, 18 Apr 2024 18:33:53 -0700 Subject: [PATCH] Deprecate `renderToStaticNodeStream` (#28872) This commit adds warnings indicating that `renderToStaticNodeStream` will be removed in an upcoming React release. This API has been legacy, is not widely used (renderToStaticMarkup is more common) and has semantically eqiuvalent implementations with renderToReadableStream and renderToPipeableStream. --- .../__tests__/ReactServerRendering-test.js | 27 +++++++++++-------- .../server/ReactDOMLegacyServerNodeStream.js | 7 +++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/packages/react-dom/src/__tests__/ReactServerRendering-test.js b/packages/react-dom/src/__tests__/ReactServerRendering-test.js index fed6988077187..1c41d040efa4c 100644 --- a/packages/react-dom/src/__tests__/ReactServerRendering-test.js +++ b/packages/react-dom/src/__tests__/ReactServerRendering-test.js @@ -620,17 +620,26 @@ describe('ReactDOMServer', () => { describe('renderToStaticNodeStream', () => { it('should generate simple markup', () => { const SuccessfulElement = React.createElement(() => ); - const response = ReactDOMServer.renderToStaticNodeStream( - SuccessfulElement, - ); - expect(response.read().toString()).toMatch(new RegExp('')); + expect(() => { + const response = + ReactDOMServer.renderToStaticNodeStream(SuccessfulElement); + expect(response.read().toString()).toMatch(new RegExp('')); + }).toErrorDev('ReactDOMServer.renderToStaticNodeStream() is deprecated', { + withoutStack: true, + }); }); it('should handle errors correctly', () => { const FailingElement = React.createElement(() => { throw new Error('An Error'); }); - const response = ReactDOMServer.renderToStaticNodeStream(FailingElement); + + let response; + expect(() => { + response = ReactDOMServer.renderToStaticNodeStream(FailingElement); + }).toErrorDev('ReactDOMServer.renderToStaticNodeStream() is deprecated', { + withoutStack: true, + }); return new Promise(resolve => { response.once('error', () => { resolve(); @@ -689,9 +698,7 @@ describe('ReactDOMServer', () => { } ReactDOMServer.renderToString(); - expect(() => - jest.runOnlyPendingTimers(), - ).toErrorDev( + expect(() => jest.runOnlyPendingTimers()).toErrorDev( 'Warning: setState(...): Can only update a mounting component.' + ' This usually means you called setState() outside componentWillMount() on the server.' + ' This is a no-op.\n\nPlease check the code for the Foo component.', @@ -719,9 +726,7 @@ describe('ReactDOMServer', () => { } ReactDOMServer.renderToString(); - expect(() => - jest.runOnlyPendingTimers(), - ).toErrorDev( + expect(() => jest.runOnlyPendingTimers()).toErrorDev( 'Warning: forceUpdate(...): Can only update a mounting component. ' + 'This usually means you called forceUpdate() outside componentWillMount() on the server. ' + 'This is a no-op.\n\nPlease check the code for the Baz component.', diff --git a/packages/react-dom/src/server/ReactDOMLegacyServerNodeStream.js b/packages/react-dom/src/server/ReactDOMLegacyServerNodeStream.js index 25b88156e0755..9aef2f00fea44 100644 --- a/packages/react-dom/src/server/ReactDOMLegacyServerNodeStream.js +++ b/packages/react-dom/src/server/ReactDOMLegacyServerNodeStream.js @@ -100,6 +100,13 @@ function renderToStaticNodeStream( children: ReactNodeList, options?: ServerOptions, ): Readable { + if (__DEV__) { + console.error( + 'ReactDOMServer.renderToStaticNodeStream() is deprecated.' + + ' Use ReactDOMServer.renderToPipeableStream() and wait to `pipe` until the `onAllReady`' + + ' callback has been called instead.', + ); + } return renderToNodeStreamImpl(children, options, true); }