@samitouri / QOS-React / commits / 33a32441e9

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.

Josh Story committed Apr 18, 2024 at 21:06 UTC 33a32441e991e126e5e874f831bd3afc237a3ecf
15 files changed +4 -332
packages/react-dom/npm/server.browser.js
-1
@@ -12,7 +12,6 @@ if (process.env.NODE_ENV === 'production') {
12 exports.version = l.version;
13 exports.renderToString = l.renderToString;
14 exports.renderToStaticMarkup = l.renderToStaticMarkup;
15 -exports.renderToStaticNodeStream = l.renderToStaticNodeStream;
15 exports.renderToReadableStream = s.renderToReadableStream;
16 if (s.resume) {
17 exports.resume = s.resume;
packages/react-dom/npm/server.bun.js
-1
@@ -15,6 +15,5 @@ exports.renderToReadableStream = b.renderToReadableStream;
15 if (b.resume) {
16 exports.resume = b.resume;
17 }
18 -exports.renderToStaticNodeStream = b.renderToStaticNodeStream;
18 exports.renderToString = l.renderToString;
19 exports.renderToStaticMarkup = l.renderToStaticMarkup;
packages/react-dom/npm/server.edge.js
-1
@@ -12,7 +12,6 @@ if (process.env.NODE_ENV === 'production') {
12
13 exports.version = b.version;
14 exports.renderToReadableStream = b.renderToReadableStream;
15 -exports.renderToStaticNodeStream = b.renderToStaticNodeStream;
15 exports.renderToString = l.renderToString;
16 exports.renderToStaticMarkup = l.renderToStaticMarkup;
17 if (b.resume) {
packages/react-dom/npm/server.node.js
-1
@@ -12,7 +12,6 @@ if (process.env.NODE_ENV === 'production') {
12 exports.version = l.version;
13 exports.renderToString = l.renderToString;
14 exports.renderToStaticMarkup = l.renderToStaticMarkup;
15 -exports.renderToStaticNodeStream = l.renderToStaticNodeStream;
15 exports.renderToPipeableStream = s.renderToPipeableStream;
16 if (s.resumeToPipeableStream) {
17 exports.resumeToPipeableStream = s.resumeToPipeableStream;
packages/react-dom/server.browser.js
-6
@@ -23,12 +23,6 @@ export function renderToStaticMarkup() {
23 arguments,
24 );
25 }
26 -export function renderToStaticNodeStream() {
27 - return require('./src/server/ReactDOMLegacyServerBrowser').renderToStaticNodeStream.apply(
28 - this,
29 - arguments,
30 - );
31 -}
26
27 export function renderToReadableStream() {
28 return require('./src/server/react-dom-server.browser').renderToReadableStream.apply(
packages/react-dom/server.bun.js
-7
@@ -18,13 +18,6 @@ export function renderToReadableStream() {
18 );
19 }
20
21 -export function renderToStaticNodeStream() {
22 - return require('./src/server/react-dom-server.bun').renderToStaticNodeStream.apply(
23 - this,
24 - arguments,
25 - );
26 -}
27 -
21 export function renderToString() {
22 return require('./src/server/ReactDOMLegacyServerBrowser').renderToString.apply(
23 this,
packages/react-dom/server.edge.js
-7
@@ -18,13 +18,6 @@ export function renderToReadableStream() {
18 );
19 }
20
21 -export function renderToStaticNodeStream() {
22 - return require('./src/server/react-dom-server.edge').renderToStaticNodeStream.apply(
23 - this,
24 - arguments,
25 - );
26 -}
27 -
21 export function renderToString() {
22 return require('./src/server/ReactDOMLegacyServerBrowser').renderToString.apply(
23 this,
packages/react-dom/server.node.js
-6
@@ -23,12 +23,6 @@ export function renderToStaticMarkup() {
23 arguments,
24 );
25 }
26 -export function renderToStaticNodeStream() {
27 - return require('./src/server/ReactDOMLegacyServerNode').renderToStaticNodeStream.apply(
28 - this,
29 - arguments,
30 - );
31 -}
26
27 export function renderToPipeableStream() {
28 return require('./src/server/react-dom-server.node').renderToPipeableStream.apply(
packages/react-dom/src/__tests__/ReactDOMServerIntegrationNewContext-test.js
-91
@@ -324,97 +324,6 @@ describe('ReactDOMServerIntegration', () => {
324 expect(e.textContent).toBe('dark');
325 });
326
327 - it('does not pollute parallel node streams', () => {
328 - const LoggedInUser = React.createContext();
329 -
330 - const AppWithUser = user => (
331 - <LoggedInUser.Provider value={user}>
332 - <header>
333 - <LoggedInUser.Consumer>{whoAmI => whoAmI}</LoggedInUser.Consumer>
334 - </header>
335 - <footer>
336 - <LoggedInUser.Consumer>{whoAmI => whoAmI}</LoggedInUser.Consumer>
337 - </footer>
338 - </LoggedInUser.Provider>
339 - );
340 -
341 - const streamAmy = ReactDOMServer.renderToStaticNodeStream(
342 - AppWithUser('Amy'),
343 - ).setEncoding('utf8');
344 - const streamBob = ReactDOMServer.renderToStaticNodeStream(
345 - AppWithUser('Bob'),
346 - ).setEncoding('utf8');
347 -
348 - // Testing by filling the buffer using internal _read() with a small
349 - // number of bytes to avoid a test case which needs to align to a
350 - // highWaterMark boundary of 2^14 chars.
351 - streamAmy._read(20);
352 - streamBob._read(20);
353 - streamAmy._read(20);
354 - streamBob._read(20);
355 -
356 - expect(streamAmy.read()).toBe('<header>Amy</header><footer>Amy</footer>');
357 - expect(streamBob.read()).toBe('<header>Bob</header><footer>Bob</footer>');
358 - });
359 -
360 - it('does not pollute parallel node streams when many are used', () => {
361 - const CurrentIndex = React.createContext();
362 -
363 - const NthRender = index => (
364 - <CurrentIndex.Provider value={index}>
365 - <header>
366 - <CurrentIndex.Consumer>{idx => idx}</CurrentIndex.Consumer>
367 - </header>
368 - <footer>
369 - <CurrentIndex.Consumer>{idx => idx}</CurrentIndex.Consumer>
370 - </footer>
371 - </CurrentIndex.Provider>
372 - );
373 -
374 - const streams = [];
375 -
376 - // Test with more than 32 streams to test that growing the thread count
377 - // works properly.
378 - const streamCount = 34;
379 -
380 - for (let i = 0; i < streamCount; i++) {
381 - streams[i] = ReactDOMServer.renderToStaticNodeStream(
382 - NthRender(i % 2 === 0 ? 'Expected to be recreated' : i),
383 - ).setEncoding('utf8');
384 - }
385 -
386 - // Testing by filling the buffer using internal _read() with a small
387 - // number of bytes to avoid a test case which needs to align to a
388 - // highWaterMark boundary of 2^14 chars.
389 - for (let i = 0; i < streamCount; i++) {
390 - streams[i]._read(20);
391 - }
392 -
393 - // Early destroy every other stream
394 - for (let i = 0; i < streamCount; i += 2) {
395 - streams[i].destroy();
396 - }
397 -
398 - // Recreate those same streams.
399 - for (let i = 0; i < streamCount; i += 2) {
400 - streams[i] = ReactDOMServer.renderToStaticNodeStream(
401 - NthRender(i),
402 - ).setEncoding('utf8');
403 - }
404 -
405 - // Read a bit from all streams again.
406 - for (let i = 0; i < streamCount; i++) {
407 - streams[i]._read(20);
408 - }
409 -
410 - // Assert that all stream rendered the expected output.
411 - for (let i = 0; i < streamCount; i++) {
412 - expect(streams[i].read()).toBe(
413 - '<header>' + i + '</header><footer>' + i + '</footer>',
414 - );
415 - }
416 - });
417 -
327 it('does not pollute sync renders after an error', () => {
328 const LoggedInUser = React.createContext('default');
329 const Crash = () => {
packages/react-dom/src/__tests__/ReactServerRendering-test.js
-67
@@ -577,73 +577,6 @@ describe('ReactDOMServer', () => {
577 });
578 });
579
580 - describe('renderToStaticNodeStream', () => {
581 - it('should generate simple markup', () => {
582 - const SuccessfulElement = React.createElement(() => <img />);
583 - expect(() => {
584 - const response =
585 - ReactDOMServer.renderToStaticNodeStream(SuccessfulElement);
586 - expect(response.read().toString()).toMatch(new RegExp('<img' + '/>'));
587 - }).toErrorDev(
588 - 'ReactDOMServer.renderToStaticNodeStream() is deprecated and will be removed in an upcomingrelease of React',
589 - {withoutStack: true},
590 - );
591 - });
592 -
593 - it('should handle errors correctly', () => {
594 - const FailingElement = React.createElement(() => {
595 - throw new Error('An Error');
596 - });
597 -
598 - let response;
599 - expect(() => {
600 - response = ReactDOMServer.renderToStaticNodeStream(FailingElement);
601 - }).toErrorDev(
602 - 'ReactDOMServer.renderToStaticNodeStream() is deprecated and will be removed in an upcomingrelease of React',
603 - {withoutStack: true},
604 - );
605 - return new Promise(resolve => {
606 - response.once('error', () => {
607 - resolve();
608 - });
609 - expect(response.read()).toBeNull();
610 - });
611 - });
612 -
613 - it('should omit text and suspense placeholders', async () => {
614 - let resolve = null;
615 - const promise = new Promise(res => {
616 - resolve = () => {
617 - resolved = true;
618 - res();
619 - };
620 - });
621 - let resolved = false;
622 - function Suspender() {
623 - if (resolved) {
624 - return 'resolved';
625 - }
626 - throw promise;
627 - }
628 -
629 - let response;
630 - expect(() => {
631 - response = ReactDOMServer.renderToStaticNodeStream(
632 - <div>
633 - <React.Suspense fallback={'fallback'}>
634 - <Suspender />
635 - </React.Suspense>
636 - </div>,
637 - );
638 - }).toErrorDev(
639 - 'ReactDOMServer.renderToStaticNodeStream() is deprecated and will be removed in an upcomingrelease of React',
640 - {withoutStack: true},
641 - );
642 - await resolve();
643 - expect(response.read().toString()).toEqual('<div>resolved</div>');
644 - });
645 - });
646 -
580 it('warns with a no-op when an async setState is triggered', () => {
581 class Foo extends React.Component {
582 UNSAFE_componentWillMount() {
packages/react-dom/src/server/ReactDOMFizzServerBun.js
+1 -12
@@ -146,15 +146,4 @@ function renderToReadableStream(
146 });
147 }
148
149 -function renderToStaticNodeStream() {
150 - throw new Error(
151 - 'ReactDOMServer.renderToStaticNodeStream(): The Node Stream API is not available ' +
152 - 'in Bun. Use ReactDOMServer.renderToReadableStream() instead.',
153 - );
154 -}
155 -
156 -export {
157 - renderToReadableStream,
158 - renderToStaticNodeStream,
159 - ReactVersion as version,
160 -};
149 +export {renderToReadableStream, ReactVersion as version};
packages/react-dom/src/server/ReactDOMLegacyServerBrowser.js
+1 -13
@@ -39,16 +39,4 @@ function renderToStaticMarkup(
39 );
40 }
41
42 -function renderToStaticNodeStream() {
43 - throw new Error(
44 - 'ReactDOMServer.renderToStaticNodeStream(): The streaming API is not available ' +
45 - 'in the browser. Use ReactDOMServer.renderToStaticMarkup() instead.',
46 - );
47 -}
48 -
49 -export {
50 - renderToString,
51 - renderToStaticMarkup,
52 - renderToStaticNodeStream,
53 - version,
54 -};
42 +export {renderToString, renderToStaticMarkup, version};
packages/react-dom/src/server/ReactDOMLegacyServerNode.js
+1 -7
@@ -10,7 +10,6 @@
10 import type {ReactNodeList} from 'shared/ReactTypes';
11
12 import {version, renderToStringImpl} from './ReactDOMLegacyServerImpl';
13 -import {renderToStaticNodeStream} from './ReactDOMLegacyServerNodeStream';
13
14 type ServerOptions = {
15 identifierPrefix?: string,
@@ -40,9 +39,4 @@ function renderToStaticMarkup(
39 );
40 }
41
43 -export {
44 - renderToString,
45 - renderToStaticMarkup,
46 - renderToStaticNodeStream,
47 - version,
48 -};
42 +export {renderToString, renderToStaticMarkup, version};
packages/react-dom/src/server/ReactDOMLegacyServerNodeStream.js deleted
-107
@@ -1,107 +0,0 @@
1 -/**
2 - * Copyright (c) Meta Platforms, Inc. and affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - *
7 - * @flow
8 - */
9 -
10 -import type {ReactNodeList} from 'shared/ReactTypes';
11 -
12 -import type {Request} from 'react-server/src/ReactFizzServer';
13 -
14 -import {
15 - createRequest,
16 - startWork,
17 - startFlowing,
18 - abort,
19 -} from 'react-server/src/ReactFizzServer';
20 -
21 -import {
22 - createResumableState,
23 - createRenderState,
24 - createRootFormatContext,
25 -} from 'react-dom-bindings/src/server/ReactFizzConfigDOMLegacy';
26 -
27 -import {Readable} from 'stream';
28 -
29 -type ServerOptions = {
30 - identifierPrefix?: string,
31 -};
32 -
33 -class ReactMarkupReadableStream extends Readable {
34 - request: Request;
35 - startedFlowing: boolean;
36 - constructor() {
37 - // Calls the stream.Readable(options) constructor. Consider exposing built-in
38 - // features like highWaterMark in the future.
39 - super({});
40 - this.request = (null: any);
41 - this.startedFlowing = false;
42 - }
43 -
44 - // $FlowFixMe[missing-local-annot]
45 - _destroy(err, callback) {
46 - abort(this.request);
47 - callback(err);
48 - }
49 -
50 - // $FlowFixMe[missing-local-annot]
51 - _read(size) {
52 - if (this.startedFlowing) {
53 - startFlowing(this.request, this);
54 - }
55 - }
56 -}
57 -
58 -function onError() {
59 - // Non-fatal errors are ignored.
60 -}
61 -
62 -let didWarnAboutDeprecatedRenderToStaticNodeStream = false;
63 -
64 -function renderToStaticNodeStream(
65 - children: ReactNodeList,
66 - options?: ServerOptions,
67 -): Readable {
68 - if (__DEV__) {
69 - if (!didWarnAboutDeprecatedRenderToStaticNodeStream) {
70 - didWarnAboutDeprecatedRenderToStaticNodeStream = true;
71 - console.error(
72 - 'ReactDOMServer.renderToStaticNodeStream() is deprecated and will be removed in an upcoming' +
73 - 'release of React. Use ReactDOMServer.renderToPipeableStream() and wait to `pipe` until the `onAllReady`' +
74 - ' callback has been called to produce a document suitable for static use cases.',
75 - );
76 - }
77 - }
78 -
79 - function onAllReady() {
80 - // We wait until everything has loaded before starting to write.
81 - // That way we only end up with fully resolved HTML even if we suspend.
82 - destination.startedFlowing = true;
83 - startFlowing(request, destination);
84 - }
85 - const destination = new ReactMarkupReadableStream();
86 - const resumableState = createResumableState(
87 - options ? options.identifierPrefix : undefined,
88 - undefined,
89 - );
90 - const request = createRequest(
91 - children,
92 - resumableState,
93 - createRenderState(resumableState, true),
94 - createRootFormatContext(),
95 - Infinity,
96 - onError,
97 - onAllReady,
98 - undefined,
99 - undefined,
100 - undefined,
101 - );
102 - destination.request = request;
103 - startWork(request);
104 - return destination;
105 -}
106 -
107 -export {renderToStaticNodeStream};
packages/react-dom/src/server/react-dom-server.bun.stable.js
+1 -5
@@ -7,8 +7,4 @@
7 * @flow
8 */
9
10 -export {
11 - renderToReadableStream,
12 - renderToStaticNodeStream,
13 - version,
14 -} from './ReactDOMFizzServerBun.js';
10 +export {renderToReadableStream, version} from './ReactDOMFizzServerBun.js';