From dfb2dd6d73108f7a61cea93cb2a8a8806907d498 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 28 Sep 2017 18:25:56 +0200 Subject: [PATCH 1/5] Revert "Keep some buffered pages, that won't be disposed. Fix #1939 (#2592)" This reverts commit 36436122f27158cf3641efb47c95d3ccd6e77f96. From 82aeb92906ee9dee465dec4fd32d5e090b7c7258 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 28 Sep 2017 18:25:56 +0200 Subject: [PATCH 2/5] Revert "Add beta installation instruction" This reverts commit 418cc210fab3a49820ac2781c184397a4c8a02f4. From 45b2465ec893c700bb8e24043207da254be67dae Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 28 Sep 2017 18:25:56 +0200 Subject: [PATCH 3/5] Revert "4.0.0-beta.1" This reverts commit c2d98e2b797ed8ad7a01d2aeeca986a132408bc8. From a00cf05702d97493e20864d1c2594b580414d7ae Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 28 Sep 2017 18:25:56 +0200 Subject: [PATCH 4/5] Revert "Treat navigation to empty hash as hash navigate (#2971)" This reverts commit c6bd6ef9973b935df116eaafec1cd57555aa1b93. From 92b5d5739909d63be6e9e752347035ed4ba09e03 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 28 Sep 2017 18:25:56 +0200 Subject: [PATCH 5/5] Revert "React 16 (fiber) (#2996)" This reverts commit d19cc975f4be6bf1d1ef205950b5749f5e735d78. --- client/index.js | 6 +++--- client/next-dev.js | 15 +++++++++++++++ lib/app.js | 12 ------------ package.json | 8 ++++---- test/integration/basic/test/rendering.js | 4 ++-- 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/client/index.js b/client/index.js index 9d13179152968..b497414d90c8a 100644 --- a/client/index.js +++ b/client/index.js @@ -123,9 +123,9 @@ export async function renderError (error) { if (prod) { const initProps = { err: error, pathname, query, asPath } const props = await loadGetInitialProps(ErrorComponent, initProps) - ReactDOM.hydrate(createElement(ErrorComponent, props), errorContainer) + ReactDOM.render(createElement(ErrorComponent, props), errorContainer) } else { - ReactDOM.hydrate(createElement(ErrorDebugComponent, { error }), errorContainer) + ReactDOM.render(createElement(ErrorDebugComponent, { error }), errorContainer) } } @@ -151,7 +151,7 @@ async function doRender ({ Component, props, hash, err, emitter }) { // We need to clear any existing runtime error messages ReactDOM.unmountComponentAtNode(errorContainer) - ReactDOM.hydrate(createElement(App, appProps), appContainer) + ReactDOM.render(createElement(App, appProps), appContainer) if (emitter) { emitter.emit('after-reactdom-render', { Component, ErrorComponent }) diff --git a/client/next-dev.js b/client/next-dev.js index 52ba3ad07f21c..c5816fbd85fbc 100644 --- a/client/next-dev.js +++ b/client/next-dev.js @@ -1,4 +1,5 @@ import 'react-hot-loader/patch' +import ReactReconciler from 'react-dom/lib/ReactReconciler' import initOnDemandEntries from './on-demand-entries-client' import initWebpackHMR from './webpack-hot-middleware-client' @@ -34,3 +35,17 @@ next.default() .catch((err) => { console.error(`${err.message}\n${err.stack}`) }) + +// This is a patch to catch most of the errors throw inside React components. +const originalMountComponent = ReactReconciler.mountComponent +ReactReconciler.mountComponent = function (...args) { + try { + return originalMountComponent(...args) + } catch (err) { + if (!err.abort) { + next.renderError(err) + err.abort = true + } + throw err + } +} diff --git a/lib/app.js b/lib/app.js index 43660a1318f47..b4b8c833f2f12 100644 --- a/lib/app.js +++ b/lib/app.js @@ -5,10 +5,6 @@ import { warn } from './utils' import { makePublicRouterInstance } from './router' export default class App extends Component { - state = { - hasError: null - } - static childContextTypes = { headManager: PropTypes.object, router: PropTypes.object @@ -22,15 +18,7 @@ export default class App extends Component { } } - componentDidCatch (error, info) { - error.stack = `${error.stack}\n\n${info.componentStack}` - window.next.renderError(error) - this.setState({ hasError: true }) - } - render () { - if (this.state.hasError) return null - const { Component, props, hash, router } = this.props const url = createUrl(router) // If there no component exported we can't proceed. diff --git a/package.json b/package.json index 3c161dc8f760a..092be2607fd1f 100644 --- a/package.json +++ b/package.json @@ -127,15 +127,15 @@ "node-notifier": "5.1.2", "nyc": "11.2.1", "portfinder": "1.0.13", - "react": "16.0.0", - "react-dom": "16.0.0", + "react": "15.5.4", + "react-dom": "15.5.4", "standard": "9.0.2", "taskr": "1.1.0", "wd": "1.4.1" }, "peerDependencies": { - "react": "^16.0.0", - "react-dom": "^16.0.0" + "react": "^15.5.4", + "react-dom": "^15.5.4" }, "jest": { "testEnvironment": "node", diff --git a/test/integration/basic/test/rendering.js b/test/integration/basic/test/rendering.js index db824b8116c26..695c5b807437f 100644 --- a/test/integration/basic/test/rendering.js +++ b/test/integration/basic/test/rendering.js @@ -11,7 +11,7 @@ export default function ({ app }, suiteName, render) { describe(suiteName, () => { test('renders a stateless component', async () => { const html = await render('/stateless') - expect(html.includes('')).toBeTruthy() + expect(html.includes('')).toBeTruthy() expect(html.includes('My component!')).toBeTruthy() }) @@ -23,7 +23,7 @@ export default function ({ app }, suiteName, render) { test('header helper renders header information', async () => { const html = await (render('/head')) - expect(html.includes('')).toBeTruthy() + expect(html.includes('')).toBeTruthy() expect(html.includes('')).toBeTruthy() expect(html.includes('I can haz meta tags')).toBeTruthy() })