1
0
Fork 0
mirror of https://github.com/terribleplan/next.js.git synced 2024-01-19 02:48:18 +00:00

Apollo example: avoid double render in browser (#4734)

Apollo's getDataFromTree is supposed to be called during the server side rendering.
Being called in browser it fires an unnecessary fake render process and blocks components from rendering with loading=true.

Also there was a mistake in this code:

    // `getDataFromTree` renders the component first, the client is passed off as a property.
    // After that rendering is done using Next's normal rendering pipeline
    this.apolloClient = props.apolloClient || initApollo(props.apolloState.data)

**Apollo** component is not rendered by getDataFromTree actually, it renders the **App** directly, thus props.apolloClient will always be undefined.

This example was discussed here: https://github.com/zeit/next.js/issues/387.
This commit is contained in:
NikitaVlaznev 2018-07-05 21:49:23 +03:00 committed by Tim Neutkens
parent 498f37e33f
commit 728871b005

View file

@ -18,6 +18,7 @@ export default (App) => {
// Run all GraphQL queries in the component tree // Run all GraphQL queries in the component tree
// and extract the resulting data // and extract the resulting data
const apollo = initApollo() const apollo = initApollo()
if (!process.browser) {
try { try {
// Run all GraphQL queries // Run all GraphQL queries
await getDataFromTree( await getDataFromTree(
@ -36,14 +37,15 @@ export default (App) => {
console.error('Error while running `getDataFromTree`', error) console.error('Error while running `getDataFromTree`', error)
} }
if (!process.browser) {
// getDataFromTree does not call componentWillUnmount // getDataFromTree does not call componentWillUnmount
// head side effect therefore need to be cleared manually // head side effect therefore need to be cleared manually
Head.rewind() Head.rewind()
}
// Extract query data from the Apollo store // Extract query data from the Apollo store
apolloState.data = apollo.cache.extract() apolloState.data = apollo.cache.extract()
} else {
apolloState.data = {}
}
return { return {
...appProps, ...appProps,
@ -53,9 +55,7 @@ export default (App) => {
constructor (props) { constructor (props) {
super(props) super(props)
// `getDataFromTree` renders the component first, the client is passed off as a property. this.apolloClient = initApollo(props.apolloState.data)
// After that rendering is done using Next's normal rendering pipeline
this.apolloClient = props.apolloClient || initApollo(props.apolloState.data)
} }
render () { render () {