From 51e017c523fe37489f8b5c9d75bb3a7a2dc7f2c8 Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Wed, 22 Sep 2021 12:31:17 -0400 Subject: [PATCH] Revert "[Old server renderer] Retry error on client (#22399)" Going to revert this until we figure out error reporting. It looks like our downstream infra already supports some type of error recovery so we might not need it here. --- ...DOMServerPartialHydration-test.internal.js | 28 --------------- .../ReactDOMServerSuspense-test.internal.js | 14 -------- .../src/server/ReactPartialRenderer.js | 35 +++++++------------ 3 files changed, 12 insertions(+), 65 deletions(-) diff --git a/packages/react-dom/src/__tests__/ReactDOMServerPartialHydration-test.internal.js b/packages/react-dom/src/__tests__/ReactDOMServerPartialHydration-test.internal.js index b8f7ac48a5..9f954f4581 100644 --- a/packages/react-dom/src/__tests__/ReactDOMServerPartialHydration-test.internal.js +++ b/packages/react-dom/src/__tests__/ReactDOMServerPartialHydration-test.internal.js @@ -2671,32 +2671,4 @@ describe('ReactDOMServerPartialHydration', () => { expect(ref.current).toBe(span); expect(ref.current.innerHTML).toBe('Hidden child'); }); - - it('should retry on client if something throws', async () => { - let isServer = true; - function ThrowsOnServerOnly() { - if (isServer) { - throw new Error('Oops!'); - } - return 'Yay!'; - } - - function App() { - return ( - - - - ); - } - - const element = document.createElement('div'); - element.innerHTML = ReactDOMServer.renderToString(); - expect(element.textContent).toBe('Loading...'); - - isServer = false; - await act(async () => { - ReactDOM.hydrateRoot(element, ); - }); - expect(element.textContent).toBe('Yay!'); - }); }); diff --git a/packages/react-dom/src/__tests__/ReactDOMServerSuspense-test.internal.js b/packages/react-dom/src/__tests__/ReactDOMServerSuspense-test.internal.js index 54ebc459a9..60ab2edbdc 100644 --- a/packages/react-dom/src/__tests__/ReactDOMServerSuspense-test.internal.js +++ b/packages/react-dom/src/__tests__/ReactDOMServerSuspense-test.internal.js @@ -115,20 +115,6 @@ describe('ReactDOMServerSuspense', () => { expect(getVisibleChildren(c)).toEqual(
Fallback
); }); - it('should render the fallback when an error is thrown', async () => { - function Throws() { - throw new Error('Oops!'); - } - const c = await serverRender( -
- }> - - -
, - ); - expect(getVisibleChildren(c)).toEqual(
Fallback
); - }); - it('should work with nested suspense components', async () => { const c = await serverRender(
diff --git a/packages/react-dom/src/server/ReactPartialRenderer.js b/packages/react-dom/src/server/ReactPartialRenderer.js index 387db4ca0b..caf1ee2f6f 100644 --- a/packages/react-dom/src/server/ReactPartialRenderer.js +++ b/packages/react-dom/src/server/ReactPartialRenderer.js @@ -969,33 +969,22 @@ class ReactDOMServerRenderer { try { outBuffer += this.render(child, frame.context, frame.domNamespace); } catch (err) { - if (enableSuspenseServerRenderer) { - if (this.suspenseDepth > 0) { - // Regardless of whether this is an error or a suspense thenable, - // trigger the nearest Suspense boundary. We'll try to render this - // tree again on the client. + if (err != null && typeof err.then === 'function') { + if (enableSuspenseServerRenderer) { + invariant( + this.suspenseDepth > 0, + // TODO: include component name. This is a bit tricky with current factoring. + 'A React component suspended while rendering, but no fallback UI was specified.\n' + + '\n' + + 'Add a component higher in the tree to ' + + 'provide a loading indicator or placeholder to display.', + ); suspended = true; } else { - // Missing a Suspense boundary. This is a fatal error. - if (err != null && typeof err.then === 'function') { - invariant( - false, - // TODO: include component name. This is a bit tricky with current factoring. - 'A React component suspended while rendering, but no fallback UI was specified.\n' + - '\n' + - 'Add a component higher in the tree to ' + - 'provide a loading indicator or placeholder to display.', - ); - } else { - throw err; - } + invariant(false, 'ReactDOMServer does not yet support Suspense.'); } } else { - if (err != null && typeof err.then === 'function') { - invariant(false, 'ReactDOMServer does not yet support Suspense.'); - } else { - throw err; - } + throw err; } } finally { if (__DEV__) {