From ef280beda68c86efc14e667c09d19f44679f2a9f Mon Sep 17 00:00:00 2001 From: Andrew Clark Date: Fri, 27 Sep 2019 22:50:14 -0700 Subject: [PATCH 1/2] Regression test: Suspense + hydration + legacy --- .../__tests__/ReactServerRenderingHydration-test.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/react-dom/src/__tests__/ReactServerRenderingHydration-test.js b/packages/react-dom/src/__tests__/ReactServerRenderingHydration-test.js index 33e56bba260e..1707f9f1dbdc 100644 --- a/packages/react-dom/src/__tests__/ReactServerRenderingHydration-test.js +++ b/packages/react-dom/src/__tests__/ReactServerRenderingHydration-test.js @@ -659,4 +659,15 @@ describe('ReactDOMServerHydration', () => { document.body.removeChild(parentContainer); }); + + it('regression test: Suspense + hydration in legacy mode ', () => { + const element = document.createElement('div'); + element.innerHTML = '
Hello World
'; + ReactDOM.hydrate( + +
Hello World
+
, + element, + ); + }); }); From 15ee6cabba5f44082f60b863dcb97b9e69311d6a Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Sat, 28 Sep 2019 10:32:11 -0700 Subject: [PATCH 2/2] Allow Suspense Mismatch on the Client to Silently Proceed This fixes but isn't actually the semantics that we want this case to have. --- .../react-reconciler/src/ReactFiberHydrationContext.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/react-reconciler/src/ReactFiberHydrationContext.js b/packages/react-reconciler/src/ReactFiberHydrationContext.js index 018a80886e6e..61f007daca25 100644 --- a/packages/react-reconciler/src/ReactFiberHydrationContext.js +++ b/packages/react-reconciler/src/ReactFiberHydrationContext.js @@ -404,11 +404,10 @@ function skipPastDehydratedSuspenseInstance( let suspenseState: null | SuspenseState = fiber.memoizedState; let suspenseInstance: null | SuspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null; - invariant( - suspenseInstance, - 'Expected to have a hydrated suspense instance. ' + - 'This error is likely caused by a bug in React. Please file an issue.', - ); + if (suspenseInstance === null) { + // This Suspense boundary was hydrated without a match. + return nextHydratableInstance; + } return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance); }